2014-01-16 37 views
1

我有文本的语料库:含有各种句子和段落文件追加共同occurence键值

这里是我的代码:

import re 
import nltk 
from nltk.tokenize import RegexpTokenizer 
import math 
from collections import Counter 
with open("descriptionsample.tsv", "r") as openfile: 
frequency = Counter() 
stopwords = nltk.corpus.stopwords.words('english') 
tokenizer = RegexpTokenizer("[\w’]+", flags=re.UNICODE) 
for line in openfile: 
    words = line.lower().strip() 
    words=re.sub(r'[0-9]|\~|\`|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\{|\[|\}|\]|\\|\<|\,|\<|\.|\>|\?|\/|\;|\:', '',words).replace('-',' ') 
    tokens = tokenizer.tokenize(words) 
    tokens = [token for token in tokens if token not in stopwords] 
    frequency.update(tokens) 

我的结果是在一个柜台格式

{'code':32344,'sql':2123,'chicago':1233...........} etc. 

但假设由文档的第一行执行的字频度的结果为:

{'code':10,'sql':3,'python':2........} 

我想要做的是创建一个文件(而不是二元/三元组等)的元组共现矩阵,然后收集最后的总和。基本上将每个键的计数附加到由Key1,Key2创建的新创建的元组:Key2的值。 key2甚至可以是key1。

所以在TSV文件的每一行统计词频后,我希望通过线结果是这个样子:

{('code','code'):10,('code','sql)':3,('code','python'):2,('sql,'code'):10,('sql','sql'):3,('sql','python'):2,('python','code'):10,('python','sql'):3,('python','python'):2} 

我无法弄清楚。任何帮助?也许我会忽略其他一些能自己做到这一点的图书馆。

回答

0

一位同事为我弄明白了。我最初尝试了嵌套字典的层和层,但遍历它将是一场噩梦。因此,这是一个更简单,更高效的解决我的问题:

doc2= { 
'a': 1, 
'b': 2, 
'c': 3, 
'd': 4, 
'e': 5 
} 

res = {} 

for key1 in doc2.keys(): 
    for key2 in doc2.keys(): 
     if key1 != key2: 
      res[(key1, key2)] = doc2[key2] 


for key in res: 
    print("[{}, {}] = {}".format(key[0], key[1], res[key])) 

结果:

[b, c] = 3 
[d, a] = 1 
[b, a] = 1 
[d, c] = 3 
[e, d] = 4 
[c, d] = 4 
[d, e] = 5 
[c, e] = 5 
[e, c] = 3 
[c, a] = 1 
[a, d] = 4 
[e, b] = 2 
[a, e] = 5 
[d, b] = 2 
[c, b] = 2 
[a, b] = 2 
[e, a] = 1 
[b, e] = 5 
[a, c] = 3 
[b, d] = 4