NLTK WordNetLemmatizer: no se minimiza como se espera

Estoy tratando de minimizar todas las palabras en una oración con WordNetLemmatizer de NLTK. Tengo un montón de oraciones, pero solo estoy usando la primera oración para asegurarme de que estoy haciendo esto correctamente. Esto es lo que tengo:

train_sentences[0] "Explanation Why edits made username Hardcore Metallica Fan reverted? They vandalisms, closure GAs I voted New York Dolls FAC. And please remove template talk page since I'm retired now.89.205.38.27" 

Así que ahora trato de minimizar cada palabra de la siguiente manera:

 lemmatizer = WordNetLemmatizer() new_sent = [lemmatizer.lemmatize(word) for word in train_sentences[0].split()] print(new_sent) 

Y vuelvo:

 ['Explanation', 'Why', 'edits', 'made', 'username', 'Hardcore', 'Metallica', 'Fan', 'reverted?', 'They', 'vandalisms,', 'closure', 'GAs', 'I', 'voted', 'New', 'York', 'Dolls', 'FAC.', 'And', 'please', 'remove', 'template', 'talk', 'page', 'since', "I'm", 'retired', 'now.89.205.38.27'] 

Un par de preguntas:

1) ¿Por qué las “ediciones” no se transforman en “editar”? Es cierto que si hago lemmatizer.lemmatize("edits") vuelvo a las edits pero me sorprendió.

2) ¿Por qué los “vandalismos” no se transforman en “vandalismo”? Esto es muy sorprendente, ya que si hago lemmatizer.lemmatize("vandalisms") , recupero vandalism

Cualquier aclaración / orientación sería increíble!

TL; DR

Primero etiquete la oración, luego use la etiqueta POS como el parámetro adicional de entrada para la lematización.

 from nltk import pos_tag from nltk.stem import WordNetLemmatizer wnl = WordNetLemmatizer() def penn2morphy(penntag): """ Converts Penn Treebank tags to WordNet. """ morphy_tag = {'NN':'n', 'JJ':'a', 'VB':'v', 'RB':'r'} try: return morphy_tag[penntag[:2]] except: return 'n' def lemmatize_sent(text): # Text input is string, returns lowercased strings. return [wnl.lemmatize(word.lower(), pos=penn2morphy(tag)) for word, tag in pos_tag(word_tokenize(text))] lemmatize_sent('He is walking to school') 

Para obtener una descripción detallada de cómo y por qué es necesaria la etiqueta POS, consulte https://www.kaggle.com/alvations/basic-nlp-with-nltk


Alternativamente, puede usar pywsd tokenizer + lemmatizer, una envoltura de WordNetLemmatizer de WordNetLemmatizer :

Instalar:

 pip install -U nltk python -m nltk.downloader popular pip install -U pywsd 

Código:

 >>> from pywsd.utils import lemmatize_sentence Warming up PyWSD (takes ~10 secs)... took 9.307677984237671 secs. >>> text = "Mary leaves the room" >>> lemmatize_sentence(text) ['mary', 'leave', 'the', 'room'] >>> text = 'Dew drops fall from the leaves' >>> lemmatize_sentence(text) ['dew', 'drop', 'fall', 'from', 'the', 'leaf'] 

(Nota para los moderadores: no puedo marcar esta pregunta como un duplicado de nltk: ¿Cómo minimizar el hecho de que las palabras circundantes estén en contexto? Porque la respuesta no fue aceptada allí, pero es un duplicado).

  1. Esto es realmente algo que la comunidad nltk podría responder.
  2. Esto está sucediendo debido a que , al final de los vandalisms, .Para eliminar este .strip(',') , puede usar .strip(',') o usar delimitadores de mutliple como se describe aquí .