Работа с большим количеством уникальных слов для обработки текста / 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()
и тебе будет хорошо идти.
Для получения дополнительной информации, ознакомьтесь с документацией скудной разреженной матрицы.