受this答案的启发,我试图找到经过训练的tf-idf矢量器与新文档之间的余弦相似性,并返回相似的文档。在
下面的代码查找第一个向量的余弦相似性,而不是一个新的查询
>>> from sklearn.metrics.pairwise import linear_kernel
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
>>> cosine_similarities
array([ 1. , 0.04405952, 0.11016969, ..., 0.04433602,
0.04457106, 0.03293218])
因为我的列车数据量很大,所以在整个经过训练的矢量器中循环似乎是个坏主意。 我如何推断一个新文档的向量,并找到相关文档,与下面的代码相同?在
^{pr2}$
你应该看看gensim。示例起始代码如下所示:
在预测时,首先获得新文档的向量:
^{pr2}$然后得出相似性(按最相似的排序):
这就像你想做的那样做一个线性扫描,但是他们有一个更优化的实现。***在
对于巨大的数据集,有一种解决方案叫做按概念的文本聚类。搜索引擎使用这种技术
在第一步,您将您的文档聚类到一些组(例如50个集群),然后每个集群都有一个具有代表性的文档(其中包含一些单词,其中包含有关其集群的一些有用信息)
在第二步,为了计算新文档和您的数据集之间的余弦相似性,您将遍历所有代表(50个数字)并找到顶部附近的代表(例如2个代表性)
在最后一步中,您可以遍历选定代表中的所有文档,并找到最接近的余弦相似度
有了这种技术,你可以减少循环次数,提高性能, 你可以在这本书的某一章里读到更多的技巧:http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html
通过将向量空间模型与布尔模型相结合,可以部分解决该问题。这些都是信息论的概念,它们在ElasticSearch-一个非常好的搜索引擎中被使用(并且得到了很好的解释)。在
想法很简单:将文档存储为反向索引。这与书尾的文字相当,书中提到的书页(文件)都有参考。在
它不会计算所有文档的tf-idf向量,而是只计算至少有一个(或指定一个阈值)公共词的文档的tf-idf向量。这可以简单地通过循环查询文档中的单词来完成,使用反向索引查找也有这个单词的文档,并计算这些单词的相似度。在
相关问题 更多 >
编程相关推荐