1

嗨,我对 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)
#############################################################################

这应该打印 'man' 和 'tooth' 但它会打印 'men' 和 'teeth'。

任何解决方案?

4

2 回答 2

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)

这个程序打印 [men,man], [teeth,tooth] 和 [book]!

为什么 lmtzr.lemmatize () 只打印列表的第一个元素的解释,也许它可以在函数 lemmatize 中找到,包含在文件夹 /usr/local/lib/python2 中的文件“wordnet.py”中.6/dist-packages/nltk/stem。

def lemmatize(self, word, pos=NOUN):
    lemmas = wordnet._morphy(word, pos)
    return min(lemmas, key=len) if lemmas else word

我假设它只返回单词列表中包含的较短单词,如果两个单词长度相等,则返回第一个单词;例如 'men' 或 'teeth' 而不是 'man' 和 'tooth'

于 2014-03-12T16:40:21.900 回答
1

wordnetlemmatizer 本身没有任何问题,但它不能很好地处理不规则的单词。你可以试试这个'hack'并尝试找到最接近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') 可以获取正确的同义词集和 WordNetLemmatizer().lemmatize('men') 的事实不能表明 WordNetLemmatizer 代码中也缺少某些内容。


要扩展例外列表,另请参阅:Python NLTK Lemmatization of the word 'further' with wordnet

于 2014-03-12T06:28:59.587 回答