python中重元列表中单词的频率和下一个单词



我有这个句子:'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有两个结果:Johnnyyes,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']}

最新更新