Ihr Problem kann sowohl mit Word2vec als auch mit Doc2vec gelöst werden. Doc2vec würde bessere Ergebnisse liefern, da es beim Trainieren des Modells Sätze berücksichtigt.
Doc2vec-Lösung
Über diesen Link können Sie Ihr doc2vec-Modell trainieren . Möglicherweise möchten Sie einige Vorverarbeitungsschritte ausführen, z. B. das Entfernen aller Stoppwörter (Wörter wie "the", "an" usw., die dem Satz nicht viel Bedeutung verleihen). Sobald Sie Ihr Modell trainiert haben, können Sie die ähnlichen Sätze mit folgendem Code finden.
import gensim
model = gensim.models.Doc2Vec.load('saved_doc2vec_model')
new_sentence = "I opened a new mailbox".split(" ")
model.docvecs.most_similar(positive=[model.infer_vector(new_sentence)],topn=5)
Ergebnisse:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Die obigen Ergebnisse sind eine Liste von Tupeln für (label,cosine_similarity_score)
. Sie können die Ausgaben auf Sätze abbilden, indem Sie tun train[29670]
.
Bitte beachten Sie, dass der oben beschriebene Ansatz nur dann gute Ergebnisse liefert, wenn Ihr doc2vec-Modell Einbettungen für Wörter enthält, die im neuen Satz gefunden wurden. Wenn Sie versuchen, Ähnlichkeit für einen Kauderwelsch-Satz wie zu erhalten sdsf sdf f sdf sdfsdffg
, erhalten Sie nur wenige Ergebnisse, aber dies sind möglicherweise nicht die tatsächlich ähnlichen Sätze, da Ihr trainiertes Modell diese Kauderwelsch-Wörter möglicherweise beim Trainieren des Modells nicht gesehen hat. Versuchen Sie also, Ihr Modell in so vielen Sätzen wie möglich zu trainieren, um so viele Wörter wie möglich zu integrieren, um bessere Ergebnisse zu erzielen.
Word2vec-Lösung
Wenn Sie word2vec verwenden, müssen Sie den Durchschnittsvektor für alle Wörter in jedem Satz berechnen und die Kosinusähnlichkeit zwischen den Vektoren verwenden.
def avg_sentence_vector(words, model, num_features, index2word_set):
#function to average all words vectors in a given paragraph
featureVec = np.zeros((num_features,), dtype="float32")
nwords = 0
for word in words:
if word in index2word_set:
nwords = nwords+1
featureVec = np.add(featureVec, model[word])
if nwords>0:
featureVec = np.divide(featureVec, nwords)
return featureVec
Ähnlichkeit berechnen
#get average vector for sentence 1
sentence_1 = "this is sentence number one"
sentence_1_avg_vector = avg_sentence_vector(sentence_1.split(), model=word2vec_model, num_features=100)
#get average vector for sentence 2
sentence_2 = "this is sentence number two"
sentence_2_avg_vector = avg_sentence_vector(sentence_2.split(), model=word2vec_model, num_features=100)
sen1_sen2_similarity = cosine_similarity(sentence_1_avg_vector,sentence_2_avg_vector)