Vấn đề của bạn có thể được giải quyết với Word2vec cũng như Doc2vec. Doc2vec sẽ cho kết quả tốt hơn vì nó tính đến các câu trong khi đào tạo mô hình.
Giải pháp Doc2vec
Bạn có thể huấn luyện mô hình doc2vec của mình theo liên kết này . Bạn có thể muốn thực hiện một số bước xử lý trước như xóa tất cả các từ dừng (các từ như "the", "an", v.v. không thêm nhiều ý nghĩa cho câu). Khi bạn đã đào tạo mô hình của mình, bạn có thể tìm thấy các câu tương tự bằng cách sử dụng mã sau đây.
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)
Các kết quả:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Các kết quả trên là danh sách các bộ dữ liệu cho (label,cosine_similarity_score)
. Bạn có thể ánh xạ đầu ra thành câu bằng cách làm train[29670]
.
Xin lưu ý rằng cách tiếp cận trên sẽ chỉ cho kết quả tốt nếu mô hình doc2vec của bạn có chứa các từ nhúng cho các từ được tìm thấy trong câu mới. Nếu bạn cố gắng có được sự giống nhau cho một số câu vô nghĩa như thế sdsf sdf f sdf sdfsdffg
, nó sẽ cho bạn một vài kết quả, nhưng đó có thể không phải là những câu tương tự thực tế vì mô hình được đào tạo của bạn có thể không nhìn thấy những từ ngữ vô nghĩa này trong khi đào tạo mô hình. Vì vậy, hãy cố gắng đào tạo mô hình của bạn trên càng nhiều câu càng tốt để kết hợp càng nhiều từ để có kết quả tốt hơn.
Giải pháp Word2vec
Nếu bạn đang sử dụng word2vec, bạn cần tính toán vectơ trung bình cho tất cả các từ trong mỗi câu và sử dụng độ tương tự cosine giữa các vectơ.
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
Tính tương tự
#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)