Вашу проблему можна вирішити як з 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)]
Наведені вище результати - список кортежів для (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)