आपकी समस्या Word2vec के साथ-साथ Doc2vec से हल की जा सकती है। Doc2vec बेहतर परिणाम देगा क्योंकि यह मॉडल को प्रशिक्षित करते समय वाक्यों को ध्यान में रखता है।
Doc2vec समाधान
आप इस लिंक के बाद अपने doc2vec मॉडल को प्रशिक्षित कर सकते हैं । आप कुछ पूर्व-प्रसंस्करण कदम जैसे सभी स्टॉप शब्द ("जैसे", "ए", आदि जो वाक्य में बहुत अर्थ नहीं जोड़ते हैं) को हटाना चाहते हैं । एक बार जब आप अपने मॉडल को प्रशिक्षित करते हैं, तो आप निम्न कोड का उपयोग करके समान वाक्य पा सकते हैं।
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 समाधान
यदि आप 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)