Berdasarkan berbagai jawaban di Stack Overflow dan blog yang saya temui, ini adalah metode yang saya gunakan, dan tampaknya mengembalikan kata-kata nyata dengan cukup baik. Idenya adalah untuk membagi teks yang masuk menjadi array kata (gunakan metode mana pun yang Anda suka), dan kemudian temukan parts of speech (POS) untuk kata-kata itu dan gunakan itu untuk membantu membendung dan menyesuaikan kata-kata.
Contoh Anda di atas tidak berfungsi dengan baik, karena POS tidak dapat ditentukan. Namun, jika kita menggunakan kalimat nyata, segalanya bekerja lebih baik.
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', '.']