Seu problema pode ser resolvido com o Word2vec e também com o Doc2vec. O Doc2vec daria melhores resultados porque leva em consideração as sentenças durante o treinamento do modelo.
Solução Doc2vec
Você pode treinar seu modelo doc2vec seguindo este link . Você pode executar algumas etapas de pré-processamento, como remover todas as palavras de parada (palavras como "the", "an" etc.) que não agregam muito significado à frase. Depois de treinar seu modelo, você poderá encontrar frases semelhantes usando o código a seguir.
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)
Resultados:
[('TRAIN_29670', 0.6352514028549194),
('TRAIN_678', 0.6344441771507263),
('TRAIN_12792', 0.6202734708786011),
('TRAIN_12062', 0.6163255572319031),
('TRAIN_9710', 0.6056315898895264)]
Os resultados acima são uma lista de tuplas para (label,cosine_similarity_score)
. Você pode mapear saídas para frases fazendo train[29670]
.
Observe que a abordagem acima só fornecerá bons resultados se o seu modelo doc2vec contiver incorporação de palavras encontradas na nova frase. Se você tentar obter semelhança com algumas frases sem sentido sdsf sdf f sdf sdfsdffg
, ele fornecerá poucos resultados, mas essas podem não ser as frases semelhantes, já que seu modelo treinado pode não ter visto essas palavras sem sentido ao treinar o modelo. Portanto, tente treinar seu modelo no máximo de frases possível para incorporar o máximo de palavras para obter melhores resultados.
Solução Word2vec
Se você estiver usando o word2vec, precisará calcular o vetor médio para todas as palavras em cada frase e usar a semelhança de cosseno entre vetores.
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
Calcular semelhança
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)