Использование CountVectorizer в Python Mapper Reducer

Я пытаюсь применить токенизатор, используя функцию редуктора python mapper. У меня есть следующий код, но я продолжаю получать сообщение об ошибке. редуктор выводит значения в список, и я передаю значения векторизатору.

from mrjob.job import MRJob
from sklearn.cross_validation import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer

class bagOfWords(MRJob):

def mapper(self, _, line):
    cat, phrase, phraseid, sentiment = line.split(',')
    yield (cat, phraseid, sentiment), phrase

def reducer(self, keys, values):

    yield keys, list(values)

#Output: ["Train", "--", "2"] ["A series of escapades demonstrating the adage that    what is good for the goose", "A series", "A", "series"]

def mapper(self, keys, values):
    vectorizer = CountVectorizer(min_df=0)
    vectorizer.fit(values)
    x = vectorizer.transform(values)
    x=x.toarray()       
    yield keys, (x)


if __name__ == '__main__':
    bagOfWords.run()

ValueError: пустой словарный запас; возможно, документы содержат только стоп-слова

Спасибо за любую помощь, которую вы, ребята, можете предоставить.


person Sohail    schedule 01.04.2014    source источник


Ответы (1)


CountVectorizer имеет состояние: вам нужно поместить один и тот же экземпляр в полный набор данных, чтобы построить словарь, поэтому он не поддается параллельной обработке.

Вместо этого вы можете использовать HashingVectorizer, который не имеет состояния (не нужно подгонять, вы можете напрямую вызывать transform).

person ogrisel    schedule 24.09.2014