我正在尝试让用户输入一个搜索词,以找到与其搜索匹配的前5篇文章。我正在比较各种方法(gensim word2vec、doc2vec、最近邻等)的结果/性能。
我已经成功创建了利用Spacy标准相似度函数的代码,但是,由于它需要遍历一个庞大的文档列表,并将相似度分数附加到pandas数据框中,耗时太长。
有没有一种方法可以在不使用循环和pandas追加的情况下返回最相似的前5篇文档?原因是这种方法返回的最相似的前5篇文档比其他方法更合理(这是词嵌入的乐趣所在!)
#加载相关库
import pandas as pd
import numpy as np
import spacy
#加载spacy模型
nlp=spacy.load('Z:\\en_core_web_lg-2.0.0')
#获取文档语料库
dfCorpus = pd.read_csv('z:\DocumentCorpus.csv', delimiter=',')
#使用spacy相似度函数获取前5名
SearchStringCosine = nlp(input('请输入搜索词:'))
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向量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)