首页 > 解决方案 > 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。请问我的逻辑有问题,你能帮帮我吗?

标签: python

解决方案


一种使用方式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是打算做的)。


推荐阅读