Dựa trên các câu trả lời khác nhau trên Stack Overflow và blog tôi đã gặp, đây là phương pháp tôi đang sử dụng và dường như trả lại các từ thực sự khá tốt. Ý tưởng là chia văn bản vào thành một mảng các từ (sử dụng phương pháp nào bạn muốn), và sau đó tìm các phần của lời nói (POS) cho những từ đó và sử dụng để giúp ngăn chặn và lemmatize các từ.
Bạn mẫu ở trên không hoạt động tốt, vì không thể xác định POS. Tuy nhiên, nếu chúng ta sử dụng một câu thật, mọi thứ sẽ 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', '.']
Đó không phải là xương rồng? – MSalters
Chỉ cần tạo tham chiếu vòng tròn cho câu hỏi ban đầu được đăng trên Reddit: [Làm cách nào để lập trình bắt đầu? (ví dụ: "ăn" để "ăn", "cây xương rồng" để "cây xương rồng")] (http://www.reddit.com/r/programming/comments/8e5d3/how_do_i_programatically_do_stemming_eg_eating_to/) Đăng ở đây vì các nhận xét bao gồm thông tin hữu ích. –
xem http://stackoverflow.com/questions/17317418/stemmers-vs-lemmatizers – alvas