Sorununuz Word2vec ve Doc2vec ile çözülebilir. Doc2vec daha iyi sonuçlar verir çünkü modeli eğitirken cümleleri dikkate alır.
Doc2vec çözümü
Bu bağlantıyı izleyerek doc2vec modelinizi eğitebilirsiniz . Tüm durdurma sözcüklerini ("cümle'ye fazla bir anlam katmayan", "," an "vb.) Kaldırmak gibi bazı ön işleme adımları uygulamak isteyebilirsiniz . Modelinizi eğittikten sonra, aşağıdaki kodları kullanarak benzer cümleler bulabilirsiniz.
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)
Sonuçlar:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Yukarıdaki sonuçlar için tuples listesi (label,cosine_similarity_score)
. Çıktıları cümlelerle eşleyerek eşleştirebilirsiniz train[29670]
.
Yukarıdaki yaklaşımın yalnızca doc2vec modelinizde yeni cümlede bulunan kelimeler için düğünler varsa iyi sonuçlar vereceğini lütfen unutmayın. Gibi bazı anlamsız cümle için benzerlik elde etmeye çalışırsanız sdsf sdf f sdf sdfsdffg
, size birkaç sonuç verecektir, ancak bunlar gerçek antrenman modeliniz olmayabilir, çünkü eğitimli modeliniz modeli eğitirken bu anlamsız kelimeleri görmemiş olabilir. Bu nedenle, daha iyi sonuçlar elde etmek için modelinizi mümkün olduğunca çok cümle üzerinde eğitmeye çalışın.
Word2vec Çözümü word2vec
kullanıyorsanız, her cümledeki tüm kelimeler için ortalama vektörü hesaplamanız ve vektörler arasında kosinüs benzerliğini kullanmanız gerekir.
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
Benzerliği Hesapla
from sklearn.metrics.pairwise import cosine_similarity
#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)