我刚刚开始学习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的其他问题,但我仍然没有解决如何解决这个问题.我被这个错误困住了.任何解决方法,建议?
通过连接由分隔符分隔的值来构造字符串最好通过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)
| 归档时间: |
|
| 查看次数: |
23208 次 |
| 最近记录: |