如何使用python查找文件中最频繁出现的单词对集?

2024-10-01 19:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集如下:

"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)

文本文件的行数与原始文件相同,但在特定行中只有唯一的标记。我不知道我做错了什么,因为当我运行这个程序时,它将单词拆分成字母,而不是将输出作为单词的组合。当我运行这个文件时,它输出拆分的字母,而不是预期的单词组合。我不知道我哪里出错了。在


Tags: 数据counter单词建议ailikefilecollect
2条回答

根据你的语料库有多大,你可以从下面这样开始:

>>> from itertools import combinations
>>> from collections import Counter

>>> def collect_pairs(lines):
    pair_counter = Counter()
    for line in lines:
        unique_tokens = sorted(set(line))  # exclude duplicates in same line and sort to ensure one word is always before other
        combos = combinations(unique_tokens, 2)
        pair_counter += Counter(combos)
    return pair_counter

结果是:

^{pr2}$

你想不想把数字包括在这些组合中?因为你没有特别提到排除它们,所以我把它们包括在这里。在

编辑:使用文件对象

您在上面第一次尝试时发布的函数非常接近工作。您只需将每行(字符串)更改为元组或列表。假设您的数据看起来与上面发布的数据完全相同(每个术语前后都有引号和逗号分隔),我建议一个简单的修复方法:您可以使用ast.literal_eval。(否则,您可能需要使用某种类型的正则表达式。)请参阅下面的内容,以获得带有ast.literal_eval的修改版本:

from itertools import combinations
from collections import Counter
import ast

def collect_pairs(file_name):
    pair_counter = Counter()
    for line in open(file_name):  # these lines are each simply one long string; you need a list or tuple
        unique_tokens = sorted(set(ast.literal_eval(line)))  # eval will convert each line into a tuple before converting the tuple to a set
        combos = combinations(unique_tokens, 2)
        pair_counter += Counter(combos)
    return pair_counter  # return the actual Counter object

现在可以这样测试:

file_name = 'myfileComb.txt'
p = collect_pairs(file_name)
print p.most_common(10)  # for example

除了数所有的对,你没什么可做的。在

明显的优化是尽早删除重复的单词和同义词,执行词干分析(任何减少不同标记数的方法都是好的!),并且只计算对(a,b),其中a<b(在您的示例中,只有count statistics,narnia,或{},但不能两者都有!)。在

如果内存不足,请执行两次传递。在第一个过程中,使用一个或多个哈希函数来获取候选筛选器。在第二个过程中,只计算通过这个过滤器的单词(MinHash/LSH样式过滤)。在

这是一个简单的并行问题,因此也很容易将其分发到多个线程或计算机上。在

相关问题 更多 >

    热门问题