我试图允许用户输入一个搜索词,以找到与他们的搜索匹配的前5篇文章。我正在比较各种方法(gensim word2vec、doc2vec、nearest neighbor等)的结果/性能。在
我已经成功地创建了一些代码来利用Spacy中的标准相似性函数,但是,当它在一个大的文档列表中循环时,将相似性分数附加到pandas df中,这花费了太长的时间。在
有没有方法可以返回前5个最相似的文档而不使用loop和pandas append?原因是与其他方法相比,这个方法返回最合理的前5个文档(嵌入这个词的乐趣!)在
#load relevant libraries
import pandas as pd
import numpy as np
import spacy
#load spacy model
nlp=spacy.load('Z:\\en_core_web_lg-2.0.0')
#
#Get Doc Corpus
dfCorpus = pd.read_csv('z:\DocumentCorpus.csv', delimiter=',')
##get top 5 using spacy similarity function
SearchStringCosine = nlp(input('Enter search term:'))
computed_similarities = []
for i in dfCorpus.CorpusInput_Unqiue:
doc=nlp(i)
computed_similarities.append((i, SearchStringCosine.similarity(doc)))
computed_similarities = sorted(computed_similarities, key=lambda item: -item[1])
computed_similarities = pd.DataFrame(computed_similarities,columns= ['CorpusInput_Unique','Score'])
print(computed_similarities[:5])
对于其他任何想解决这个问题的人来说,我发现最好的方法是在应用spacy vector nlp()后对我的文件进行pickle,然后当引用doc_list时,循环几乎是瞬间工作的!在
计算余弦相似度是一种简单的线性代数运算,可以有效地并行化。本质上,您需要计算cos(x,y)=x | y/(| x | | y |),其中⋅是内积运算符。与在给定的y上循环不同的xs不同,您可以做的是规范化y向量和x矩阵,然后执行一个简单的向量矩阵乘积。更具体地说,X是维度Nx300的文档向量矩阵(N是文档的数量,300是特征的数量),y是维度的比较向量(300,):
如果需要更高的效率,这可以写在GPU加速的线性代数库上。在
相关问题 更多 >
编程相关推荐