使用NLTK打印移除形容词后的词性标签遇生成器对象及语法错误问题
解决NLTK词性标签处理中的生成器对象与语法错误问题
咱们先拆解你遇到的两个核心问题,一步步解决:
1. 为什么会输出 generator object pos.<locals>.<genexpr> at 0x000000000E000D00?
这是因为你用了生成器表达式来过滤形容词标签。生成器是Python的惰性迭代器——它不会立刻计算所有结果,只有当你主动遍历它时才会生成值。直接打印生成器对象,Python只会告诉你它的类型和内存地址,不会输出实际的标签内容。
举个你可能用到的错误示例:
import nltk from nltk.tag import pos_tag from nltk.tokenize import word_tokenize text = "The quick brown fox jumps over the lazy dog" tagged_words = pos_tag(word_tokenize(text)) # 这里用了生成器表达式过滤形容词(JJ是形容词的词性标签) filtered_tags = (tag for tag in tagged_words if tag[1] != 'JJ') print(filtered_tags) # 直接打印生成器,就会输出那个奇怪的对象地址
解决办法:
把生成器转换成列表(列表是立即求值的),或者直接遍历生成器逐个打印元素:
- 方法一:转成列表后打印(最常用)
# 用列表推导式直接生成结果列表 filtered_tags = [tag for tag in tagged_words if tag[1] != 'JJ'] print(filtered_tags)
- 方法二:遍历生成器逐个输出
filtered_tags = (tag for tag in tagged_words if tag[1] != 'JJ') for item in filtered_tags: print(item)
2. 为什么把print语句用[]包裹会报“Invalid syntax”?
这个问题分两种情况:
- 如果你用的是Python 2.x:
print是一个语句(不是函数),不能把它放在列表字面量里(比如[print(item) for item in filtered_tags]这种写法在Python2里直接语法报错)。解决办法要么切换到Python3,要么在代码开头加from __future__ import print_function,把print转换成函数使用。 - 如果你用的是Python3:大概率是写法有语法错误,比如漏了括号(比如写成
[print filtered_tags],正确应该是[print(filtered_tags)]),或者没必要把print塞到列表里——列表推导式是用来生成列表的,不是用来执行打印操作的,强行这么做会生成一堆None的列表(因为print没有返回值),完全没必要。
完整的正确示例代码
import nltk from nltk.tag import pos_tag from nltk.tokenize import word_tokenize # 第一次运行需下载必要的NLTK数据 nltk.download('punkt') nltk.download('averaged_perceptron_tagger') text = "The quick brown fox jumps over the lazy dog" tagged_words = pos_tag(word_tokenize(text)) # 过滤所有形容词标签(JJ/JJR/JJS分别对应原级/比较级/最高级形容词) filtered_tags = [tag for tag in tagged_words if not tag[1].startswith('JJ')] # 美观地打印结果 print("移除形容词后的词性标签:") for word, tag in filtered_tags: print(f"{word}: {tag}")
内容的提问来源于stack exchange,提问作者SafenessAndSafe
相关产品推荐
相关产品推荐

