2013-09-26 12 views
6

Ich habe versucht, die Regex Stemmer, aber ich bekomme Hunderte von nicht miteinander verwandten Token. Ich bin nur am "Spiel" -Stamm interessiert. Hier ist der Code Ich arbeite mit:Stemming unstrukturierten Text in NLTK

import nltk 
from nltk.book import * 
f = open('tupac_original.txt', 'rU') 
text = f.read() 
text1 = text.split() 
tup = nltk.Text(text1) 
lowtup = [w.lower() for w in tup if w.isalpha()] 
import sys, re 
tupclean = [w for w in lowtup if not w in nltk.corpus.stopwords.words('english')] 
from nltk import stem 
tupstem = stem.RegexpStemmer('az$|as$|a$') 
[tupstem.stem(i) for i in tupclean] 

Das Ergebnis der oben ist;

['like', 'ed', 'young', 'black', 'like'...] 

Ich versuche .txt Dateien zu bereinigen (alle Klein, entfernen Sie Stoppwörter, etc.), normalisieren mehrere Schreibweisen eines Wortes in ein und eine Frequenz dist/Zählung tun. Ich weiß, wie man macht FreqDist, aber irgendwelche Vorschläge, wo ich mit der Stemming falsch liege?

+0

ist die Normalisierung nicht ergeben, die Sie suchen? Du sagst, du hast Probleme ... was hast du probiert? – Spaceghost

+0

Was ist Ihre erwartete Ausgabe? je nachdem, was Ihre Aufgabe ist, benötigen Sie möglicherweise einen Lemmatizer anstelle einer Stemmer, siehe http://StackOverflow.com/Questions/17317418/Stemmers-VS-Lemmatizers – alvas

Antwort

11

Es gibt mehrere vorcodierte bekannte Stemmer in NLTK, siehe http://nltk.org/api/nltk.stem.html und unten zeigt ein Beispiel.

>>> from nltk import stem 
>>> porter = stem.porter.PorterStemmer() 
>>> lancaster = stem.lancaster.LancasterStemmer() 
>>> snowball = stem.snowball.EnglishStemmer() 
>>> tokens = ['player', 'playa', 'playas', 'pleyaz'] 
>>> [porter(i) for i in tokens] 
>>> [porter.stem(i) for i in tokens] 
['player', 'playa', 'playa', 'pleyaz'] 
>>> [lancaster.stem(i) for i in tokens] 
['play', 'play', 'playa', 'pleyaz'] 
>>> [snowball.stem(i) for i in tokens] 
[u'player', u'playa', u'playa', u'pleyaz'] 

Aber was brauchen Sie wahrscheinlich so etwas wie ein regex stemmer,

>>> from nltk import stem 
>>> rxstem = stem.RegexpStemmer('er$|a$|as$|az$') 
>>> [rxstem.stem(i) for i in tokens] 
['play', 'play', 'play', 'pley'] 
+0

Ich bearbeitet meine Frage. Y = Ich habe deinen RegexStem ausprobiert und mehrere Tokens zurückbekommen. Ich bin mir nicht sicher, wo ich falsch liege. – user2221429

+0

ändere deine letzte Zeile in '[tupstem.stem (i) für i in tupclean, wenn" pl "in tupclean und" y "in tupstemstem.stem (i)]'. In der Linguistik tritt die Vokalverschiebung auf und unter der Annahme, dass die Diphthonge und auch der Beginn bleibt, wird der Konsonantencluster "pl" auch in der Orthographie vorhanden sein. – alvas

+0

versuchte dies, aber es tat nicht wirklich, was ich mir erhofft hatte. Danke trotzdem! – user2221429