основе различных ответов на переполнение стека и блогах я сталкивался, это метод я использую, и это, кажется, вернуться реальные слова достаточно хорошо. Идея состоит в том, чтобы разбить входящий текст на массив слов (использовать какой бы метод вы ни хотели), а затем найти части речи (POS) для этих слов и использовать их, чтобы помочь остановить и лематизировать слова.
Вы образец выше не работает слишком хорошо, потому что POS не может быть определен. Однако, если мы используем настоящее предложение, все работает намного лучше.
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', '.']
Не должно быть кактусов? – MSalters
Просто, чтобы сделать круговую ссылку на исходный вопрос, размещенный на Reddit: [Как программно сделать вывод? (например, «есть», «есть», «кактусы» - «кактус»)] (http://www.reddit.com/r/programming/comments/8e5d3/how_do_i_programatically_do_stemming_eg_eating_to/) Публикуется здесь, потому что комментарии включают Полезная информация. –
см. Http://stackoverflow.com/questions/17317418/stemmers-vs-lemmatizers – alvas