2015-03-03 3 views
1

Я пытаюсь отфильтровать стоп-слова в моем тексте так:фильтрации игнорируемых слов рядом с пунктуацией

clean = ' '.join([word for word in text.split() if word not in (stopwords)]) 

Проблема заключается в том, что text.split() имеет такие элементы, как 'word.', которые не соответствуют к 'word' стоп-слово.

Я позже использовал clean в sent_tokenize(clean), так что я не хочу полностью избавляться от пунктуации.

Как отфильтровать стоп-слова, в то время как удерживая знаки препинания, но отфильтровать такие слова, как 'word.'?

Я думал, что можно было бы изменить знаки препинания:

text = text.replace('.',' . ') 

, а затем

clean = ' '.join([word for word in text.split() if word not in (stop words)] or word == ".") 

Но есть лучший путь?

ответ

3

Обозначить текст первый, чем очистить его от задержек. Обычно токенизатор распознает знаки препинания.

import nltk 

text = 'Son, if you really want something in this life,\ 
     you have to work for it. Now quiet! They are about\ 
     to announce the lottery numbers.' 

stopwords = ['in', 'to', 'for', 'the'] 

sents = [] 

for sent in nltk.sent_tokenize(text): 

    tokens = nltk.word_tokenize(sent) 
    sents.append(' '.join([w for w in tokens if w not in stopwords])) 

print sents 

[ 'Сынок, если вы действительно хотите что-то из этой жизни, вы должны работать его'. 'Теперь тихо!', «Они о объявляют номера лотереи.]

+0

' nltk.word_tokenize (текст) 'избежал бы пространства имен. – alvas

+0

Исправлено! Спасибо. –

+0

'word_tokenize' не' tokenizer'; P – alvas

1

Вы могли бы использовать что-то вроде этого:

import re 

clean = ' '.join([word for word in text.split() if re.match('([a-z]|[A-Z])+', word).group().lower() not in (stopwords)]) 

Это вытаскивает все, кроме строчных и прописных букв ASCII и соответствует его слов в вашем stopcase наборе или списка. Кроме того, он предполагает, что все ваши слова в словах являются строчными буквами, поэтому я преобразовал слово во все строчные буквы. Возьмите это, если я сделаю предположение

Кроме того, я не владею регулярным выражением, извините, если есть более чистый или надежный способ сделать это.

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