Basierend auf verschiedenen Antworten auf Stack Overflow und Blogs, auf die ich gestoßen bin, ist dies die Methode, die ich verwende, und sie scheint ziemlich gut echte Wörter zurückzugeben. Die Idee ist, den eingehenden Text in eine Reihe von Wörtern aufzuteilen (verwenden Sie die gewünschte Methode) und dann die Wortarten (POS) für diese Wörter zu finden und diese zu verwenden, um die Wörter zu stammeln und zu lemmatisieren.
Das obige Beispiel funktioniert nicht so gut, da der POS nicht bestimmt werden kann. Wenn wir jedoch einen echten Satz verwenden, funktionieren die Dinge viel besser.
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', '.']