Python3中使用NLTK生成Bigram显示generator object,无法查看内容
<generator object>的问题 嘿,我来给你拆解下你遇到的这个情况:
你看到的<generator object ngrams at 0x7ff1d81d2468>其实是Python里的生成器对象。NLTK的ngrams函数特意返回生成器而非直接返回列表——这是因为生成器是「惰性求值」的:它不会一次性把所有bigram都加载到内存里,而是等你需要的时候才逐个生成元素。这种设计在处理超大文本时特别实用,能帮你节省不少内存空间。
那为什么直接打印或查看它看不到具体内容呢?因为生成器本身只是一个「生产元素的工具」,不是现成的元素集合。直接打印它只会告诉你它的类型和内存位置,不会输出里面的二元组内容。
要看到具体的bigram,有两种简单的解决方法:
方法1:把生成器转换成列表
你可以用list()把生成器转成普通列表,这样就能直接查看所有内容了:
import nltk from nltk import word_tokenize from nltk.util import ngrams text = "Hi How are you? i am fine and you" token = nltk.word_tokenize(text) bigrams = ngrams(token, 2) # 转换为列表保存 bigrams_list = list(bigrams) print(bigrams_list)
运行后会得到类似这样的输出:
[('Hi', 'How'), ('How', 'are'), ('are', 'you?'), ('you?', 'i'), ('i', 'am'), ('am', 'fine'), ('fine', 'and'), ('and', 'you')]
方法2:遍历生成器逐个输出
如果你不想一次性占用太多内存(比如处理超长篇文本),可以用for循环遍历生成器,逐个打印每个bigram:
import nltk from nltk import word_tokenize from nltk.util import ngrams text = "Hi How are you? i am fine and you" token = nltk.word_tokenize(text) bigrams = ngrams(token, 2) # 遍历生成器 for bg in bigrams: print(bg)
这样会一行一个输出每个二元组,比如:
('Hi', 'How')
('How', 'are')
...
最后提醒你一句:生成器只能被遍历一次,遍历完之后它就空了。如果之后还要用这些bigram,记得要么提前转成列表保存,要么重新调用ngrams生成新的生成器哦。
内容的提问来源于stack exchange,提问作者Vitangelo Moscarda

