我的目标是从几百万行的数据集中执行文本聚类,其中每一行都是一串单词,不对应一个适当的单词文档,而是列出“关键字”列表。这个想法是,每行代表一个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]
我对 python 和 scikitlearn 还是很陌生,所以我不太了解发生了什么,但是我认为这是因为,因为我正在处理一个大型数据集,聚类阶段正在尝试将n_samples和n_features的巨大矩阵加载到内存中。
该错误的一部分,我不明白,因为我认为 MiniBatchKMeans 和 HashingVectorizer 可以帮助克服内存限制,但我也不是真的知道要使用什么最佳参数(我遵循了针对KMeans和MiniBatchKMeans的scikitlearn教程,以将文本聚类为基础,您可以在http://scikit-learn.org/stable/auto_examples/text/document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py上找到它)。
要记住的事情:
所以我的问题是:如何修复内存错误?而且,如果有人对如何正确设置群集有一些提示,或者如果我的方法不对,那也很好。
答案 0 :(得分:1)
包含这样的文本的行“删除美国地区检察官卡门·奥尔蒂斯办公室超案Aaron Swartz”的确是dirty
。
要解决内存错误,请确保以下几点成立;
连续的所有关键字是否相关?如果没有,请尝试通过删除停用词,标点符号等来减少它们。
重点是从文本中汇总相关关键字。您可以创建此类关键字的列表。
在python中寻找regex
库。它可以帮助您清理数据。
要确定最佳参数,请查找诸如within cluster sums of squares
或average silhouette
或gap statistic
之类的术语。
聚类不是可以产生结果的dark-magic
。如果输入垃圾,将产生垃圾。
P.S。请不要针对同一问题创建新问题。已经有另一个similar question that you've asked recently。除非这两个问题根本不同,否则请创建一个新问题,否则请在您的帖子中清楚说明该问题与上一个问题有何不同。