web-dev-qa-db-ja.com

gensim.doc2vecでinfer_vectorを使用する方法は?

_def cosine(vector1,vector2):
    cosV12 = np.dot(vector1, vector2) / (linalg.norm(vector1) * linalg.norm(vector2))
    return cosV12
model=gensim.models.doc2vec.Doc2Vec.load('Model_D2V_Game')
string='民生 为了 父亲 我 要 坚强 地 ...'
list=string.split(' ')
vector1=model.infer_vector(doc_words=list,alpha=0.1, min_alpha=0.0001,steps=5)
vector2=model.docvecs.doctag_syn0[0]
print cosine(vector2,vector1)
_

-0.0232586

トレインデータを使用して_doc2vec_モデルをトレーニングします。次に、infer_vector()を使用して、トレーニング済みデータにあるドキュメントを指定してベクトルを生成します。しかし、それらは異なります。コサインの値は、_-0.0232586_モデルに保存された_vector2_とinfer_vector()によって生成された_doc2vec_の間の距離が非常に小さかった(_vector1_)。 。しかし、これは合理的ではありませんああ...

エラーが発生した場所を見つけました。代わりに 'string ='民生是了父亲我要坚强地... ''を使用する必要があります。'string= '民生是了父亲我要坚强地...' 'このように修正すると、コサイン距離は最大0.889342になります。

5
Jeffery

お気づきのとおり、infer_vector()では、_doc_words_引数がトークンのリストである必要があります。これは、モデルのトレーニングで使用されたのと同じ種類のトークン化と一致します。 (文字列を渡すと、トークン化されたリスト内のアイテムとして各個人文字が表示され、トークンのいくつかが既知の語彙であっても表示されますトークン–英語の「a」や「I」と同様に–良い結果が得られる可能性は低いです。)

さらに、infer_vector()のデフォルトパラメータは、多くのモデルにとって最適とはほど遠い場合があります。特に、より大きなsteps(少なくともモデルトレーニングの反復回数と同じ大きさですが、おそらく何倍も大きい)が役立つことがよくあります。また、開始alphaを小さくすると、おそらくバルクトレーニングの一般的なデフォルトである0.025だけで、より良い結果が得られる可能性があります。

推論がバルクトレーニングから同じベクトルに近いベクトルを取得するかどうかのテストは、推論パラメーターとそれ以前の両方での妥当なサニティチェックです。トレーニング–モデルは全体として、データ内の一般化可能なパターンを学習していますか?ただし、Doc2Vecのほとんどのモードは本質的にランダム性を使用するため、または(バルクトレーニング中に)マルチスレッドスケジューリングジッターによって導入されるランダム性の影響を受ける可能性があるため、同じ結果を期待するべきではありません。それらは一般的に近づくだけで、より多くのトレーニングの反復/ステップを実行します。

最後に、_Doc2Vec_のdocvecsコンポーネントのmost_similar()メソッドも生のベクトルを取り、最も類似した既知のベクトルのリストを返すことができることに注意してください。だからあなたは以下を試すことができます...

_ivec = model.infer_vector(doc_words=tokens_list, steps=20, alpha=0.025)
print(model.most_similar(positive=[ivec], topn=10))
_

...そして、最も類似した_(doctag, similarity_score)_ペアのトップ10のランク付けされたリストを取得します。

17
gojomo