我正在使用gensim wmdistance计算引用句和其他1000个句子之间的相似度。
model = gensim.models.KeyedVectors.load_word2vec_format(
'GoogleNews-vectors-negative300.bin', binary=True)
model.init_sims(replace=True)
reference_sentence = "it is a reference sentence"
other_sentences = [1000 sentences]
index = 0
for sentence in other_sentences:
distance [index] = model.wmdistance(refrence_sentence, other_sentences)
index = index + 1根据gensim 源代码,model.wmdistance返回以下内容:
emd(d1, d2, distance_matrix)哪里
d1 = # Compute nBOW representation of reference_setence.
d2 = # Compute nBOW representation of other_sentence (one by one).
distance_matrix = see the source code as its a bit too much to paste it here.对于我的用例,这段代码在两方面效率低下。
1)对于参考句,对距离函数emd(d1, d2, distance_matrix)重复计算emd(d1, d2, distance_matrix) (1000次)。
2)该距离函数由来自不同点的多个用户调用,对同一model.wmdistance(doc1, doc2)重复整个other_sentences过程,计算量大。对于这1000次的比较,大约需要7-8秒。
因此,我想把这两项任务分开。距离的最终计算:emd(d1, d2, distance_matrix)和这些输入的准备: d1,d2和距离矩阵。由于距离矩阵依赖于两者,因此至少应该将其输入准备与最终的矩阵计算隔离开来。
我最初的计划是创建三个自定义函数:
d1 = prepared1(reference_sentence)
d2 = prepared2(other_sentence)
distance_matrix inputs = prepare inputs 使用这个gensim函数可以做到这一点吗?还是应该使用我自己的自定义版本?有更好的方法来解决这个问题吗?
发布于 2017-08-30 22:56:35
您正确地注意到,可以对此代码进行重构和优化,以避免重复操作,特别是在对一个引用/查询文档根据更大的文档集进行评估的常见情况下。(任何这样的改进也将是对gensim的一个可喜的贡献。)
在计算之外简单地准备单个文档可能不会带来很大的节省;在每种情况下,都必须计算两个文档之间的所有字对字距离。预先计算一个更大的distance_matrix (在相关词汇表和系统内存允许的范围内)可能是有意义的,它包含了许多成对大规模毁灭性武器计算所需的所有单词。
(尽管预先计算出所有单词到单词的距离是很有诱惑力的,但词汇量只有300万单词,比如GoogleNews向量集,而只有4字节的浮点距离,存储它们至少需要18 to。因此,在可管理的文档批次上计算相关单词的距离可能更有意义。)
一种可能的方法是创建一个wmdistance()的变体,它可以显式地处理一个文档和一组文档,因此可以将创建直方图/距离矩阵结合起来,以便同时进行多个比较。
对于不需要所有大规模毁灭性武器值,但只需要最接近的结果的情况,在最初的大规模毁灭性武器文件中描述了一个优化,可以使用另一种更快的计算(称为“RWMD”)来推断文档不可能出现在顶层-N结果中,从而跳过对这些文档的完整大规模毁灭性武器计算。
https://stackoverflow.com/questions/45960671
复制相似问题