我正在使用大约 250 万个短文本数据(帖子,平均数据元素中大约 10 个单词)的真实数据集。我想将类似的帖子组合在一起。因此,在进行标准预处理后,我在数据集上应用了 KMeans 聚类。在矢量化之后(我做了 TfIdf),矩阵很大(250 万行和大约 60 k 列)。我进行了 SVD + LSA 转换,使其更小(250 万 x 150)。我给出了 200 作为聚类数并应用了 K 均值。我必须说,结果不是很糟糕。有些集群具有相似的帖子(不是语义,而是相似的词),但也有随机放置的集群。
由于数据量大,我无法有效地可视化结果或衡量集群的好坏。虽然我尝试实施轮廓系数、肘部方法来寻找最佳集群数量,但我遇到了持续的内存错误。我不知道 150 是否是降维期间使用的正确数字。您能否建议任何其他方法来解决这些问题?
当我达到这一点时,我开始怀疑聚类作为一种方法的有效性。我很想知道是否有人在大型生产规模系统中使用集群,如果是,人们使用什么样的技术?
请在下面找到代码:
`
tfidf_vectorizer = TfidfVectorizer(max_df=0.5, max_features=200000,
min_df=0.001,decode_error='ignore', stop_words='english',strip_accents='ascii',use_idf=True, ngram_range=(1,2),tokenizer=tokenizeAndFilter,lowercase=True)`
` tfidf_matrix = tfidf_vectorizer.fit_transform(tokens.values()) #fit the vectorizer to synopses
svd = TruncatedSVD(150)
normalizer = Normalizer(copy=False)
lsa = make_pipeline(svd, normalizer)
X = lsa.fit_transform(tfidf_matrix)
feature_names = tfidf_vectorizer.get_feature_names()
with open(path+'terms.csv','w') as f:
for col in tfidf_matrix.nonzero()[1]:
f.write(feature_names[col]+','+str( tfidf_matrix[0, col]))
f.write('\n')
sil_dict={}
for n_clusters in range(50,500,10):
km=KMeans(n_clusters=n_clusters,init='k-means++',max_iter=500,n_init=1)
km.fit(X)
label = km.labels_
sil_coeff = silhouette_score(X, label, metric='cosine',n_jobs=10)
# print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))
sil_dict[n_clusters]=sil_coeff
with open('kmeans_model'+str(n_clusters)+'.pkl','wb') as f:
cPickle.dump(km,f)
original_centroids=svd.inverse_transform(km.cluster_centers_)
order_centroids=original_centroids.argsort()[:,::-1]
terms=tfidf_vectorizer.get_feature_names()
clusters=collections.defaultdict(list)
k=0
for i in km.labels_:
clusters[i].append(tokens.values()[k])
k+=1
for i in range(10):
print i
for j in order_centroids[i, :10]:
print(terms[j] )
for key,valueList in clusters.items():
with open(path+'\\'+OUTPUTFILE+'_'+str(key)+'.csv','w') as f:
for value in valueList:
f.write(value+'\n')
`