2017-08-24 7 views
0

Je trouve qu'il ya une différence dans la façon dont nous passons un argument WordNetLemmatizer()problème avec WordNetLemmatizer() lorsque vous utilisez une liste de tuples

Quand je lance:

m=[('recurrances', 'NNS')]

wnl = WordNetLemmatizer()

print '>>>>', wnl.lemmatize(m[0][0], 'n')

le résultat est "recurrances", mais quand je lance:

print '>>>>', wnl.lemmatize('recurrances', 'n')

le résultat est ce que je pense >> "recurrance"

Pourquoi est-il comme ça? Y a-t-il un moyen d'obtenir le résultat correct (c'est-à-dire la forme singulière) dans le premier cas?

+0

Essayez ... issue – alvas

Répondre

0

Je ne peux pas reproduire la différence dont vous parlez entre passer m [0] [0] ou la chaîne directement (et cela me surprendrait vraiment s'il y en avait un, c'est probablement dû à autre chose dans votre code). Le fait qu'il ne renvoie pas ce que vous attendez peut être dû au fait que wordnet ne reconnaît pas le mot que vous alimentez son lemmatizer. Solution sous-optimale, mais vous pouvez contourner ce problème, comme le suggère @alvas, en utilisant un stemmer à la place. Un peu plus rudimentaire, mais aussi plus robuste. Quelque chose comme ce qui suit:

from nltk.stem import WordNetLemmatizer 
from nltk.corpus import wordnet 
from nltk.stem import SnowballStemmer 
snowball_stemmer = SnowballStemmer('english') 

m=[('recurrances', 'NNS')] 
wnl = WordNetLemmatizer() 
print(wnl.lemmatize(m[0][0], pos='n')) 
print(wnl.lemmatize('recurrances', pos='n')) 

word = m[0][0] 
if wordnet.synsets(word): 
    lemma = wnl.lemmatize(word, pos='n') # you might want to do pos-tagging if you have the whole sentence to not always pass it pos-tag n... 
    print('Lemma:', lemma) 
else: 
    stem = snowball_stemmer.stem(word) 
    print('Stem:', stem) 

sortie (où, comme vous pouvez le voir, les deux premières lignes sont identiques):

recurrances 
recurrances 
Stem: recurr