2014-08-27 94 views
17

我使用NLTK WordNet Lemmatizer進行詞性標註項目,方法是首先將訓練語料庫中的每個單詞修改爲詞幹(就地修改),然後僅對新語料庫進行訓練。但是,我發現lemmatizer沒有按照我的預期運行。NLTK WordNet Lemmatizer:難道它不應該將一個詞的所有變化詞彙化?

例如,字loves被lemmatized到love這是正確的,但這個詞loving甚至詞形還原後仍loving。這裏loving就像在「我愛它」這句話中一樣。

是不是love變形詞的詞幹loving?同樣,許多其他'ing'形式仍然存在,就像它們在詞形化之後一樣。這是正確的行爲?

什麼是一些準確的其他lemmatizers? (不必在NLTK中)在決定詞幹時,是否有詞法分析器或詞法分析器也考慮到單詞的詞性標記?例如,如果killing用作動詞,則詞killing應該具有kill作爲詞幹,但如果它用作名詞(如在the killing was done by xyz中),則它應該具有killing作爲詞幹。

回答

40

的共發現lemmatizer 確實採取POS標籤進去,但它不會奇蹟般地確定它:

>>> nltk.stem.WordNetLemmatizer().lemmatize('loving') 
'loving' 
>>> nltk.stem.WordNetLemmatizer().lemmatize('loving', 'v') 
u'love' 

沒有一個POS標籤,它假定你餵養它是一個名詞一切。所以在這裏它認爲你通過名詞「愛」(如在「甜蜜的愛」)。

+4

感謝您的回答!你還可以告訴,它需要的是什麼標籤? n-nouns,v =動詞...? – 2015-09-06 21:53:02

24

解決此問題的最佳方法是實際查找Wordnet。看看這裏:Loving in wordnet。正如你所看到的,Wordnet中實際上有一個形容詞「愛」。事實上,甚至還有副詞「親切」:lovingly in Wordnet。因爲wordnet實際上並不知道你真正想要的詞性,所以默認爲名詞(Wordnet中的'n')。如果使用的是賓州樹庫標記集,這裏的轉化賓至WN標籤一些有用的功能:

from nltk.corpus import wordnet as wn 

def is_noun(tag): 
    return tag in ['NN', 'NNS', 'NNP', 'NNPS'] 


def is_verb(tag): 
    return tag in ['VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ'] 


def is_adverb(tag): 
    return tag in ['RB', 'RBR', 'RBS'] 


def is_adjective(tag): 
    return tag in ['JJ', 'JJR', 'JJS'] 


def penn_to_wn(tag): 
    if is_adjective(tag): 
     return wn.ADJ 
    elif is_noun(tag): 
     return wn.NOUN 
    elif is_adverb(tag): 
     return wn.ADV 
    elif is_verb(tag): 
     return wn.VERB 
    return None 

希望這有助於。

+3

wnpos = lambda e:('a'if e [0] .lower()=='j'else e [0] .lower())if e [0] .lower()in ['n',' r','v'] else'x' – 2015-05-16 19:58:29

+0

1行比28好一點;) – wordsforthewise 2017-12-09 23:57:25

+0

然而,它應該是'wnpos = lambda e:('a'if e [0] .lower()==' j'else e [0] .lower())if ['n','r','v'] else [n']中的e [0] .lower(),因爲函數的默認值是NOUN, 'x'或'None'。 – wordsforthewise 2017-12-10 00:11:37

0

類似woth @bogs

我用的字典:

from textblob.wordnet import NOUN, VERB, ADJ, ADV 

pos_to_wornet_dict = { 

    'JJ': ADJ, 
    'JJR': ADJ, 
    'JJS': ADJ, 
    'RB': ADV, 
    'RBR': ADV, 
    'RBS': ADV, 
    'NN': NOUN, 
    'NNP': NOUN, 
    'NNS': NOUN, 
    'NNPS': NOUN, 
    'VB': VERB, 
    'VBG': VERB, 
    'VBD': VERB, 
    'VBN': VERB, 
    'VBP': VERB, 
    'VBZ': VERB, 

} 
1

它比枚舉更清晰,更有效:

from nltk.corpus import wordnet 

def get_wordnet_pos(self, treebank_tag): 
    if treebank_tag.startswith('J'): 
     return wordnet.ADJ 
    elif treebank_tag.startswith('V'): 
     return wordnet.VERB 
    elif treebank_tag.startswith('N'): 
     return wordnet.NOUN 
    elif treebank_tag.startswith('R'): 
     return wordnet.ADV 
    else: 
     return '' 

def penn_to_wn(tag): 
    return get_wordnet_pos(tag)