Masalah Anda dapat diselesaikan dengan Word2vec serta Doc2vec. Doc2vec akan memberikan hasil yang lebih baik karena memperhitungkan kalimat saat melatih model.
Solusi Doc2vec
Anda dapat melatih model doc2vec Anda dengan mengikuti tautan ini . Anda mungkin ingin melakukan beberapa langkah pra-pemrosesan seperti menghapus semua kata berhenti (kata-kata seperti "the", "an", dll. Yang tidak menambah banyak arti pada kalimat). Setelah Anda melatih model Anda, Anda dapat menemukan kalimat yang sama menggunakan kode berikut.
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)
Hasil:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Hasil di atas adalah daftar tuple untuk (label,cosine_similarity_score)
. Anda dapat memetakan output ke kalimat dengan melakukan train[29670]
.
Harap dicatat bahwa pendekatan di atas hanya akan memberikan hasil yang baik jika model doc2vec Anda berisi embeddings untuk kata-kata yang ditemukan dalam kalimat baru. Jika Anda mencoba untuk mendapatkan kesamaan untuk beberapa kalimat omong kosong seperti sdsf sdf f sdf sdfsdffg
, itu akan memberi Anda beberapa hasil, tetapi itu mungkin bukan kalimat serupa yang sebenarnya karena model terlatih Anda mungkin belum melihat kata-kata omong kosong ini saat melatih model. Jadi cobalah latih model Anda pada kalimat sebanyak mungkin untuk memasukkan sebanyak mungkin kata untuk hasil yang lebih baik.
Solusi Word2vec
Jika Anda menggunakan word2vec, Anda perlu menghitung vektor rata-rata untuk semua kata dalam setiap kalimat dan menggunakan persamaan cosinus antara vektor.
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
Hitung Kesamaan
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)