Какой лучший метод stemming в Python?
Я пробовал все методы nltk для stemming, но это дает мне странные результаты с некоторыми словами.
примеры
Он часто обрезает конец слов, когда он не должен этого делать:
- пудель => poodl
- статья articl
или не очень хорошо:
- легко и легко не вытекают в одном и том же слове
- листья, растет, справедливо не запружены
знаете ли вы другие stemming libs в python или хороший словарь?
спасибо
4 ответов
результаты, которые вы получаете (как правило) для Штеммер на английском языке. Вы говорите, что пробовали "все методы nltk", но когда я пробую ваши примеры, это не так.
вот несколько примеров использования PorterStemmer
import nltk
ps = nltk.stemmer.PorterStemmer()
ps.stem('grows')
'grow'
ps.stem('leaves')
'leav'
ps.stem('fairly')
'fairli'
результатом являются "grow", "leav" и "fairli", которые, даже если они то, что вы хотели, являются версиями исходного слова.
Если мы переключаем к стержню снежка, то мы должны обеспечить язык как параметр.
import nltk
sno = nltk.stem.SnowballStemmer('english')
sno.stem('grows')
'grow'
sno.stem('leaves')
'leav'
sno.stem('fairly')
'fair'
результаты для 'растет' и 'листья' но 'достаточно' происходит в 'ярмарка'
таким образом, в обоих случаях (и в нлтк доступно более двух стеммеров) слова, которые вы говорите, на самом деле не являются стеммированными. LancasterStemmer возвратит "легкий" при условии С "легко" или "легко" как входной сигнал.
может быть, вы действительно хотели лемматизатор? Это вернет "статью" и "пуделя" без изменений.
import nltk
lemma = nltk..wordnet.WordNetLemmatizer()
lemma.lemmatize('article')
'article'
lemma..lemmatize('leaves')
'leaf'
все эти стеммеры, которые были обсуждены здесь, являются алгоритмическими стеммерами, поэтому они всегда могут давать неожиданные результаты, такие как
In [3]: from nltk.stem.porter import *
In [4]: stemmer = PorterStemmer()
In [5]: stemmer.stem('identified')
Out[5]: u'identifi'
In [6]: stemmer.stem('nonsensical')
Out[6]: u'nonsens'
чтобы правильно получить корневые слова, нужен словарь на основе стволовых, таких как Hunspell стволовых.Вот реализация python этого в следующем ссылке. Пример кода здесь
>>> import hunspell
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff')
>>> hobj.spell('spookie')
False
>>> hobj.suggest('spookie')
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill']
>>> hobj.spell('spooky')
True
>>> hobj.analyze('linked')
[' st:link fl:D']
>>> hobj.stem('linked')
['link']
в моем проекте chatbot я использовал PorterStemmer, однако LancasterStemmer также служит этой цели. Конечная цель состоит в том, чтобы стебель слово к его корню, так что мы можем искать и сравнивать с поисковыми словами входов.
Например: от в nltk.импорт стебля PorterStemmer ps = PorterStemmer ()
def SrchpattrnStmmed(self):
KeyWords =[]
SrchpattrnTkn = word_tokenize(self.input)
for token in SrchpattrnTkn:
if token not in stop_words:
KeyWords.append(ps.stem(token))
continue
#print(KeyWords)
return KeyWords
надеюсь, это поможет..