2017-08-30 12 views
0

参考文と1000文の類似度の計算にはgensimwmdistanceを使用しています。速度(wmdistance)のためのGensimワードムーバーの距離関数の最適化

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 

gensimsource codeによると、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. 

このコードは私のユースケースのための2つの方法で非効率的です。

1)参考文の場合、距離関数emd(d1, d2, distance_matrix)のd1(1000回)を繰り返し計算しています。

2)この距離関数は、異なる点から複数のユーザによって呼び出され、同じ他の点についてこの全プロセスを繰り返す。それは計算上高価である。model.wmdistance(doc1, doc2)この1000回の比較では、約7〜8秒かかります。

したがって、私は2つのタスクを分離したいと思います。距離の最終計算:emd(d1, d2, distance_matrix)およびこれらの入力の準備:d1、d2および距離行列。距離行列は両方に依存するので、少なくともその入力準備は最終行列計算から分離されるべきである。

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

それがこのgensim機能でこれを行うのか、私はちょうど私の自身のカスタマイズしたバージョンを行くべきことは可能です:

私の当初の計画では、3つのカスタマイズされた関数を作成するのですか?どのようなアイデアや解決策をより良い方法でこの問題に対処するには?

答えて

1

このコードは、繰り返し操作を避けるために、特に1つの参照/照会文書が大きな文書セットに対して評価される一般的なケースでは、リファクタリングすることができます。 (そのような改良は、歓迎された元気な貢献でもあります。)

計算の外に単一のドキュメントを準備するだけでは大きな節約効果が得られない場合があります。いずれの場合も、2つの文書間の単語間距離はすべて計算される。多くのペアワイズWMD計算に必要なすべての単語を含む、より大きなdistance_matrix(関連する語彙&システムメモリが許す限り)を事前に計算することは意味があります。

GoogleNewsベクトルセットのような3百万語の語彙と単なる4バイトの浮動距離ですべての単語間距離を事前計算することができるので魅力的ですが、それらをすべて格納すると少なくとも

wmdistance()のバリアントを作成することが考えられます。wmdistance()は、1つのドキュメントで明示的に動作するものと、1つのドキュメントで動作するものがあります。多くの比較のために一度にヒストグラム/距離行列の作成を組み合わせることができる。

WMD値ではなく、上位Nの最も近い結果を望む場合は、別の高速計算(RWMDと呼ばれます)を使用できる元のWMD論文に記載されている最適化があります。ドキュメントがトップNの結果になる可能性がないことを推測することで、これらのドキュメントの完全なWMD計算をスキップすることができます。

+0

RWMDのオプションを調べてみましょう。 WmdSimilarity(wmd_corpus、model、num_best = 10)はRWMDと同じですか? – utengr

+0

RWMDの定義については、このペーパーをチェックする必要があります。いくつかの作業が開始されましたが、私はgensimコードがまだその最適化を実行しているとは思いません。 10個の最も近いアイテムを見つけるために、ショートカット/最適化なしで* all *アイテムのWMDを計算し、次に最小10個の距離を返すようにソートします。 – gojomo

+0

ああ大丈夫。別の関数で1つの文書に対して単語ベクトルと桁ベクトルを計算する方法で修正します。何千ものアイテムを1つの参照と比較するので、時間を節約することができます。あなたがgensimでwmdistanceの変種として望むなら、私は機能要求として問題を開始することができます。 – utengr

関連する問題