如何执行 k 意味着从 Gensim TF IDF 值聚类

Posted

技术标签:

【中文标题】如何执行 k 意味着从 Gensim TF IDF 值聚类【英文标题】:How to perform kmean clustering from Gensim TFIDF values 【发布时间】:2018-11-28 17:22:02 【问题描述】:

我将 Gensim 用于向量空间模型。从 Gensim 创建字典和语料库后,我使用以下行计算了(词频*逆文档频率)TFIDF

Term_IDF  = TfidfModel(corpus)
corpus_tfidf = Term_IDF[corpus]

corpus_tfidf 包含具有术语 id 和相应 TFIDF 的列表列表。然后我使用以下几行将 TFIDF 与 id 分开:

 for doc in corpus_tfidf:
     for ids,tfidf in doc:    
         IDS.append(ids)
         tfidfmtx.append(tfidf)    
         IDS=[]

现在我想使用 k-means 聚类,所以我想执行 tfidf 矩阵的余弦相似度,问题是 Gensim 不会产生方阵,所以当我运行以下行时会产生错误。我想知道如何从 Gensim 中获取方阵来计算向量空间模型中所有文档的相似度。还如何将 tfidf 矩阵(在本例中为列表列表)转换为 2D NumPy 数组。非常感谢任何 cmets。

dumydist = 1 - cosine_similarity(tfidfmtx)

【问题讨论】:

【参考方案1】:

当您将语料库放入 Gensim 字典时,获取字典中的数字或文档和标记:

from gensim.corpora.dictionary import Dictionary
dictionary = Dictionary(corpus_lists)
num_docs = dictionary.num_docs
num_terms = len(dictionary.keys())

变身为弓:

corpus_bow = [dictionary.doc2bow(doc) for doc in corpus_lists]

转换成tf-idf:

from gensim.models.tfidfmodel import TfidfModel
tfidf = TfidfModel(corpus_bow)
corpus_tfidf = tfidf[corpus_bow]

现在您可以转换为稀疏/密集矩阵:

from gensim.matutils import corpus2dense, corpus2csc
corpus_tfidf_dense = corpus2dense(corpus_tfidf, num_terms, num_docs)
corpus_tfidf_sparse = corpus2csc(corpus_tfidf, num_terms, num_docs)

现在使用稀疏/密集矩阵(转置后)拟合您的模型:

model = KMeans(n_clusters=7)
clusters = model.fit_predict(corpus_bow_dense.T)

【讨论】:

【参考方案2】:

要从 gensim 创建文档术语矩阵,您可以使用 matutils.corpus2csv

语料库 - 列表列表(Genism Corpus)

from scipy.sparse import csc_matrix

scipy_csc_matrix =genism.matutils.corpus2csc(corpus)

full_matrix=csc_matrix(scipy_csc_matrix).toarray()

如果您的语料库非常大,您可能希望使用 scipy 稀疏格式。

【讨论】:

以上是关于如何执行 k 意味着从 Gensim TF IDF 值聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 k 均值何时收敛于 tf idf?

如何使用 tf-idf 选择停用词? (非英语语料库)

使用不同的方法计算TF-IDF值

What is Gensim?

Scikit Learn K-means Clustering & TfidfVectorizer:如何将具有最高 tf-idf 分数的前 n 项传递给 k-means

如何使 TF-IDF 矩阵密集?