我有这个句子:'Johnny Johnny yes papa'
,我想计算每个单词下一个单词的频率。在这种情况下,我把句子变成了循环:
sentence = 'Johnny Johnny yes papa'
sentence = sentence.split()
sentence.append(sentence[0])
现在句子是['Johnny','Johnny','yes','papa','Johnny']
我用这种方式创建双引号:
def to_bigrams(my_list):
bigrams = [(my_list[i],my_list[i+1]) for i,element in enumerate(my_list) if i<len(my_list)-1]
return bigrams
my_bigrams = to_bigrams(sentence)
现在我的双引号是:[('Johnny', 'Johnny'), ('Johnny', 'yes'), ('yes', 'papa'), ('papa', 'Johnny')]
现在,例如Johnny
有两个结果:Johnny
和yes
,yes
只有一个结果,即papa
,papa
只有一个结果,即Johnny
,所以预期的字典是:
{'Johnny':['Johnny','yes'],'yes':['papa'],'papa':['Johnny']}
我已经试过了:
my_freq_dict = {my_bigrams[i][0]:my_bigrams[i][j] for i,element in enumerate(my_bigrams) for j in range(len(my_bigrams))}
但是我得到这个错误:IndexError: tuple index out of range
。我的逻辑有点问题,你能帮帮我吗?
使用dict.setdefault
:
my_bigrams = [('Johnny', 'Johnny'), ('Johnny', 'yes'), ('yes', 'papa'), ('papa', 'Johnny')]
d = {}
for v1, v2 in my_bigrams:
d.setdefault(v1, []).append(v2)
d
输出:
{'Johnny': ['Johnny', 'yes'], 'yes': ['papa'], 'papa': ['Johnny']}
您正在创建错误,因为您使用的是len(my_bigrams)
而不是len(element)
。
修复它,然而,不会产生预期的输出,因为一些键出现不止一次,因此将被最新的条目覆盖(这就是dict
要做的)。
可以使用itertools.groupby
from itertools import groupby
res = {key: [x[1] for x in group]for key, group in groupby(sorted(data, key=lambda x: x[0]), key= lambda x: x[0])}
print(res)
输出:
{'Johnny': ['Johnny', 'yes'], 'yes': ['papa'], 'papa': ['Johnny']}