Dựa trên các câu trả lời khác nhau trên Stack Overflow và các blog mà tôi đã xem qua, đây là phương pháp tôi đang sử dụng và nó có vẻ trả về các từ thực khá tốt. Ý tưởng là chia văn bản đến thành một mảng từ (sử dụng bất kỳ phương pháp nào bạn muốn), sau đó tìm các phần của giọng nói (POS) cho những từ đó và sử dụng nó để giúp bắt nguồn và bổ sung các từ.
Mẫu của bạn ở trên không hoạt động quá tốt, vì không thể xác định được POS. Tuy nhiên, nếu chúng ta sử dụng một câu thực, mọi thứ hoạt động tốt hơn nhiều.
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', '.']