NLTK新手求助:为何nltk.pos_tag标记字母而非单词?
嘿,作为NLTK新手遇到这个问题太正常啦!你说的pos_tag标记字母而不是单词,核心原因几乎可以肯定是你没有把word_tokenize处理后的单词列表传给pos_tag,反而直接传入了原始字符串或者错误的对象——毕竟如果直接给pos_tag传字符串,它会默认把字符串拆成单个字符来迭代处理,自然就给每个字母打标签了。
正确的操作步骤来实现你想要的结果:
首先,要确保你已经下载了NLTK必需的分词和词性标注资源(第一次使用时需要),然后按以下步骤写代码:
import nltk # 下载分词和词性标注所需的资源(第一次运行执行一次即可) nltk.download('punkt') nltk.download('averaged_perceptron_tagger') # 你的目标句子 sentences = "Why TCP is more reliable than UDP " # 关键一步:用word_tokenize把句子拆分成单词列表 words = nltk.word_tokenize(sentences) # 对单词列表进行词性标注 tagged_result = nltk.pos_tag(words) print(tagged_result)
运行这段代码后,你会得到按单词标注的结果,类似这样:
[('Why', 'WRB'), ('TCP', 'NNP'), ('is', 'VBZ'), ('more', 'RBR'), ('reliable', 'JJ'), ('than', 'IN'), ('UDP', 'NNP')]
为什么之前会出错?
如果你的代码里words = nltk.word_tokenize(...)的参数不正确(比如误传了单个字符、空值,或者干脆跳过了tokenize步骤直接把原始句子传给nltk.pos_tag()),就会导致pos_tag处理的是单个字符而非单词。比如如果你写了nltk.pos_tag(sentences),那它就会把句子拆成['W','h','y',' ', ...]这样的字符列表,然后给每个字母打标签。
拓展:实现你期望的多句子嵌套列表格式
如果你想处理多个句子,得到像你示例里的嵌套列表结果,可以先拆分句子再逐个处理:
import nltk nltk.download('punkt') nltk.download('averaged_perceptron_tagger') # 多个句子的文本 multi_sent_text = "Why TCP is more reliable than UDP. And I want to learn how to use nltk." # 先把文本拆分成单个句子的列表 sentence_list = nltk.sent_tokenize(multi_sent_text) # 逐个对句子分词、标注,收集结果 tagged_sentences = [] for sent in sentence_list: tokens = nltk.word_tokenize(sent) tagged = nltk.pos_tag(tokens) tagged_sentences.append(tagged) print(tagged_sentences)
这段代码的输出就完全符合你期望的格式啦:
[[('Why', 'WRB'), ('TCP', 'NNP'), ('is', 'VBZ'), ('more', 'RBR'), ('reliable', 'JJ'), ('than', 'IN'), ('UDP', 'NNP'), ('.', '.')], [('And', 'CC'), ('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('learn', 'VB'), ('how', 'WRB'), ('to', 'TO'), ('use', 'VB'), ('nltk', 'NN'), ('.', '.')]]
内容的提问来源于stack exchange,提问作者dijkstracult

