1. 编辑距离,集合相似度
def get_jaccard_distance(seq1, seq2):
"seq1 and seq2 are two sequences, return value 0 means equal, 1 means totally different"
set1, set2 = set(seq1), set(seq2)
return 1 - len(set1 & set2) / float(len(set1 | set2))
def get_dice_distance(seq1, seq2):
A, B = set(A), set(B)
intersect = len(A.intersection(B))
union = len(A) + len(B)
return 2*intersect / union
2. 基于TF-IDF特征构建cos距离或欧式距离
TF-IDF表达了词级别的重要性,与集合相似度相比,包含的语义信息更多,对重要词和不重要词的区分度也更高
sklearn 的pairwise_distances和scipy的sparse点积操作(避免了for循环)可以实现
3. 先对句子里的词生成词向量,通过对词向量求和或者取平均值生成句子向量,用句子的向量夹角计算相似度
基于词向量的语义信息比TF-IDF特征更加丰富,由于有外部数据的预训练信息,对于TF-IDF特征无法处理的一词多义情况,基于embedding向量的相似性跟好
词向量也可以先经过TF-IDF值加权求和后再计算句子的相似度
预训练模型诸如word2vec, glove, fastText