NLTK代码无法识别chunked中的weather/NN,求问题排查
问题分析与解决方案
嘿,我一眼就看出问题出在哪啦!你遇到的核心问题是把NLTK的Tree对象和它的字符串输出搞混了,咱们一步步拆解:
为什么原代码检测不到"weather/NN"?
你用ne_chunk(nouns)得到的chunked是一个nltk.tree.Tree类型的对象,不是普通字符串。控制台打印出来的(S What/WP 's/VBZ the/DT weather/NN like/IN ?/.)只是这个Tree对象的字符串表示形式,但对象本身的结构是由一个个词-词性元组(比如('weather', 'NN'))组成的层级结构,不是字符串。所以你直接用"weather/NN" in chunked这种字符串匹配的方式,当然找不到啦!
修正后的代码
咱们直接操作Tree对象的结构来检测,推荐用leaves()方法获取所有的词-词性元组,这样判断更准确:
import nltk from nltk.tokenize import word_tokenize, sent_tokenize from nltk.chunk import ne_chunk # 先确保下载了必要的NLTK数据(第一次运行需要) nltk.download('punkt') nltk.download('averaged_perceptron_tagger') nltk.download('maxent_ne_chunker') nltk.download('words') que = "What's the weather like?" lines_list = sent_tokenize(que) for text in lines_list: tokens = word_tokenize(text) tagged_tokens = nltk.pos_tag(tokens) chunked = ne_chunk(tagged_tokens) print(chunked) # 输出: (S What/WP 's/VBZ the/DT weather/NN like/IN ?/.) # 检查是否存在('weather', 'NN')这个元组 if ('weather', 'NN') in chunked.leaves(): print("I found weather as noun")
额外说明
- 如果你非要用字符串匹配的方式(不推荐,因为结构复杂时容易误判),可以把Tree转换成字符串再判断:
if "weather/NN" in str(chunked),但这种方法不够严谨,比如遇到类似"weather/NNP"(专有名词)的情况可能会误匹配。 leaves()方法会提取Tree中所有最底层的词-词性元组,刚好对应你需要检测的内容,是最可靠的方式。
内容的提问来源于stack exchange,提问作者tuddyftw
相关产品推荐
相关产品推荐

