pythontfidf预测了一个新的文档相似度

2024-04-19 14:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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}$

Tags: 答案代码文档tf矢量this相似性kernel
3条回答

你应该看看gensim。示例起始代码如下所示:

from gensim import corpora, models, similarities

dictionary = corpora.Dictionary(line.lower().split() for line in open('corpus.txt'))
corpus = [dictionary.doc2bow(line.lower().split()) for line in open('corpus.txt')]

tfidf = models.TfidfModel(corpus)
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=12)

在预测时,首先获得新文档的向量:

^{pr2}$

然后得出相似性(按最相似的排序):

sims = index[vec_tfidf] # perform a similarity query against the corpus
print(list(enumerate(sims))) # print (document_number, document_similarity) 2-tuples

这就像你想做的那样做一个线性扫描,但是他们有一个更优化的实现。***在

对于巨大的数据集,有一种解决方案叫做按概念的文本聚类。搜索引擎使用这种技术

在第一步,您将您的文档聚类到一些组(例如50个集群),然后每个集群都有一个具有代表性的文档(其中包含一些单词,其中包含有关其集群的一些有用信息)
在第二步,为了计算新文档和您的数据集之间的余弦相似性,您将遍历所有代表(50个数字)并找到顶部附近的代表(例如2个代表性)
在最后一步中,您可以遍历选定代表中的所有文档,并找到最接近的余弦相似度

有了这种技术,你可以减少循环次数,提高性能, 你可以在这本书的某一章里读到更多的技巧:http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

通过将向量空间模型布尔模型相结合,可以部分解决该问题。这些都是信息论的概念,它们在ElasticSearch-一个非常好的搜索引擎中被使用(并且得到了很好的解释)。在

想法很简单:将文档存储为反向索引。这与书尾的文字相当,书中提到的书页(文件)都有参考。在

它不会计算所有文档的tf-idf向量,而是只计算至少有一个(或指定一个阈值)公共词的文档的tf-idf向量。这可以简单地通过循环查询文档中的单词来完成,使用反向索引查找也有这个单词的文档,并计算这些单词的相似度。在

相关问题 更多 >