<p>根据你的语料库有多大,你可以从下面这样开始:</p>
<pre><code>>>> 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
</code></pre>
<p>结果是:</p>
^{pr2}$
<p>你想不想把数字包括在这些组合中?因为你没有特别提到排除它们,所以我把它们包括在这里。在</p>
<p><strong>编辑:使用文件对象</strong></p>
<p>您在上面第一次尝试时发布的函数非常接近工作。您只需将每行(字符串)更改为元组或列表。假设您的数据看起来与上面发布的数据完全相同(每个术语前后都有引号和逗号分隔),我建议一个简单的修复方法:您可以使用<code>ast.literal_eval</code>。(否则,您可能需要使用某种类型的正则表达式。)请参阅下面的内容,以获得带有<code>ast.literal_eval</code>的修改版本:</p>
<pre><code>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
</code></pre>
<p>现在可以这样测试:</p>
<pre><code>file_name = 'myfileComb.txt'
p = collect_pairs(file_name)
print p.most_common(10) # for example
</code></pre>