2014-07-09 27 views
11

Wypróbowałem wszystkie metody nltk, ale daję dziwne wyniki przy użyciu kilku słów.Jaka jest najlepsza metoda w Pythonie?

Przykłady

Często wyciąć koniec słowa, kiedy nie powinien to zrobić:

  • pudel => poodl
  • artykuł articl

lub nie wynikają bardzo dobrze:

  • easi ly i łatwo nie wynikała z tego samego słowa
  • liście, rośnie, raczej nie wynikała

Znasz inne wynikające bibliotekami w Pythonie, czy to dobry słownik?

Dziękuję

+1

wyniki te nie są dziwne, ponieważ 'stemming' to proces zmniejszania odmieniane (lub czasami pochodzą) słów do ich macierzystych, zasady lub korzenia form-ogólnie pisemnej formie tekstu. Aby uzyskać więcej informacji, sprawdź [tutaj] (http: //en.wikipedia.org/wiki/Stemming) – eliasah

+0

btw NLTK jest najlepszą platformą do budowania programów w języku Python do pracy z danymi w języku ludzkim. – eliasah

Odpowiedz

-2

Czy próbowałeś wynikające 1.0 here?

+0

Wygląda na to, że używają różnych algorytmów. Spróbuję, dzięki! – PeYoTlL

+0

Zauważ, że jest to czysta implementacja Pythona i nie będzie tak szybka jak PyStemmer, która jest opakowaniem wokół biblioteki c, a także dostępna w PyPi. – Spaceghost

50

Uzyskiwane wyniki są (ogólnie) spodziewane w przypadku łodyg w języku angielskim. Mówisz, że próbowałeś "wszystkich metod nltk", ale kiedy próbuję twoich przykładów, nie wydaje się, żeby tak było.

Oto kilka przykładów z wykorzystaniem PorterStemmer

import nltk 
ps = nltk.stemmer.PorterStemmer() 
ps.stem('grows') 
'grow' 
ps.stem('leaves') 
'leav' 
ps.stem('fairly') 
'fairli' 

Wyniki są „rośnie”, „leav” oraz „fairli”, która, nawet jeśli są to, czego chciał, są wynikała wersje oryginalnego wyrazu.

Po przejściu na szalkę śnieżki musimy podać język jako parametr.

import nltk 
sno = nltk.stem.SnowballStemmer('english') 
sno.stem('grows') 
'grow' 
sno.stem('leaves') 
'leav' 
sno.stem('fairly') 
'fair' 

Wyniki są jak wcześniej dla „rośnie” i „liście”, ale „dość” jest łodygach do „fair”

Tak więc w obu przypadkach (a jest ich więcej niż dwa stemmery dostępny w NLTK) słowa, które, jak mówisz, nie są wywodzone, w rzeczywistości są. LancasterStemmer zwróci "łatwe", gdy otrzyma "łatwo" lub "łatwo" jako dane wejściowe.

Może naprawdę chciałeś lematyzatora? To przywróci "artykuł" i "pudel" w niezmienionej postaci.

import nltk 
lemma = nltk..wordnet.WordNetLemmatizer() 
lemma.lemmatize('article') 
'article' 
lemma..lemmatize('leaves') 
'leaf' 
+9

Powinna to być wybrana odpowiedź. – gobrewers14

+1

Różnica b/w lemmantizer i stemmer: https://strojverflow.com/questions/1787110/what-is-the-true-difference-between-lemmatization-vs-stemming –

4

Wszystkie te stemmery które zostały omówione tutaj są algorytmiczne rdzeni, dlatego zawsze mogą spowodować nieoczekiwane rezultaty takie jak

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' 

Aby poprawnie uzyskać słowa korzeń jeden potrzebują Stemmer oparciu słownika takie jak hunspell Stemmer.Here to implementacja Pythona w następującej link. Przykład kodu jest tutaj

>>> 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']