2013-09-26 4 views
6

Я пробовал стеймер регулярного выражения, но я получаю сотни не связанных между собой токенов. Меня просто интересует «игра». Вот код, с которым я работаю:Stemming неструктурированный текст в 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] 

Результат:

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

Я пытаюсь очистить .txt файлы (строчными буквами, удалить стоп-слова и т.д.), нормализуют несколько вариантов написания слова в один и сделать частоту Dist/кол. Я знаю, как сделать FreqDist, но какие-либо предложения относительно того, где я ошибаюсь, с тем, что происходит?

+0

Не сдерживании нормализации вы ищете? Вы говорите, что у вас проблемы ... что вы пробовали? – Spaceghost

+0

Каков ваш ожидаемый результат? в зависимости от вашей задачи вам может понадобиться lemmatizer вместо стебля, см. http://stackoverflow.com/questions/17317418/stemmers-vs-lemmatizers – alvas

ответ

11

В NLTK имеется несколько предварительно закодированных штокмеров, см. http://nltk.org/api/nltk.stem.html и ниже приведен пример.

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

Но то, что вы, вероятно, потребуется какая-то из регулярных выражений стеммер,

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

Я отредактировал мой вопрос. Y = Я попробовал ваш regexStem и снова получил несколько токенов. Не знаю, где я ошибаюсь. – user2221429

+0

измените свою последнюю строку на '[tupstem.stem (i) для i в tupclean, если« pl »в tupclean и« y »в tupstem.stem (i)]'. В лингвистике происходит сдвиг гласных и при условии, что дифтонги остаются и так же, как и начало, тогда согласный кластер «pl» также будет присутствовать в орфографии. – alvas

+0

попробовал это, но на самом деле он не делал то, что я надеялся сделать. Спасибо, в любом случае! – user2221429

Смежные вопросы