如何从Gensim TFIDF值执行kmean聚类

时间:2018-06-19 17:06:01

标签: numpy k-means gensim tf-idf corpus

我正在将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数组。任何评论都非常感谢。

dumydist = 1-余弦相似度(tfidfmtx)

2 个答案:

答案 0 :(得分:2)

To create document term matrix from gensim, you may use matutils.corpus2csv

Corpus - list of list(Genism Corpus)

from scipy.sparse import csc_matrix

scipy_csc_matrix =genism.matutils.corpus2csc(corpus)

full_matrix=csc_matrix(scipy_csc_matrix).toarray()

you may want to use scipy sparse format if your corpus size is very large.

答案 1 :(得分:2)

当您的语料库适合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)