Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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 我可以优化这个单词移动器吗';s距离查找功能?_Python_Python Multiprocessing_Dask_Gensim_Wmd - Fatal编程技术网

Python 我可以优化这个单词移动器吗';s距离查找功能?

Python 我可以优化这个单词移动器吗';s距离查找功能?,python,python-multiprocessing,dask,gensim,wmd,Python,Python Multiprocessing,Dask,Gensim,Wmd,我试图用Python中Gensim的Word2Vec工具测量大量文本之间的单词移动距离。我将每个文本与所有其他文本进行比较,因此我首先使用itertools创建成对组合,如[1,2,3]->[(1,2)、(1,3)、(2,3)]。为了记忆起见,我没有通过在一个大数据框中重复所有文本来进行组合,而是使用文本索引创建一个参考数据框组合,如下所示: 0 1 0 0 1 1 0 2 2 0 3 然后在比较函数中,我使用这些索引来查找原始数据框中的文本。这个解决方案工

我试图用Python中Gensim的Word2Vec工具测量大量文本之间的单词移动距离。我将每个文本与所有其他文本进行比较,因此我首先使用itertools创建成对组合,如
[1,2,3]->[(1,2)、(1,3)、(2,3)]
。为了记忆起见,我没有通过在一个大数据框中重复所有文本来进行组合,而是使用文本索引创建一个参考数据框
组合
,如下所示:

    0   1
0   0   1
1   0   2
2   0   3
然后在比较函数中,我使用这些索引来查找原始数据框中的文本。这个解决方案工作得很好,但我想知道我是否能够在大数据集上使用它。例如,我有一个300000行的文本数据集,这让我在笔记本电脑上进行了大约100年的计算:

C2​(300000) = 300000​! / (2!(300000−2))!
           = 300000⋅299999​ / 2 * 1
           = 44999850000 combinations
有什么方法可以更好地优化它吗

我现在的代码:

import multiprocessing
import itertools
import numpy as np
import pandas as pd
import dask.dataframe as dd
from dask.diagnostics import ProgressBar
from gensim.models.word2vec import Word2Vec
from gensim.corpora.wikicorpus import WikiCorpus

def get_distance(row):
    try: 
        sent1 = df.loc[row[0], 'text'].split()
        sent2 = df.loc[row[1], 'text'].split()
        return model.wv.wmdistance(sent1, sent2)  # Compute WMD
    except Exception as e:
        return np.nan

df = pd.read_csv('data.csv')

# I then set up the gensim model, let me know if you need that bit of code too.

# Make pairwise combination of all indices
combinations = pd.DataFrame(itertools.combinations(df.index, 2))

# To dask df and apply function
dcombinations = dd.from_pandas(combinations, npartitions= 2 * multiprocessing.cpu_count())
dcombinations['distance'] = dcombinations.apply(get_distance, axis=1)
with ProgressBar():
    combinations = dcombinations.compute()
您可以使用它来提高性能。但是,您首先必须将模型转换为spaCy,并使用其网页上描述的SimilarityHook:

import spacy
import wmd

nlp = spacy.load('en_core_web_md')
nlp.add_pipe(wmd.WMD.SpacySimilarityHook(nlp), last=True)
doc1 = nlp("Politician speaks to the media in Illinois.")
doc2 = nlp("The president greets the press in Chicago.")
print(doc1.similarity(doc2))
您可以使用它来提高性能。但是,您首先必须将模型转换为spaCy,并使用其网页上描述的SimilarityHook:

import spacy
import wmd

nlp = spacy.load('en_core_web_md')
nlp.add_pipe(wmd.WMD.SpacySimilarityHook(nlp), last=True)
doc1 = nlp("Politician speaks to the media in Illinois.")
doc2 = nlp("The president greets the press in Chicago.")
print(doc1.similarity(doc2))