Я пытаюсь создать классификатор настроений для твитов, используя классификатор MultinomialNB SciKit. У меня есть набор данных, содержащий 1,6 миллиона секретных твитов, которые я хочу использовать для обучения моего классификатора. Поскольку все это сразу занимает слишком много памяти, я пытаюсь сделать это с помощью partial_fit()
.Naive Bayes в SciKit-learn training with partial_fit breaks из-за разных размеров массива
linecounter = 0
classifier = MultinomialNB()
data_frame = DataFrame({'text': [], 'class': []})
# open csv file
with open('training.cleaned.csv', 'rb') as csvfile:
# parse csv file
tweet_reader = csv.reader(csvfile, delimiter=',', quotechar='"')
#loop through each line
for tweet in tweet_reader:
data_frame = data_frame.append(DataFrame({'text': [tweet[TEXT].decode('utf8')], 'class': tweet[SENTIMENT]}, index=[tweet[ID]]))
linecounter += 1
if linecounter % 100 == 0:
count_vectorizer = CountVectorizer(ngram_range=([1, 2]))
counts = count_vectorizer.fit_transform(numpy.asarray(data_frame['text'], dtype="|S6"))
targets = numpy.asarray(data_frame['class'], dtype="|S6")
classifier.partial_fit(counts, targets, numpy.asarray(['negative', 'neutral', 'positive']))
Для каждых 100 (для этой проверки) линий я хочу обучить классификатор. Первый раунд идет хорошо, но второй раунд он выдает ошибку:
File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 443, in _count self.feature_count_ += safe_sparse_dot(Y.T, X)
ValueError: operands could not be broadcast together with shapes (3,147) (3,246) (3,147)
Я знаю, что это вызвано CountVectorizer, потому что каждый из 100 твитов совершенно разные, векторизатор будет отличаться. Я не уверен, как я могу это решить ... Есть ли способ сделать несколько векторов одинакового размера? Или есть еще один умный трюк, который я мог бы использовать для частичной подготовки моего классификатора?
Примечание: количество строк может быть получено более легко 'for linecounter, tweet in enumerate (tweet_reader)'. –