参考文と1000文の類似度の計算にはgensim
wmdistance
を使用しています。速度(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
はgensim
source 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つのカスタマイズされた関数を作成するのですか?どのようなアイデアや解決策をより良い方法でこの問題に対処するには?
RWMDのオプションを調べてみましょう。 WmdSimilarity(wmd_corpus、model、num_best = 10)はRWMDと同じですか? – utengr
RWMDの定義については、このペーパーをチェックする必要があります。いくつかの作業が開始されましたが、私はgensimコードがまだその最適化を実行しているとは思いません。 10個の最も近いアイテムを見つけるために、ショートカット/最適化なしで* all *アイテムのWMDを計算し、次に最小10個の距離を返すようにソートします。 – gojomo
ああ大丈夫。別の関数で1つの文書に対して単語ベクトルと桁ベクトルを計算する方法で修正します。何千ものアイテムを1つの参照と比較するので、時間を節約することができます。あなたがgensimでwmdistanceの変種として望むなら、私は機能要求として問題を開始することができます。 – utengr