ปัญหาของคุณสามารถแก้ไขได้ด้วย Word2vec เช่นเดียวกับ Doc2vec Doc2vec จะให้ผลลัพธ์ที่ดีขึ้นเพราะต้องคำนึงถึงประโยคในขณะฝึกอบรมโมเดล
โซลูชัน Doc2vec
คุณสามารถฝึกอบรมรุ่น doc2vec ของคุณตามลิงก์นี้ คุณอาจต้องการดำเนินการขั้นตอนล่วงหน้าบางขั้นตอนเช่นลบคำหยุดทั้งหมด(คำเช่น "the", "an" ฯลฯ ที่ไม่ได้เพิ่มความหมายให้กับประโยคมากนัก) เมื่อคุณฝึกฝนแบบจำลองของคุณคุณสามารถค้นหาประโยคที่คล้ายกันโดยใช้รหัสต่อไปนี้
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)
ผล:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
ผลดังกล่าวข้างต้นเป็นรายการของ tuples (label,cosine_similarity_score)
สำหรับ train[29670]
คุณสามารถแมผลประโยคด้วยการทำ
โปรดทราบว่าวิธีการข้างต้นจะให้ผลลัพธ์ที่ดีหากรุ่น doc2vec ของคุณมีงานแต่งงานสำหรับคำที่พบในประโยคใหม่ หากคุณพยายามที่จะได้รับความคล้ายคลึงกันสำหรับประโยคซึ่งพูดพล่อยๆเช่นsdsf sdf f sdf sdfsdffg
นั้นมันจะให้ผลลัพธ์น้อย แต่คุณอาจจะไม่ได้เป็นประโยคที่คล้ายกันจริงตามที่แบบจำลองการฝึกอบรมของคุณอาจไม่เห็นคำพูดซึ่งพูดพล่อยๆเหล่านี้ ดังนั้นลองฝึกโมเดลของคุณให้มากที่สุดเท่าที่จะเป็นไปได้เพื่อรวมประโยคต่างๆเพื่อให้ได้ผลลัพธ์ที่ดียิ่งขึ้น
Word2vec Solution
หากคุณใช้ word2vec คุณจะต้องคำนวณเวกเตอร์เฉลี่ยสำหรับทุกคำในทุกประโยคและใช้ความคล้ายคลึงโคไซน์ระหว่างเวกเตอร์
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
คำนวณความคล้ายคลึงกัน
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)