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]
コメントを追加