可以使用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)