嗨,我有一个nltk(2.0.4)的问题: 我试图阻止“男人”或“牙齿”这个词,但它似乎没有用。 这是我的代码:
############################################################################
import nltk
from nltk.corpus import wordnet as wn
from nltk.stem.wordnet import WordNetLemmatizer
lmtzr=WordNetLemmatizer()
words_raw = "men teeth"
words = nltk.word_tokenize(words_raw)
for word in words:
print 'WordNet Lemmatizer NOUN: ' + lmtzr.lemmatize(word, wn.NOUN)
#############################################################################
这应该打印“男人”和“牙齿”,而是打印“男人”和“牙齿”。
任何解决方案?
答案 0 :(得分:3)
我找到了解决方案! 我检查了wordnet.py文件中的文件/usr/local/lib/python2.6/dist-packages/nltk/corpus/reader,我发现函数_morphy(self,form,pos)返回一个包含词干的单词列表。 所以我试着测试_morphy:
import nltk
from nltk.corpus import wordnet as wn
from nltk.stem.wordnet import WordNetLemmatizer
words_raw = "men teeth books"
words = nltk.word_tokenize(words_raw)
for word in words:
print wn._morphy(word, wn.NOUN)
该程序打印[男人,男人],[牙齿,牙齿]和[书]!
解释为什么lmtzr.lemmatize()只打印列表的第一个元素,也许它可以在函数lemmatize中找到,包含在文件'wordnet.py'中,该文件位于文件夹/ usr / local /中LIB / python2.6的/ DIST-包/ NLTK /干。
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
我假设它只返回单词列表中包含的较短的单词,如果这两个单词长度相等,则返回第一个单词;例如'男人'或'牙齿'而不是'男人'和'牙齿'
答案 1 :(得分:0)
wordnetlemmatizer本身没有任何问题,但它不能很好地处理不规则的单词。你可以试试这个' hack'并尝试为synset找到最接近的lemma_names
:
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> word = "teeth"
>>> wnl.lemmatize(word)
'teeth'
>>> wnlemmas = list(set(list(chain(*[i.lemma_names() for i in wordnet.synsets('teeth')]))))
>>> from difflib import get_close_matches as gcm
>>> [i for i in gcm(word,wnlemmas) if i != word]
[u'tooth']
>>> word = 'men'
>>> wnlemmas = list(set(list(chain(*[i.lemma_names() for i in wordnet.synsets(word)]))))
>>> gcm(word,wnlemmas)
[u'men', u'man']
>>> [i for i in gcm(word,wnlemmas) if i != word]
[u'man']
然而,wordnet.synsets(' men')可以获取正确的synset和WordNetLemmatizer()。lemmatize(' men')不能表明存在还有一些WordNetLemmatizer代码中缺少的东西。
要扩展例外列表,另请参阅:Python NLTK Lemmatization of the word 'further' with wordnet