使用wordnet lemmatizer阻止一些复数不起作用

时间:2014-03-11 18:23:56

标签: nltk python-2.6 wordnet stemming lemmatization

嗨,我有一个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)
#############################################################################

这应该打印“男人”和“牙齿”,而是打印“男人”和“牙齿”。

任何解决方案?

2 个答案:

答案 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