2013-09-26 18 views
6

Próbowałem łodygi wyrażeń regularnych, ale otrzymuję setki niepowiązanych tokenów. Po prostu interesuje mnie "gra". Oto kod, nad którym pracuję:Stemming niestrukturalny tekst w 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] 

Rezultatem powyższego jest;

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

Próbuję oczyścić .txt plików (wszystkie małe litery, usuń stopwords itp), normalizuje wiele pisowni słowa do jednego i zrobić częstotliwości dist/count. Wiem, jak zrobić FreqDist, ale wszelkie sugestie co do tego, gdzie idę źle z wynikiem?

+0

nie jest powstrzymanie procesu normalizacji, którego szukasz? Mówisz, że masz kłopoty ... czego próbowałeś? – Spaceghost

+0

Jakie są twoje oczekiwane wyniki? w zależności od tego, jakie jest twoje zadanie, możesz potrzebować lematyzatora zamiast łodygi, zobacz http://stackoverflow.com/questions/17317418/stemmers-vs-flamiers – alvas

Odpowiedz

11

Istnieje kilka wstępnie zakodowanych dobrze znanych programów do analizy trzonów w NLTK, patrz http://nltk.org/api/nltk.stem.html, a poniżej pokazano przykład.

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

Ale co prawdopodobnie trzeba to jakiś z Stemmer regex,

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

Edytowałem moje pytanie. Y = Próbowałem twojego regexStem i otrzymałem z powrotem wiele tokenów. Nie jestem pewien, gdzie idę źle. – user2221429

+0

zmienić ostatnią linię na '[tupstem.stem (i) dla i w tupclean, jeśli" pl "w tupclean i" y "w tupstem.stem (i)]'. W językoznawstwie występuje przesunięcie samogłoskowe i przy założeniu, że dyftongi pozostają i tak samo jak początek, wówczas spółgłoska "pl" będzie również obecna w ortografii. – alvas

+0

próbowałem tego, ale tak naprawdę nie zrobiłem tego, co miałem nadzieję, że to zrobi. dzięki i tak! – user2221429