Gensim Doc2vecモデル:事前にトレーニングされたdoc2vecモデルを使用して取得されたコーパスの類似性を計算する方法は?

ホセサントス

doc2vec複数のドキュメントトレーニングされたモデルがあります。そのモデルを使用して、比較のためのコーパスとして使用したい別のドキュメントのベクトルを推測したいと思います。したがって、紹介する文に最も類似した文を探すときは、トレーニングされたコーパスの代わりにこの新しいドキュメントベクトルを使用します。現在、を使用しinfer_vector()て新しいドキュメントの各文のベクトルを計算していますが、most_similar()取得したベクトルのリストで関数を使用することはできませんKeyedVectors。である必要があります

most_similar()関数の使用を可能にする新しいドキュメントのこれらのベクトルを計算できる方法があるかどうか、または新しいドキュメントの各文と文Iの間の類似性を計算する必要があるかどうかを知りたいです個別に紹介します(この場合、2つのベクトル間のコサイン類似度を計算できるGensimの実装はありますか?)。

私はGensimとNLPに不慣れであり、あなたの提案を受け入れます。

大学向けのプロジェクトなので、完全なコードを提供することはできませんが、ここで私が問題を抱えている主要な部分があります。

データの前処理を行った後、モデルをトレーニングする方法は次のとおりです。

documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(train_data)]
assert gensim.models.doc2vec.FAST_VERSION > -1

cores = multiprocessing.cpu_count()

doc2vec_model = Doc2Vec(vector_size=200, window=5, workers=cores)
doc2vec_model.build_vocab(documents)
doc2vec_model.train(documents, total_examples=doc2vec_model.corpus_count, epochs=30)

新しいドキュメントのベクトルを次のように計算しようとしています。

questions = [doc2vec_model.infer_vector(line) for line in lines_4]

次に、新しいドキュメントベクトルと入力フレーズの間の類似性を計算しようとします。

text = str(input('Me: '))

tokens = text.split()

new_vector = doc2vec_model.infer_vector(tokens)

index = questions[i].most_similar([new_vector])
デニス・ゴルデーエフ

約1か月前にgensim == 3.2.0で使用したダーティソリューション(構文が変更された可能性があります)。

推測されたベクトルをKeyedVectors形式で保存できます。

from gensim.models import KeyedVectors
from gensim.models.doc2vec import Doc2Vec
vectors = dict()
# y_names = doc2vec_model.docvecs.doctags.keys()
y_names = range(len(questions))

for name in y_names:
    # vectors[name] = doc2vec_model.docvecs[name]
    vectors[str(name)] = questions[name]
f = open("question_vectors.txt".format(filename), "w")
f.write("")
f.flush()
f.close()
f = open("question_vectors.txt".format(filename), "a")
f.write("{} {}\n".format(len(questions), doc2vec_model.vector_size))
for v in vectors:
    line = "{} {}\n".format(v, " ".join(questions[v].astype(str)))
    f.write(line)
f.close()

次に、most_similar関数をロードして使用できます

keyed_model = KeyedVectors.load_word2vec_format("question_vectors.txt")
keyed_model.most_similar(str(list(y_names)[0]))

別の解決策(特に、質問の数がそれほど多くない場合)は、質問をnp.arrayに変換し、コサイン距離を取得することです)。

import numpy as np

questions = np.array(questions)
texts_norm = np.linalg.norm(questions, axis=1)[np.newaxis].T
norm = texts_norm * texts_norm.T

product = np.matmul(questions, questions.T)
product = product.T / norm

# Otherwise the item is the closest to itself
for j in range(len(questions)):
    product[j, j] = 0

# Gives the top 10 most similar items to the 0th question
np.argpartition(product[0], 10)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