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)