Какой лучший метод stemming в Python?

Я пробовал все методы nltk для stemming, но это дает мне странные результаты с некоторыми словами.

примеры

Он часто обрезает конец слов, когда он не должен этого делать:

  • пудель => poodl
  • статья articl

или не очень хорошо:

  • легко и легко не вытекают в одном и том же слове
  • листья, растет, справедливо не запружены

знаете ли вы другие stemming libs в python или хороший словарь?

спасибо

4 ответов


вы пробовали stemming 1.0 здесь?


результаты, которые вы получаете (как правило) для Штеммер на английском языке. Вы говорите, что пробовали "все методы 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

надеюсь, это поможет..