Вывод неструктурированного текста в NLTK

Я попробовал стеммер регулярных выражений, но получил сотни несвязанных токенов. Меня просто интересует ствол "play". Вот код, с которым я работаю:

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 (все в нижнем регистре, удалить стоп-слова и т. д.), нормализовать несколько вариантов написания слова в одно и выполнить частотное расстояние/количество. Я знаю, как сделать FreqDist, но есть какие-нибудь предложения относительно того, где я ошибаюсь с определением основы?


person user2221429    schedule 26.09.2013    source источник
comment
Разве это не нормализация, которую вы ищете? Вы говорите, что у вас проблемы .. что вы пробовали?   -  person Spaceghost    schedule 27.09.2013
comment
Каков ваш ожидаемый результат? в зависимости от вашей задачи вам может понадобиться лемматизатор вместо стеммера, см. stackoverflow. com/questions/17317418/stemmers-vs-lemmatizers   -  person alvas    schedule 27.09.2013


Ответы (1)


В 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']
person alvas    schedule 27.09.2013
comment
Я отредактировал свой вопрос. Y=Я попробовал ваш regexStem и получил обратно несколько токенов. Не знаю, где я ошибаюсь. - person user2221429; 27.09.2013
comment
измените последнюю строку на [tupstem.stem(i) for i in tupclean if "pl" in tupclean and "y" in tupstem.stem(i)]. В лингвистике происходит сдвиг гласных, и если предположить, что дифтонги остаются и, а также начало, то группа согласных pl также будет присутствовать в орфографии. - person alvas; 28.09.2013
comment
пробовал это, но на самом деле это не то, на что я надеялся. Спасибо, в любом случае! - person user2221429; 30.09.2013
comment
У меня установлен nltk, и я могу использовать его в других случаях, но я получаю ошибки импорта модулей для всего вышеперечисленного --- `››› from nltk import stem ››› snowball = Stem.snowball.EnglishStemmer() ››› [snowball(i) for i in ['Игра', плавание, танцы]] Трассировка (последний последний вызов): Файл ‹stdin›, строка 1, в ‹module› Ошибка типа: объект 'EnglishStemmer' не вызывается ``` - person Mittenchops; 25.11.2013
comment
Вы загрузили все пакеты, когда делаете >>> import nltk, а затем >>> nltk.download()? - person alvas; 25.11.2013
comment
хороший выбор примеров, которые показывают интересные угловые случаи для стеммеров nltk - person hobs; 08.02.2014