Python 基于多文档的文本相似度计算

Python 基于多文档的文本相似度计算,python,information-retrieval,cosine-similarity,document-classification,Python,Information Retrieval,Cosine Similarity,Document Classification,我试图计算一个搜索词的文本相似性,a,比如“如何制作鸡”与其他搜索词的集合。为了计算相似度,我使用余弦距离和TF-IDF将A转换为向量。我想一次将A的相似性与所有文档进行比较 目前,我的方法是迭代计算A与其他文档的余弦相似性。我有100份文件要比对。如果cos_sim(A,X)>0.8的结果 然而,我觉得这可能不是整体相似性的真实表现。是否有一种方法可以在运行时为我的100个文档预先计算一个向量,并且每次我看到一个新的搜索查询a,我都可以与这个预定义的向量/文档进行比较 我相信我可以通过简单地将

我试图计算一个搜索词的文本相似性,a,比如“如何制作鸡”与其他搜索词的集合。为了计算相似度,我使用余弦距离和TF-IDF将A转换为向量。我想一次将A的相似性与所有文档进行比较

目前,我的方法是迭代计算A与其他文档的余弦相似性。我有100份文件要比对。如果
cos_sim(A,X)>0.8的结果

然而,我觉得这可能不是整体相似性的真实表现。是否有一种方法可以在运行时为我的100个文档预先计算一个向量,并且每次我看到一个新的搜索查询a,我都可以与这个预定义的向量/文档进行比较


我相信我可以通过简单地将所有文档合并成一个文档来实现这一点。。。但是感觉很粗糙。利与弊以及可能的解决方案是什么?额外的效率点

这个问题本质上是传统的搜索问题:您是否尝试过将文档放入类似于或的东西中?我认为他们有一个余弦相似模型(但即使他们没有,默认的可能更好)

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

一个搜索引擎只有100个文档,这可能是过火了;您需要预先计算TF-IDF向量,并将它们保存在numpy矩阵中。然后可以使用numpy操作一次计算所有文档的点积——它将输出一个1x100的向量。分母同样可以预先计算。一个
numpy.max(numpy.dot(查询,文档)/denom)
可能足够快了

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

如果您有数千或数百万个文档可供比较,您可以查看SciKit learn的K-最近邻结构(例如,or或类似的内容)