使用NLTK模块将列表作为输入的Bigrams

时间:2015-02-23 15:00:30

标签: python nltk

我有以下列表,我希望获得相同但重新排列的双字母组合:

filtered_words = ['friends', 'friend, 'know', 'hate', 'love', 'you?', 'like', 'name?']

然后,当应用bigrams() - 函数时,采用以下方式:

list(bigrams(filtered_words))

我得到:'list' object is not callable.

我也尝试了list(bigrams([filtered_words])),结果相同。

1 个答案:

答案 0 :(得分:0)

您可能会得到这个的一个原因是您使用保留名称bigrams作为列表。例如,请参阅以下代码。

In [9]: bigrams = [bigram for bigram in bigrams(filtered_words)]

In [10]: bigrams(filtered_words)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-32c8287373b9> in <module>()
----> 1 bigrams(filtered_words)

TypeError: 'list' object is not callable

这会产生冲突,因为导入bigrams时没有引用其命名空间,然后被分配了另一个值,这会在程序再次被调用时混淆。当然,bigrams现在是一个列表,这就是为什么将它作为函数调用会返回一个错误,该错误表示它不可调用。使用from nltk import *之类时,这是一个常见错误。

此外,即使您导入整个命名空间,也避免将变量命名为与您正在使用或将要使用的函数相同的名称。这是糟糕的编程。

TLDR:正确导入命名空间或使用其他变量名称或只执行两者。以下应该可以正常工作。

In [11]: import nltk

In [12]: bigrams_list = [bigram for bigram in nltk.bigrams(filtered_words)]

In [13]: bigrams_list
Out[13]: 
[('friends', 'friend'),
 ('friend', 'know'),
 ('know', 'hate'),
 ('hate', 'love'),
 ('love', 'you?'),
 ('you?', 'like'),
 ('like', 'name?')]