stemmer spanish porter lemmatize and python nlp nltk wordnet lemmatization

spanish - WordNetLemmatizer no devuelve el lema correcto a menos que POS sea explícito-Python NLTK



porter stemmer spanish (1)

Lemmatizo la transcripción de Ted Dataset. Hay algo extraño que noto: no todas las palabras están siendo lematizadas. Decir,

selected -> select

Lo cual está bien.

Sin embargo, involved !-> involve y horsing !-> horse menos que ingrese explícitamente el atributo ''v'' (Verb).

En la terminal de Python, obtengo el resultado correcto pero no en mi código :

>>> from nltk.stem import WordNetLemmatizer >>> from nltk.corpus import wordnet >>> lem = WordNetLemmatizer() >>> lem.lemmatize(''involved'',''v'') u''involve'' >>> lem.lemmatize(''horsing'',''v'') u''horse''

La sección relevante del código es esta:

for l in LDA_Row[0].split(''+''): w=str(l.split(''*'')[1]) word=lmtzr.lemmatize(w) wordv=lmtzr.lemmatize(w,''v'') print wordv, word # if word is not wordv: # print word, wordv

Todo el código está aquí .

¿Cuál es el problema?


El lematizador requiere que la etiqueta POS correcta sea precisa, si usa la configuración predeterminada de WordNetLemmatizer.lemmatize() , la etiqueta predeterminada es sustantivo, consulte https://github.com/nltk/nltk/blob/develop/nltk/ stem / wordnet.py # L39

Para resolver el problema, siempre POS-tag sus datos antes de la lematización, por ejemplo

>>> from nltk.stem import WordNetLemmatizer >>> from nltk import pos_tag, word_tokenize >>> wnl = WordNetLemmatizer() >>> sent = ''This is a foo bar sentence'' >>> pos_tag(word_tokenize(sent)) [(''This'', ''DT''), (''is'', ''VBZ''), (''a'', ''DT''), (''foo'', ''NN''), (''bar'', ''NN''), (''sentence'', ''NN'')] >>> for word, tag in pos_tag(word_tokenize(sent)): ... wntag = tag[0].lower() ... wntag = wntag if wntag in [''a'', ''r'', ''n'', ''v''] else None ... if not wntag: ... lemma = word ... else: ... lemma = wnl.lemmatize(word, wntag) ... print lemma ... This be a foo bar sentence

Tenga en cuenta que ''es -> ser'', es decir,

>>> wnl.lemmatize(''is'') ''is'' >>> wnl.lemmatize(''is'', ''v'') u''be''

Para responder la pregunta con palabras de tus ejemplos:

>>> sent = ''These sentences involves some horsing around'' >>> for word, tag in pos_tag(word_tokenize(sent)): ... wntag = tag[0].lower() ... wntag = wntag if wntag in [''a'', ''r'', ''n'', ''v''] else None ... lemma = wnl.lemmatize(word, wntag) if wntag else word ... print lemma ... These sentence involve some horse around

Tenga en cuenta que hay algunas peculiaridades con WordNetLemmatizer:

Además, el etiquetador de POS predeterminado de NLTK está realizando algunos cambios importantes para mejorar la precisión:

Y para una solución lista para usar / lista para usar de lemmatizer, puede echar un vistazo a https://github.com/alvations/pywsd y cómo he hecho algunos intentos: exceptts para capturar palabras que no están en WordNet, consulte https://github.com/alvations/pywsd/blob/master/pywsd/utils.py#L66