DeBug记录:'dict_keys' object is not subscriptable

问题背景

学习《python自然语言处理》这本书的时候,有如下代码

>>> fdist1 = FreqDist(text1)
>>> vocabulary1 = fdist1.keys()
>>> vocabulary1[:50]

按照讲解,最后一段代码应当输出text1文本中前50个出现频率最高的词汇,然后实际允许时,结果如下:

错误分析

错误信息的字面意思是说,这是一个类型错误,‘dict_keys’类型的对象不能进行索引操作。

由于我是刚接触自然语言处理中的nltk,不了解这个数据类型都有哪些操作,而且家里的网也实在是一言难尽上不去NLTK的官网,不过可以先看一下vocabulary1这个变量的内容

从输出结果上看,这个变量类型是小括号包着中括号,类似于:(['a', 'b', 'c']),这并不是一个列表,所以不能进行索引操作。至于产生这个错误的原因,有推测是版本不同导致的,《python自然语言处理》这本书使用的还是python2,而且使用的nltk版本也是2.0,很有可能之前生成的vocabulary1变量类型是列表类型。

解决方法

了解问题原因之后,一个简单可行的解决方法就是通过类型转换,将vocabulary1转为list类型,代码如下

list(vocabulary1)[:50]

此时结果如下:

----------------------------------------

2020年3月22日更新:

在nltk3.0版本中,不再使用切片的方法获取前50个,而是让FreqDist对象调用most_commom()方法

>>> fdist1 = FreqDist(text1)
>>> fdist1.most_common(50)

结果如下:

返回结果类型是list,可以使用类似于访问数组那样的括号访问特定位置的元素值。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值