Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化Gensim字移动器&x27;速度的s距离功能(wmdistance)_Python_Nlp_Nltk_Gensim_Word2vec - Fatal编程技术网

Python 优化Gensim字移动器&x27;速度的s距离功能(wmdistance)

Python 优化Gensim字移动器&x27;速度的s距离功能(wmdistance),python,nlp,nltk,gensim,word2vec,Python,Nlp,Nltk,Gensim,Word2vec,我正在使用gensimwmdistance计算参考句子和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

我正在使用
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) 对于参考语句,它重复计算距离函数的d1(1000次)
emd(d1,d2,距离矩阵)

2) 此距离函数由来自不同点的多个用户调用,这些用户对相同的其他句子重复整个
model.wmdistance(doc1,doc2)
过程,因此计算成本较高。对于这1000次比较,大约需要7-8秒

因此,我想把这两项任务分开。距离的最终计算:
emd(d1、d2、距离矩阵)
以及这些输入的准备:d1、d2和距离矩阵。由于距离矩阵取决于两者,因此至少其输入准备应与最终矩阵计算分离

我最初的计划是创建三个定制功能:

d1 = prepared1(reference_sentence)
d2 = prepared2(other_sentence)
distance_matrix inputs = prepare inputs 

是否可以使用此
gensim
功能执行此操作,或者我应该使用自己的自定义版本?有没有更好地处理此问题的想法和解决方案?

您可以正确地看到,此代码可以进行重构和优化,以避免重复操作,特别是在一个引用/查询文档与一组更大的文档进行比较的常见情况下。(任何这样的改进都将是对gensim的一个值得欢迎的贡献。)

简单地在计算之外准备单个文档可能不会带来很大的节约;在每种情况下,必须计算两个文档之间的所有字到字距离。在相关词汇表和系统内存允许的范围内,预先计算一个较大的距离矩阵(包括许多成对大规模杀伤性武器计算所需的所有单词)可能是有意义的

(尽管预先计算所有单词到单词的距离很诱人,但像谷歌新闻(GoogleNews)这样的300万单词的词汇表和仅仅4字节的浮动距离,存储它们至少需要18TB。因此,在可管理的文档批次上计算相关单词的距离可能更有意义。)

一种可能的开始方式是创建一个变量
wmdistance()
,该变量显式地作用于一个文档而不是一组文档,因此可以组合创建直方图/距离矩阵,以便一次进行多次比较


对于不需要所有WMD值,但只需要前N个最接近的结果的常见情况,原始WMD论文中描述了一种优化方法,可以使用另一种更快的计算(称为“RWMD”)来推断文档不可能出现在前N个结果中,因此,完全跳过这些文档的完整大规模杀伤性武器计算。

那么让我来探讨RWMD选项。wmd相似性(wmd_语料库,模型,num_best=10)与RWMD不一样吗?你必须检查一下这篇论文中RWMD的定义。虽然已经开始了一些工作,但我不相信gensim代码还能够执行这种优化。为了找到10个最接近的项目,它计算所有项目的WMD,没有快捷方式/优化,然后排序以仅返回10个最小距离。啊,好的。我将以一种方式对其进行修改,即在单独的函数中为单个文档计算单词向量和nbow向量。这应该可以节省我很多时间,因为我用一个参考来比较数千个项目。如果您希望在gensim中将问题作为wmdistance变量,我可以将其作为功能请求启动。您是否编写了自定义解决方案?