Opierając się na różnych odpowiedziach na Stack Overflow i blogach, z którymi się spotkałem, używam tej metody i wydaje się, że całkiem dobrze zwraca prawdziwe słowa. Chodzi o to, aby podzielić przychodzący tekst na tablicę słów (użyj dowolnej metody), a następnie znaleźć części mowy (POS) dla tych słów i użyć ich, aby pomóc wyprowadzić i lematyzować słowa.
Twoja próbka powyżej nie działa zbyt dobrze, ponieważ nie można określić POS. Jeśli jednak użyjemy prawdziwego zdania, wszystko działa znacznie lepiej.
import nltk
from nltk.corpus import wordnet
lmtzr = nltk.WordNetLemmatizer().lemmatize
def get_wordnet_pos(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 wordnet.NOUN
def normalize_text(text):
word_pos = nltk.pos_tag(nltk.word_tokenize(text))
lemm_words = [lmtzr(sw[0], get_wordnet_pos(sw[1])) for sw in word_pos]
return [x.lower() for x in lemm_words]
print(normalize_text('cats running ran cactus cactuses cacti community communities'))
# ['cat', 'run', 'ran', 'cactus', 'cactuses', 'cacti', 'community', 'community']
print(normalize_text('The cactus ran to the community to see the cats running around cacti between communities.'))
# ['the', 'cactus', 'run', 'to', 'the', 'community', 'to', 'see', 'the', 'cat', 'run', 'around', 'cactus', 'between', 'community', '.']