【发布时间】:2021-02-03 03:18:00
【问题描述】:
我正在运行一个包含文本文档的实验,我需要计算所有文本文档之间的(余弦)相似度矩阵(用于另一个计算)。为此,我使用 sklearn 的 TfidfVectorizer:
corpus = [doc1, doc2, doc3, doc4]
vect = TfidfVectorizer(min_df=1, stop_words="english", use_idf=False)
tfidf = vect.fit_transform(corpus)
similarities = tfidf * tfidf.T
pairwise_similarity_matrix = similarities.A
问题在于,在我的实验的每次迭代中,我都会发现需要添加到相似度矩阵中的新文档,并且考虑到我正在处理的文档数量(数万和更多) - 这非常耗时。
我希望找到一种方法来仅计算新批次文档与现有文档之间的相似度,而无需重新计算整个数据集。
请注意,我使用的是词频 (tf) 表示,没有使用逆文档频率 (idf),因此理论上我不需要每次都重新计算整个矩阵。
【问题讨论】:
-
我认为如果您每次发现新文档时不重新计算,您会遇到的一个问题是您的 TfidfVectorizer 以及随之而来的词汇表将不适合这些文件。这可能意味着,即使您向其中添加了一个新文档,如果 TfidfVectorizer 没有根据其中的单词调整其词汇表,它的大部分内容也可能无法使用。
-
@KimTang 这是问题的一部分——我希望将新术语添加到相同的 termsXdocs 矩阵中,然后再将其与自身相乘以获得新的 docsXdocs 相似度矩阵。
-
@KimTang 对于那部分,我看到了这个问题的答案,并使用“partial_fit”的相关部分,我可以设法用新看到的术语更新词汇表,但这对我没有帮助相似度矩阵部分:stackoverflow.com/questions/39109743/…
-
@KimTang 我刚刚发布了一个解决这部分问题的答案 - 你可以查看一下
-
感谢更新!我现在也刚刚删除了我的答案。
标签: python scikit-learn cosine-similarity tfidfvectorizer