我有一个大的文本字符串,我想创建一个字典,其中一个键=一对单词(必须通过所有可能的组合)在字符串中,值=一对给定单词的频率。因此,它是一个二维矩阵,每个矩阵元素是一个数字(一对的频率,一列和一行相互交叉。对中的单词的位置是无关紧要的:例如,如果骑车= 4(一个频率)然后bikeride = 4
最终结果是填充矩阵,然后选择N个顶对。
我是新工作的文本字符串和一般的Python,我无可救药地丢失(在我的“代码”中也有太多的循环)
这就是我所拥有的(在删除停用词和标点后):
textNP = 'stopped traffic bklyn bqe 278 wb manhattan brtillary stx29 wb cadman pla hope oufootball makes safe manhattan kansas tomorrow boomersooner beatwildcats theyhateuscuztheyaintus hatersgonnahate rt bringonthecats bring cats exclusive live footage oklahoma trying get manhattan http colktsoyzvvz rt jonfmorse bring cats exclusive live footage oklahoma trying get manhattan'
一些代码(不完整和错误):
txtU = set(textNP)
lntxt = len(textNP)
lntxtS = len(txtU)
matrixNP = {}
for b1, i1 in txtU:
for b2, i2 in txtU:
if i1< i2:
bb1 = b1+b2
bb2 = b2+b1
freq = 0
for k in textNP:
for j in textNP:
if k < j:
kj = k+j
if kj == bb1 | kj == bb2:
freq +=1
matrixNP[i1][i2] = freq
matrixNP[i2][i1] = freq
elif i1 == i2: matrixNP[i1][i1] = 1
我确定有很多循环的问题之一是错误的。另外,我不知道如何将计算出的密钥(单词串联)分配给字典(我认为我正确地得到了值)
文本字符串不是完整的产品:它将使用各种正则表达式从数字和其他一些东西中清除
非常感谢您的帮助!
答案 0 :(得分:1)
您是否正在寻找2个单词的所有组合,如果是这样,您可以使用itertools.combinations
和collections.Counter
来执行您想要的操作:
>>> from itertools import combinations
>>> from collections import Counter
>>> N = 5
>>> c = Counter(tuple(sorted(a)) for a in combinations(textNP.split(), 2))
>>> c.most_common(N)
[(('manhattan', 'rt'), 8),
(('exclusive', 'manhattan'), 8),
(('footage', 'manhattan'), 8),
(('manhattan', 'oklahoma'), 8),
(('bring', 'manhattan'), 8)]
或者您正在寻找所有连续单词对,然后您可以创建成对函数:
>>> from itertools import tee
>>> from collections import Counter
>>> def pairwise(iterable):
... a, b = tee(iterable)
... next(b, None)
... return zip(a, b) # itertools.izip() in python2
>>> N = 5
>>> c = Counter(tuple(sorted(a)) for a in pairwise(textNP.split()))
>>> c.most_common(N)
[(('get', 'manhattan'), 2),
(('footage', 'live'), 2),
(('get', 'trying'), 2),
(('bring', 'cats'), 2),
(('exclusive', 'live'), 2)]
我没有看到列表中的自行车骑行。