DeBug记录:'dict_keys' object is not subscriptable

问题背景

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

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

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

DeBug记录:'dict_keys' object is not subscriptable_第1张图片

错误分析

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

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

DeBug记录:'dict_keys' object is not subscriptable_第2张图片

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

解决方法

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

list(vocabulary1)[:50]

此时结果如下:

DeBug记录:'dict_keys' object is not subscriptable_第3张图片

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

2020年3月22日更新:

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

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

结果如下:

DeBug记录:'dict_keys' object is not subscriptable_第4张图片

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

你可能感兴趣的:(DeBug)