2014-07-09 5 views
11

Ho provato tutti i metodi nltk per lo stemming ma mi dà risultati strani con alcune parole.Qual è il miglior metodo di derivazione in Python?

Esempi

Spesso intercettato fine delle parole quando non dovrebbe farlo:

  • barboncino => poodl
  • articolo articl

o non deriva molto buono:

  • easi LY e facile non sono derivava nella stessa parola
  • foglie, cresce, piuttosto non derivava

Sai altre librerie derivanti in pitone, o un buon dizionario?

Grazie

+1

questi risultati non sono strano dato 'stemming' è il procedimento per ridurre incurvati (o talvolta derivato) parole per loro stelo, base o radice forma generalmente una forma parola scritta. Per maggiori dettagli, controllare [qui] (http: //en.wikipedia.org/wiki/Stemming) – eliasah

+0

btw NLTK è la migliore piattaforma per la creazione di programmi Python per lavorare con dati in linguaggio umano. – eliasah

risposta

-2

Hai provato derivante 1.0 here?

+0

Sembra che utilizzino algoritmi diversi. Ci proverò, grazie! – PeYoTlL

+0

Nota che la derivazione è una pura implementazione Python e non sarà veloce come PyStemmer, che è un wrapper attorno a una libreria c e disponibile anche in PyPi. – Spaceghost

50

I risultati che si stanno ottenendo sono (generalmente) previsti per uno stemmer in inglese. Dici di aver provato "tutti i metodi nltk" ma quando provo i tuoi esempi, non sembra essere il caso.

Ecco alcuni esempi che utilizzano il PorterStemmer

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

I risultati sono 'crescere', 'leav' e 'fairli', che, anche se sono quello che volevi, sono derivava versioni della parola originale.

Se passiamo allo stelo Snowball, dobbiamo fornire la lingua come parametro.

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

I risultati sono come prima per 'cresce' e 'foglie' pero 'abbastanza' è staccato a 'equo'

Quindi, in entrambi i casi (e ci sono più di due stemmer disponibile in NLTK) le parole che dici non sono stimate, infatti, lo sono. LancasterStemmer restituirà 'easy' se fornito con 'easy' o 'easy' come input.

Forse hai davvero voluto un lemmatizzatore? Ciò restituirebbe "articolo" e "barboncino" invariato.

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

Questa dovrebbe essere la risposta selezionata. – gobrewers14

+1

Differenza b/n lemmantizer e stemmer: https://stackoverflow.com/questions/1787110/what-is-the-true-difference-between-lemmatization-vs-stemming –

4

Tutti questi stemmer che sono state discusse qui sono Stemmer algoritmica, di conseguenza, essi possono sempre produrre risultati inattesi, come

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' 

Per ottenere correttamente le parole radice uno ha bisogno di uno stemmer basata dizionario come Hunspell Stemmer.Here è un'implementazione Python di questo nel seguente link. codice esempio è qui

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