Избавьтесь от стоп-слов и знаков препинания - PullRequest
7 голосов
/ 04 апреля 2011

Я борюсь со стоп-словом NLTK.

Вот мой кусочек кода ... Может кто-нибудь сказать мне, что не так?

from nltk.corpus import stopwords

def removeStopwords( palabras ):
     return [ word for word in palabras if word not in stopwords.words('spanish') ]

palabras = ''' my text is here '''

Ответы [ 2 ]

24 голосов
/ 04 апреля 2011

Ваша проблема в том, что итератор для строки возвращает каждый символ, а не каждое слово.

Например:

>>> palabras = "Buenos dias"
>>> [c for c in palabras]
['B', 'u', 'e', 'n', 'a', 's', ' ', 'd', 'i', 'a', 's']

Вам нужно выполнить итерацию и проверить каждое слово, к счастью, функцию splitуже существует в стандартной библиотеке python под строковым модулем .Тем не менее, вы имеете дело с естественным языком, включая пунктуацию, вы должны искать здесь для более надежного ответа, использующего модуль re.

После того, как у вас есть список слов, вы должны все их прописатьперед сравнением, а затем сравните их так, как вы уже показали.

Buena suerte.

РЕДАКТИРОВАТЬ 1

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

import re
from nltk.corpus import stopwords

scentence = 'El problema del matrimonio es que se acaba todas las noches despues de hacer el amor, y hay que volver a reconstruirlo todas las mananas antes del desayuno.'

#We only want to work with lowercase for the comparisons
scentence = scentence.lower() 

#remove punctuation and split into seperate words
words = re.findall(r'\w+', scentence,flags = re.UNICODE | re.LOCALE) 

#This is the simple way to remove stop words
important_words=[]
for word in words:
    if word not in stopwords.words('spanish'):
        important_words.append(word)

print important_words

#This is the more pythonic way
important_words = filter(lambda x: x not in stopwords.words('spanish'), words)

print important_words 

Надеюсь, это поможет вам.

2 голосов
/ 08 января 2015

Сначала с помощью токенизатора вы сравниваете список токенов (символов) со стоп-списком, поэтому вам не нужен модуль re.Я добавил дополнительный аргумент для переключения между языками.

def remove_stopwords(sentence, language):
    return [ token for token in nltk.word_tokenize(sentence) if token.lower() not in stopwords.words(language) ]

Dime si te fue de util;)

...