使用 NLTK 模块将列表作为输入的双字母组

Bigrams with list as input using NLTK module

我有以下列表,我想获得其中的等价物,但重新排列为双字母组:

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

然后,在应用 bigrams() 函数时,如下所示:

list(bigrams(filtered_words))

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

我也试过list(bigrams([filtered_words])),结果一样。

您可能会收到此信息的一个原因是您使用了保留名称 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 现在是一个列表,这就是为什么将它作为函数调用 returns 的错误,表明 它不可调用 。这是使用 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?')]