'generator'类型的对象没有len()

Vis*_*rde 9 python nltk

我刚刚开始学习python.我想在NLTK中编写一个程序,将文本分成unigrams,bigrams.例如,如果输入文本是:

"由于错误,我感到悲伤和失望"

函数应该生成如下文本:

我 - >感觉 - >感到难过 - >悲伤和 - >和失望 - >失望到期 - >由于 - >错误

我编写了代码来输入文本到程序中.这是我正在尝试的功能:

def gen_bigrams(text):
    token = nltk.word_tokenize(review)
    bigrams = ngrams(token, 2)
    #print Counter(bigrams)
    bigram_list = ""
    for x in range(0, len(bigrams)):
        words = bigrams[x]
        bigram_list = bigram_list + words[0]+ " " + words[1]+"-->"
    return bigram_list
Run Code Online (Sandbox Code Playgroud)

我得到的错误是......

for x in range(0, len(bigrams)):
TypeError: object of type 'generator' has no len()
Run Code Online (Sandbox Code Playgroud)

由于ngram函数返回一个生成器,我尝试使用len(list(bigrams))但它返回0值,所以我得到相同的错误.我已经提到了有关stackexchange的其他问题,但我仍然没有解决如何解决这个问题.我被这个错误困住了.任何解决方法,建议?

Ilj*_*ilä 5

通过连接由分隔符分隔的值来构造字符串最好通过str.join以下方式完成:

def gen_bigrams(text):
    token = nltk.word_tokenize(text)
    bigrams = nltk.ngrams(token, 2)
    # instead of " ".join also "{} {}".format would work in the map
    return "-->".join(map(" ".join, bigrams))
Run Code Online (Sandbox Code Playgroud)

请注意,不会有尾随的“-->”,因此如有必要,请添加它。这样你甚至不必考虑你正在使用的迭代的长度。一般来说,在python中几乎总是如此。如果要遍历可迭代对象,请使用for x in iterable:. 如果确实需要索引,请使用enumerate

for i, x in enumerate(iterable):
    ...
Run Code Online (Sandbox Code Playgroud)