我有一个数据集如下:
"485","AlterNet","Statistics","Estimation","Narnia","Two and half men"
"717","I like Sheen", "Narnia", "Statistics", "Estimation"
"633","MachineLearning","AI","I like Cars, but I also like bikes"
"717","I like Sheen","MachineLearning", "regression", "AI"
"136","MachineLearning","AI","TopGear"
等等
我想找出最常出现的词对
^{pr2}$两个词之间的距离可以是任意两个
有人能用python提出一个可能的解决方案吗?这是一个非常大的数据集。在
如有任何建议,我们将不胜感激
所以这就是我根据@275365的建议尝试的
@275365我用从文件中读取的输入尝试了以下操作
def collect_pairs(file):
pair_counter = Counter()
for line in open(file):
unique_tokens = sorted(set(line))
combos = combinations(unique_tokens, 2)
pair_counter += Counter(combos)
print pair_counter
file = ('myfileComb.txt')
p=collect_pairs(file)
文本文件的行数与原始文件相同,但在特定行中只有唯一的标记。我不知道我做错了什么,因为当我运行这个程序时,它将单词拆分成字母,而不是将输出作为单词的组合。当我运行这个文件时,它输出拆分的字母,而不是预期的单词组合。我不知道我哪里出错了。在
根据你的语料库有多大,你可以从下面这样开始:
结果是:
^{pr2}$你想不想把数字包括在这些组合中?因为你没有特别提到排除它们,所以我把它们包括在这里。在
编辑:使用文件对象
您在上面第一次尝试时发布的函数非常接近工作。您只需将每行(字符串)更改为元组或列表。假设您的数据看起来与上面发布的数据完全相同(每个术语前后都有引号和逗号分隔),我建议一个简单的修复方法:您可以使用
ast.literal_eval
。(否则,您可能需要使用某种类型的正则表达式。)请参阅下面的内容,以获得带有ast.literal_eval
的修改版本:现在可以这样测试:
除了数所有的对,你没什么可做的。在
明显的优化是尽早删除重复的单词和同义词,执行词干分析(任何减少不同标记数的方法都是好的!),并且只计算对},但不能两者都有!)。在
(a,b)
,其中a<b
(在您的示例中,只有countstatistics,narnia
,或{如果内存不足,请执行两次传递。在第一个过程中,使用一个或多个哈希函数来获取候选筛选器。在第二个过程中,只计算通过这个过滤器的单词(MinHash/LSH样式过滤)。在
这是一个简单的并行问题,因此也很容易将其分发到多个线程或计算机上。在
相关问题 更多 >
编程相关推荐