NLTK WordNet Lemmatizer: ne devrait-il pas lemmatize toutes les inflexions d'un mot?

J'utilise le NLTK WordNet Lemmatizer pour un projet de marquage D'une partie de la parole en modifiant d'abord chaque mot du corpus d'entraînement à sa tige (modification en place), puis en ne s'entraînant que sur le nouveau corpus. Cependant, j'ai trouvé que le lemmatizer ne fonctionne pas comme je l'attendais.

par exemple, le mot loves est lemmatisé en love ce qui est correct, mais le mot loving reste loving même après lemmatisation. Ici loving est que dans la phrase "je suis amoureux d'elle".

n'est-ce pas love la racine du mot loving ? De même, de nombreuses autres formes " ing " subsistent après la lemmatisation. Est-ce le bon comportement?

Quels sont les autres lemmatizers qui sont précis? (ne doit pas être dans NLTK) y a-t-il des analyseurs de morphologie ou des lemmatizers qui prennent également en compte la partie d'un mot de l'étiquette de la parole, en décidant le mot tige? Exemple, le mot killing devrait avoir kill comme de la tige si killing est utilisé comme un verbe, mais il devrait avoir killing comme la tige si elle est utilisé comme un nom (comme dans the killing was done by xyz ).

25
demandé sur Peter Mortensen 2014-08-27 22:10:12

4 réponses

Le WordNet lemmatizer ne prendre le POS de la balise en compte, mais il n'est pas comme par magie la déterminer:

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

sans étiquette POS, il suppose que tout ce que vous lui donnez est un nom. Donc ici il pense que vous lui passez le nom" loving "(comme dans"sweet loving").

48
répondu Fred Foo 2014-08-27 19:34:03

la meilleure façon de résoudre ce problème est de regarder dans Wordnet. Regardez ici: Loving in wordnet . Comme vous pouvez le voir, il y a en fait un adjectif "affectueux" présent dans Wordnet. Comme une question de fait, il est même l'adverbe "amoureusement": l'amour de Wordnet . Parce que wordnet ne sait pas réellement quelle partie du discours vous voulez vraiment, il est par défaut à noun ('n' Dans Wordnet). Si vous utilisez Penn Treebank tag set, voici quelques pratiques fonction pour transformer Penn en WN tags:

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

Espérons que cette aide.

26
répondu bogs 2014-08-28 08:30:18

Similaire avec @tourbières

j'utilise un dict:

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,

}
0
répondu tim 2017-12-12 23:28:08

c'est plus clair et plus efficace que l'énumération:

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)
0
répondu John Zhow 2018-01-20 10:31:31