Twój problem można rozwiązać za pomocą Word2vec oraz Doc2vec. Doc2vec dałby lepsze wyniki, ponieważ bierze pod uwagę zdania podczas szkolenia modelu.
Rozwiązanie Doc2vec
Możesz trenować swój model doc2vec, klikając ten link . Możesz wykonać kilka czynności wstępnego przetwarzania, takich jak usunięcie wszystkich słów stop (słowa takie jak „the”, „an” itp., Które nie dodają większego znaczenia do zdania). Po wytrenowaniu modelu możesz znaleźć podobne zdania, używając następującego kodu.
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)
Wyniki:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Powyższe wyniki to lista krotek dla (label,cosine_similarity_score)
. W ten sposób możesz odwzorować wyniki na zdania train[29670]
.
Należy pamiętać, że powyższe podejście da dobre wyniki tylko wtedy, gdy model doc2vec zawiera osadzenia słów znalezionych w nowym zdaniu. Jeśli spróbujesz uzyskać podobieństwo do jakiegoś bełkotliwego zdania sdsf sdf f sdf sdfsdffg
, to da ci to niewiele rezultatów, ale mogą one nie być rzeczywistymi podobnymi zdaniami, ponieważ Twój wytrenowany model mógł nie widzieć tych bełkotliwych słów podczas treningu modelu. Spróbuj więc wytrenować swój model na jak największej liczbie zdań, aby uwzględnić jak najwięcej słów w celu uzyskania lepszych wyników.
Rozwiązanie Word2vec
Jeśli używasz word2vec, musisz obliczyć średni wektor dla wszystkich słów w każdym zdaniu i użyć podobieństwa cosinus między wektorami.
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
Oblicz podobieństwo
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)