Работа с большим количеством уникальных слов для обработки текста / TF-IDF и т. Д.

Я использую scikit для обработки текста, например, tfidf. Количество имен файлов обрабатывается нормально (~40k). Но что касается количества уникальных слов, я не могу разобраться с массивом / матрицей, будь то получить размер количества напечатанных уникальных слов или выгрузить массив numpy в файл (используя savetxt), Ниже приведен след. Если бы я мог получить верхние значения tfidf, так как они мне не нужны для каждого слова для каждого отдельного документа. Или я мог бы исключить другие слова из вычислений (не стоп-слова, а отдельный набор слов в текстовом файле, который я мог бы добавить, который будет исключен). Хотя я не знаю, облегчат ли слова, которые я выношу, эту ситуацию. Наконец, если бы я мог как-то захватить кусочки матрицы, это тоже сработало бы. Любой пример работы с такого рода вещами будет полезен и даст мне некоторые отправные точки идей. (PS Я посмотрел и попробовал Hashingvectorizer, но, похоже, я не могу сделать с ним tfidf?)

Traceback (most recent call last):
  File "/sklearn.py", line 40, in <module>
    array = X.toarray()
  File "/home/kba/anaconda/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 790, in toarray
    return self.tocoo(copy=False).toarray(order=order, out=out)
  File "/home/kba/anaconda/lib/python2.7/site-packages/scipy/sparse/coo.py", line 239, in toarray
    B = self._process_toarray_args(order, out)
  File "/home/kba/anaconda/lib/python2.7/site-packages/scipy/sparse/base.py", line 699, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
ValueError: array is too big.

Соответствующий код:

path = "/home/files/"

fh = open('output.txt','w')


filenames = os.listdir(path)

filenames.sort()

try:
    filenames.remove('.DS_Store')
except ValueError:
    pass # or scream: thing not in some_list!
except AttributeError:
    pass # call security, some_list not quacking like a list!

vectorizer = CountVectorizer(input='filename', analyzer='word', strip_accents='unicode', stop_words='english') 
X=vectorizer.fit_transform(filenames)
fh.write(str(vectorizer.vocabulary_))

array = X.toarray()
print array.size
print array.shape

Изменить: Если это поможет,

print 'Array is:' + str(X.get_shape()[0])  + ' by ' + str(X.get_shape()[1]) + ' matrix.'

Получите размер слишком большой разреженной матрицы, в моем случае:

Array is: 39436 by 113214 matrix.

1 ответ

В трассировке содержится ответ: когда вы звоните X.toarray() в конце концов, это преобразование разреженного матричного представления в плотное представление. Это означает, что вместо сохранения постоянного количества данных для каждого слова в каждом документе вы теперь сохраняете значение для всех слов во всех документах.

К счастью, большинство операций работают с разреженными матрицами или имеют разреженные варианты. Просто не звоните .toarray() или же .todense() и тебе будет хорошо идти.

Для получения дополнительной информации, ознакомьтесь с документацией скудной разреженной матрицы.

Другие вопросы по тегам