python - 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
有两个结果: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
是打算做的)。
推荐阅读
- javascript - sockJS 自己的事件名称
- sql - 有人可以帮我理解为什么这会产生 SQL 错误
- c++ - 将图标资源(不包括重复的)保存到磁盘
- javascript - aws lambda:测试事件配置:JSON 事件中的错误
- android - content_main.xml 文件在开头和结尾添加 ScrollView 时崩溃
- c# - CodedUI - Chrome 浏览器中的 Windows 身份验证
- ionic-framework - 如何禁用背景菜单关闭 - Ionic 3
- json - JSON.parse SyntaxError 在同一个键上有多个值
- c# - 参数类型的路由约束参考 - 长列表
- python - Python:搜索长字符串是否在字符串列表中的最快方法