计算mover distance的问题,速度太慢了

任务

要用1000篇文章来跟数据集里面的9722篇文章做一个mover distance的计算,总共要求的9722000个结果,但是现在每个结果平均都要两秒以上,有可能更慢。用了多线程,开了10个线程也快不起来。电脑是128G内存,CPU是i7-6855。请大神指教,谢谢!

源码

#!/usr/bin/python
# -*- encoding:utf-8 -*-

"""
@author : kelvin
@file : wmd_demo
@time : 2017/2/27 13:40
@description :

"""
from __future__ import division
import threading
import numpy as np
from gensim.models import Word2Vec
from sklearn.feature_extraction.text import CountVectorizer
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)


# 将9722篇文档读入,并以列表方式存储
def read_file():
    doc = []
    f = open("G:\yang\MMSED-Text\Metadata_Text_100.txt")
    for line in f.readlines():
        f_split = line.split(':::')
        path = f_split[6]
        docpath = path.replace('C:\Users\zhengyang5\Workspaces\MyEclipse MMSED\EmptyWikiProcessing\Text20161007','G:\yang\MMSED-Text\Text20161007')
        #print docpath
        docpath = docpath.replace('\n','') #去除路径最后的换行符
        doc_file = open(docpath)
        doc.append(doc_file.read())   # 每篇文档是列表中的一个元素
        doc_file.close()
    f.close()
    return doc


def word_mover_distance(d1,d2):
    """
    用了word2vec的方法,计算文档相似度,以及mover distance
    :param d1:文档一
    :param d2:文档二
    :return:cosine相似度以及mover distance
    """
    # d1 = "Government speaks to the media in Illinois"
    # d2 = "The president addresses the press"

    # 去除不在word2vec中的词
    vocabulary = [w for w in set(d1.lower().split() + d2.lower().split()) if w in model.wv.vocab]
    vect = CountVectorizer(vocabulary=vocabulary).fit([d1, d2])
    v_1, v_2 = vect.transform([d1, d2])
    v_1 = v_1.toarray().ravel()
    v_2 = v_2.toarray().ravel()

    from sklearn.metrics import euclidean_distances
    W_ = np.array([model[w] for w in vect.get_feature_names() if w in model])
    D_ = euclidean_distances(W_)
    D_ = D_.astype(np.double)
    D_ /= D_.max()  # just for comparison purposes

    from pyemd import emd  
    
    def emd_d(v_1, v_2):
        # pyemd needs double precision input        
        v_1 = v_1.toarray().ravel()
        v_2 = v_2.toarray().ravel()
        v_1 = v_1.astype(np.double)
        v_2 = v_2.astype(np.double)
        v_1 /= v_1.sum()
        v_2 /= v_2.sum()
        mover_dis = float(emd(v_1, v_2, D_))
        return mover_dis
    v_1, v_2 = vect.transform([d1, d2])
    mover_dis = emd_d(v_1, v_2)
    return mover_dis


def get_text_num(num):
    text_num = []
    num_file = open("G:\yang\MMSED-Text\Text_Index1_10.txt")
    for line in num_file.readlines()[num:num+10]:      # 10篇为间隔, num为开始的数
        line = line.strip('\n')
        text_num.append(int(line)-1)
    num_file.close()
    return text_num


def loop_file_thread(n):    # 从第几篇开始,取10篇来算
    text = get_text_num(n)
    mover_thread = []
    for num in text:
        doc1 = doc[num]
        mover_doc1 = []    # 所有9722文档与doc1比较的mover distance存到列表中
        for doc2 in doc:
            mover = word_mover_distance(str(doc1), str(doc2))  # 调用函数计算两个值
            mover_doc1.append(mover)            
        mover_thread.append(mover_doc1)
        print 'Finish one 9722 compare'
    save_txt(mover_thread, 'mov_'+str(n)+'_'+str(n+10)+'.txt')


