Я пытаюсь использовать Наивный Байес для набора данных, который содержит более 6 000 000 записей, и каждая запись содержит 150 тыс. функций. Я попытался реализовать код по следующей ссылке: Реализация Классификатор Bag-of-Words Naive-Bayes в NLTK
Проблема в том (насколько я понимаю), что когда я пытаюсь запустить метод поезда с параметром dok_matrix, он не может найти iterkeys (я соединил строки с OrderedDict в качестве меток):
Traceback (most recent call last):
File "skitest.py", line 96, in <module>
classif.train(add_label(matr, labels))
File "/usr/lib/pymodules/python2.6/nltk/classify/scikitlearn.py", line 92, in train
for f in fs.iterkeys():
File "/usr/lib/python2.6/dist-packages/scipy/sparse/csr.py", line 88, in __getattr__
return _cs_matrix.__getattr__(self, attr)
File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 429, in __getattr__
raise AttributeError, attr + " not found"
AttributeError: iterkeys not found
Мой вопрос: есть ли способ избежать использования разреженной матрицы, обучая запись классификатора за записью (онлайн), или есть формат разреженной матрицы, который я мог бы эффективно использовать в этом случае вместо dok_matrix? Или я упускаю что-то очевидное?
Спасибо за чье-то время. :)
РЕДАКТИРОВАТЬ, 6 сентября:
Нашел iterkeys, так что по крайней мере код работает. Это все еще слишком медленно, так как потребовалось несколько часов с набором данных размером 32 КБ и до сих пор не завершено. Вот что я получил на данный момент:
matr = dok_matrix((6000000, 150000), dtype=float32)
labels = OrderedDict()
#collect the data into the matrix
pipeline = Pipeline([('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)
add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x])
for x in xrange(lentweets-foldsize)]
classif.train(add_label(matr[:(lentweets-foldsize),0], labels))
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)]
data = np.array(classif.batch_classify(readrow))
Проблема может заключаться в том, что каждая взятая строка не использует разреженность вектора, а проходит через каждую из 150 тыс. записей. В продолжение проблемы, кто-нибудь знает, как использовать этот Наивный Байес с разреженными матрицами, или есть ли другой способ оптимизировать приведенный выше код?