没有循环的Python空间相似性?

2024-09-28 05:19:48 发布

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

我试图允许用户输入一个搜索词,以找到与他们的搜索匹配的前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]) 

Tags: csv方法文档importpandasnlpspacyas
2条回答

对于其他任何想解决这个问题的人来说,我发现最好的方法是在应用spacy vector nlp()后对我的文件进行pickle,然后当引用doc_list时,循环几乎是瞬间工作的!在

dfCorpusDescr = dfCorpus.fieldname
doc_list={i: nlp(i) for i in dfCorpus}
with open("filename.pickle", 'wb') as pfile:
    pickle.dump(doc_list, pfile, protocol=pickle.HIGHEST_PROTOCOL)

计算余弦相似度是一种简单的线性代数运算,可以有效地并行化。本质上,您需要计算cos(x,y)=x | y/(| x | | y |),其中⋅是内积运算符。与在给定的y上循环不同的xs不同,您可以做的是规范化y向量和x矩阵,然后执行一个简单的向量矩阵乘积。更具体地说,X是维度Nx300的文档向量矩阵(N是文档的数量,300是特征的数量),y是维度的比较向量(300,):

vector_norms = np.array([np.sqrt(np.sum(np.square(v))) for v in X])
X = (X.T / vector_norms).T
similarities = np.matmul(X, y) 
# ... perform index sorting as usual

如果需要更高的效率,这可以写在GPU加速的线性代数库上。在

相关问题 更多 >

    热门问题