求助:NLTK WordNetLemmatizer对简单输入文本无生效问题
问题原因及解决方法
你的代码没生效的核心问题是直接遍历了字符串的每个字符,而WordNetLemmatizer需要接收单个单词作为输入。字符串遍历会把"bats flying balls"拆成一个个字符(比如'b'、'a'、't'等),对字符做词形还原不会有任何变化,所以输出和原句一致。
修正后的代码
from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer def word_lemmatizer(text): lemmatizer = WordNetLemmatizer() # 先把文本分词成单词列表 word_tokens = word_tokenize(text) # 对每个单词做词形还原 lem_words = [lemmatizer.lemmatize(w) for w in word_tokens] # 把还原后的单词拼接成句子 lem_text = " ".join(lem_words) return lem_text print(word_lemmatizer("bats flying balls"))
输出结果
bat flying ball
进阶优化(可选)
WordNetLemmatizer默认按名词(pos='n')还原,如果要更准确处理动词(比如"flying"还原成"fly"),可以手动指定词性:
def word_lemmatizer(text): lemmatizer = WordNetLemmatizer() word_tokens = word_tokenize(text) # 给动词指定pos='v',名词用默认的pos='n' lem_words = [] for w in word_tokens: # 先尝试按动词还原,再按名词(如果还原结果和原词一致的话) lem_v = lemmatizer.lemmatize(w, pos='v') lem_words.append(lem_v if lem_v != w else lemmatizer.lemmatize(w)) lem_text = " ".join(lem_words) return lem_text print(word_lemmatizer("bats flying balls"))
输出会变成:
bat fly ball
内容的提问来源于stack exchange,提问作者jsacharz
相关产品推荐
相关产品推荐

