基于余弦相似度的TFIDF向量聚类

问题描述

对小众问题很抱歉。

我正在尝试根据预定义的阈值将文本语料库聚类成未知数量的类别(在python中)。

我已经使用sklearn为我的文档生成tf-idf矢量,并且我可以轻松地计算出给定文档与所有其他文档的余弦相似度,以生成超出阈值的列表。但是,我正在努力研究如何计算每个文档与其他文档相比的余弦相似度,以产生未知数量的类别。

一些用于说明的代码...

vectorizer=TfidfVectorizer(analyzer='word',ngram_range=(1,3),lowercase=True,binary=False,norm='l2')
tfidfVectors=vectorizer.fit_transform(df['NLP'])

# Some very crude code to test out potential relatedness thresholds
def relatedness(vectors,doc_num,threshold):
    doc = vectors[doc_num]
    titles = []
    for x in range(0,vectors.shape[0]):
        if x == doc_num:
            continue
        else:
            score = cosine_similarity(tfidfVectors[doc_num],tfidfVectors[x])
            if score >= threshold:
                titles.append(df.iloc[x]['TITLE'])
    print("Document: " + df.iloc[doc_num]['TITLE'])
    print("Similar to " + str(len(titles)) + " other documents")
    print(titles)

tldr:如何计算列表中每个向量的余弦相似度与列表中每个其他向量的余弦相似度,以基于余弦相似度阈值将它们分成簇。

在此先感谢您的帮助。

解决方法

如果我理解正确,我认为这就是您需要做的。您最终并没有提到如何获取数据,但是在这里,您仅获得带有(vector1,vector2,cosine_similarity between vector 1 and vector2)的元组列表。

import itertools
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# Random data
vectors = [np.random.rand(3,3) for _ in range(10)]    

results = []
for v1,v2 in itertools.combinations(vectors,r=2):
    results.append((v1,v2,cosine_similarity(v1,v2)))

编辑:顺便说一句,伸缩性不好。