Моя цель - выполнить кластеризация текстов из набора данных миллионы строк, где каждая строка представляет собой строку слов, которая не соответствует правильному документу, а скорее списку «ключевых слов». Идея в том, что каждая строка представляет пользователя Twitter со списком ключевых слов, взятых из его / ее твитов., вот пример строки:
"remove United States District Attorney Carmen Ortiz office overreach case Aaron Swartz"
Вот мой код:
from __future__ import print_function
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.cluster import MiniBatchKMeans
from time import time
import csv
# LOAD CSV
print("Loading Dataset from a CSV...")
csvinputfile = '...'
t = time()
dataset = open(csvinputfile, 'r')
print("done in %0.3fs" % (time() - t))
print("")
# TERM OCCURRENCES
print("Calculating Term Occurrences...")
t = time()
vectorizer = HashingVectorizer(n_features=300000, stop_words=None, alternate_sign=False, norm='l2', binary=False)
x = vectorizer.fit_transform(dataset)
print("done in %0.3fs" % (time() - t))
print("")
# CLUSTERING
print("MiniBatchKMeans Clustering...")
t = time()
km = MiniBatchKMeans(n_clusters=10000, init='k-means++', n_init=1, init_size=10000, batch_size=10000, verbose=False)
clusters = km.fit(x)
print("done in %0.3fs" % (time() - t))
print("")
Моя проблема в том, что когда дело доходит до кластеризации, я получаю Ошибка памяти:
MiniBatchKMeans Clustering...
Traceback (most recent call last):
File ".../cluster-users.py", line 32, in <module> clusters = km.fit(x)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 1418, in fit init_size=init_size)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 684, in _init_centroids x_squared_norms=x_squared_norms)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 79, in _k_init centers = np.empty((n_clusters, n_features), dtype=X.dtype)
MemoryError
[Finished in 22.923s]
Я новичок в питон и научиться, поэтому я не очень хорошо понимаю, что происходит, но я предполагаю, что это потому, что, поскольку я имею дело с большим набором данных, фаза кластеризации пытается загрузить огромную матрицу n_samples и n_features в память.
Часть этой ошибки, которую я не понимаю, так как я думал, что MiniBatchKMeans и Хеширование могут помочь против ограничений памяти, я также действительно не знаю, какие лучшие параметры использовать (я следил за учебником scikitlearn для KMeans и MiniBatchKMeans для кластеризации текстов в качестве основы вы можете найти его здесь http://scikit-learn.org/stable/auto_examples/text/document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py).
То, что нужно запомнить:
Итак, мой вопрос: как я могу исправить ошибку памяти? И если у кого-то есть подсказки о том, как правильно настроить кластеризацию, или если мой подход неверен, это тоже было бы неплохо.
Получу ли я разные результаты от выполнения векторизации хеширования для всех данных и последующей передачи полученной матрицы кускам minibatchkmeans? Я спрашиваю об этом, потому что я пробовал это, и в результате в "km.labels_" я нашел только последний фрагмент данных, который я частично подогнал.
@VivekKumar О, еще одна вещь: если я хочу добавить шаг уменьшения размерности, можно ли добавить его сразу после фазы HashingVectorizer или это концептуально / логически неправильно? Итак, если я правильно понимаю, я должен: для каждого фрагмента необработанных данных -> выполнить векторизацию хеширования -> уменьшить размерность -> выполнить minibatchkmeans -> сохранить результаты этого фрагмента -> повторить для другого фрагмента, пока я не обработаю весь набор данных
Если вы хотите уменьшить размеры, почему бы не начать с более низких n_features в HashingVectorizer?
поскольку мои данные представляют собой короткие тексты, не должно ли количество функций равняться количеству возможных уникальных слов? В противном случае я потеряю информацию, по крайней мере, это то, что я понял, а затем, чтобы снизить вычислительные затраты, я выполняю уменьшение размерности.
Строка, содержащая такой текст, «удалить окружной прокурор США Кармен Ортис из-за превышения полномочий офиса Аарона Шварца» действительно является dirty
.
Чтобы исправить ошибку памяти, убедитесь, что следующие пункты верны;
Все ли ключевые слова подряд актуальны? Если нет, попробуйте уменьшить их, удалив стоп-слова, знаки препинания и т. д.
Сосредоточьтесь на агрегировании релевантных ключевых слов из текста. Вы можете создать список таких ключевых слов.
Ищите библиотеку regex
на python. Это может помочь вам с очисткой данных.
Чтобы определить наилучшие параметры, ищите такие термины, как within cluster sums of squares
, average silhouette
или gap statistic
.
Кластеризация - это не какой-то dark-magic
, который даст результат. Если вы введете мусор, будет получен мусор.
P.S. Пожалуйста, не создавайте новых вопросов по той же проблеме. Уже есть другой аналогичный вопрос, который вы недавно задавали. Если эти два вопроса кардинально не отличаются, создайте новый вопрос, в противном случае четко укажите в своем сообщении, чем этот вопрос отличается от предыдущего.
Струны уже очищены от этих слов. Извините за второй вопрос, но в основном я хотел решить проблему с памятью.
Не загружайте в программу сразу все данные. Вы используете MiniBatchKMeans, поэтому используйте его метод
partial_fit()
. Загрузите небольшой фрагмент данных, преобразуйте его с помощью HashingVectorizer и передайте егоpartial_fit()
.