文本相似度算法(无监督算法)

2,086 阅读1分钟

1. Jaro distance

给定两个文本串s1s_1,s2s_2,他们的Joro距离定义为: Jaro公式 其中: mm表示两个字符串中match的字符数 si|s_i|表示文本串长度 tt表示换位(transpositoins)数目()

match的字符数: 分别来自s1s_1,s2s_2的字符,当他们相同或者距离小于d=max(xi,x2)21d =\lfloor \frac{max(|x_i|,|x_2|)}{2}\rfloor - 1,则被认为是match的。

比如:s1s_1=“DIXON”, s2s_2=“DICKSONX” 匹配空间 距离dd计算出来等于3,则每一次从max(0,i-d)到min(i+d,xLen)的空间内比较(如果从横轴s1s_1进行比较,xLen表示s1s_1长度)。最终得到matchm=4m=4

s1s_1中的每一个字符都会与s2s_2中距离dd内的字符进行比较。将所有match的字符串,需要替调换顺序才能匹配的总数除以二就是transpositions的大小tt。这里两个字符串中匹配的分别是:"DION",“DION",所以t=0t=0。 另外 s1|s_1|=4, s2|s_2|=8, 则: dj=13(45+48+404)d_j=\frac{1}{3}(\frac{4}{5} + \frac{4}{8} + \frac{4-0}{4})

参考: rosettacode.org/wiki/Jaro_d…

2. PCA like SIF

image_1e6iak6751vvlhhabn51ltj1t1tm.png-65.4kB

  1. 第一步,对句子中的每个词向量,乘以一个独特的权值。这个权值是一个常数αα除以αα与该词语频率的和,也就是说高频词的权值会相对下降。求和后得到暂时的句向量。

  2. 然后计算语料库所有句向量构成的矩阵的第一个主成分uu,让每个句向量减去它在uu上的投影(类似PCA)。其中,一个向量vv在另一个向量uu上的投影定义如下: image_1e6iam2bv1vl2c281d7thjc1v1i2a.png-2.6kB

  3. 代码实现: image_1e6iamnqvd9l133vrd31l5g1q1m2n.png-106.8kB