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:
- lematización wordnet y etiquetado pos en python
- Python NLTK Lemmatización de la palabra ''further'' con wordnet
Además, el etiquetador de POS predeterminado de NLTK está realizando algunos cambios importantes para mejorar la precisión:
- Python NLTK pos_tag no devuelve la etiqueta correcta de parte de la voz
- https://github.com/nltk/nltk/issues/1110
- https://github.com/nltk/nltk/pull/1143
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