def save_txt(mover_distance, fname):    # 存文件
    mover_dis_matrix = np.array(mover_distance)
    print mover_dis_matrix.shape
    np.savetxt(fname, mover_dis_matrix, delimiter=',', fmt='%10.8f')


if __name__ == '__main__':
    # 载入googleNews的word2vec模型
    model = Word2Vec.load_word2vec_format("G:\yang\MMSED-Text\GoogleNews-vectors-negative300.bin", binary=True)
    # 读入所有文档
    doc = read_file() 
    print "Please wait.I'm caculating......"
    # 定义任意个线程
    for i in range(0,10):
        t = threading.Thread(target=loop_file_thread, args={10*i})
        t.setDaemon(True)
        t.start()
    t.join()           # 子进程完成后才能进入父进程
    print 'all finish!!'

怎样才能快点啊,这个问题困扰了我两天啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 地球移动距离(Earth Mover's Distance)是一种用于衡量两个概率分布之间距离的度量方法。它可以计算将一个分布中的质量转移到另一个分布所需的最小成本。具体来说,该方法将两个分布视为在一个二维平面上的两个高度分别为其概率密度函数的堆积物。将一个堆积物转化为另一个堆积物需要一定的成本,成本可以通过两个堆积物中任意两个点之间的距离来衡量。因此,地球移动距离计算的是将一个堆积物变成另一个堆积物的最小成本。 ### 回答2: 地球移动距离(Earth Mover’s Distance,EMD)是一种测量两个概率分布之间差异的度量方法。EMD起源于土木工程领域的物流问题,其基本思想是将一种物质从一个地方运到另一个地方所需的费用。具体来说,如果将两个分布看作分别由一定数量的质量点组成的物质分布,那么它们之间的EMD就是将其中一个分布变化到另一个分布所需的最小运输成本。 EMD通过计算两个分布之间在距离-质量空间中的总移动量来测量它们之间的距离。这个移动量可以被看作是将一个分布中的质量“移动”到另一个分布中所需的最小成本。这种距离度量方法不仅适用于各种类型的分布,而且它可以处理不同尺度、矩阵或多维分布。 EMD在实际中具有广泛的应用。例如,它可以被用于测量图像之间的相似性,文本之间的相似性,以及基因组和蛋白质序列之间的相似性。在计算机视觉中,EMD已经被广泛应用于图像检索、图像分类和目标跟踪等领域。在自然语言处理中,EMD被用于测量文档的相似性和主题模型之间的距离等。此外,在计算生物学和生物信息学领域,EMD也被用于DNA和RNA序列之间的相似性测量。 总的来说,EMD是一种强大的距离度量方法,可以在各种领域中得到广泛应用。它不仅可以用于测量不同类型的概率分布之间的差异,而且可以处理多维和矩阵分布。通过使用EMD,我们可以更好地理解数据之间的相似性和差异,从而更好地解决现实中的问题。 ### 回答3: 地球移动距离(Earth Mover's Distance)是用于测量两个概率分布之间的距离的度量工具。该度量工具最初用于解决计算机视觉中图像相似性的问题。它是一种基于距离的方法,它考虑了两个分布之间的配置差异,可以通过其能量最小化的代价来计算。 地球移动距离通过计算将一个分布变换到另一个所需的最小成本来量化两个分布之间的差异。这种成本可以被视为每个“单位”从一个分布到另一个分布的成本。例如,如果我们正在比较两个物体的颜色分布,那么将一个RGB颜色从一个分布移到另一个分布的成本可以是两个RGB颜色之间的欧氏距离。地球移动距离考虑了这些成本,并计算了将一个分布变成另一个分布所需的最小成本。 在计算机视觉中,地球移动距离经常用于图像检索,场景分类和目标跟踪等任务中。通常将图像的特征表示为概率分布,然后使用地球移动距离来比较这些分布,以确定它们之间的相似性。 总之,地球移动距离是一种将两个概率分布之间的距离量化为成本的方法。它可以应用于各种计算机视觉应用程序中,并已被证明具有高效性和有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值