根据许多文档计算文本相似度

问题描述 投票:0回答:1

我正在尝试针对其他搜索项的集合计算搜索项A的文本相似度,例如“如何制作鸡”。为了计算相似度,我使用余弦距离和TF-IDF将A转换为向量。我想一次比较Aall文档的相似性。

当前,我的方法涉及一次迭代地计算A与其他每个文档的余弦相似度。我有100个要比较的文件。如果结果为cos_sim(A, X) > 0.8,那么我会说“很酷,这很相似”。

但是,我觉得这可能不能完全代表整体相似性。有没有一种方法可以在运行时为我的100个文档预先计算向量,并且每当我看到一个新的搜索查询A时,我都可以将其与此预先定义的向量/文档进行比较?

我相信我可以通过将所有文档简单地合并为一个文件来实现……虽然感觉很粗糙。优缺点和可能的解决方案是什么?效率加分!

python information-retrieval cosine-similarity document-classification
1个回答
0
投票

此问题本质上是传统的搜索问题:您是否尝试过将文档放入Lucene (Java)Whoosh (python)之类的文件?我认为他们有一个余弦相似度模型(但即使没有,默认值可能会更好)。

所有搜索引擎使用的一般技巧是,文档通常是稀疏的。这意味着要计算相似度(例如,余弦相似度),只关系文档的长度(提前知道方式)和它们都包含的术语就很重要;您可以组织一个类似于书本索引的数据结构,称为inverted index,它可以快速告诉您哪些文档将获得至少非零的分数。

[只有100个文档,搜索引擎可能会过分杀伤;您要预先计算TF-IDF向量并将其保留在numpy矩阵中。然后,您可以使用numpy运算一次计算所有文档的点积,它将输出numerators you need的1x100向量。分母可以类似地被预先计算。然后numpy.max(numpy.dot(query, docs)/denom)可能足够快。

您应该分析代码,但是我敢打赌,向量提取是很慢的部分;但您只需要对所有查询执行一次。

[如果您有成千上万的文档要进行比较,则可以研究SciKit Learn的K近邻结构(例如Ball TreeKDTree,或类似Facebook's FAISS library的事物。

© www.soinside.com 2019 - 2024. All rights reserved.