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

1. Jaro distance

给定两个文本串 s 1 s_1 , s 2 s_2 ,他们的Joro距离定义为: Jaro公式 其中: m m 表示两个字符串中match的字符数 s i |s_i| 表示文本串长度 t t 表示换位(transpositoins)数目()

match的字符数: 分别来自 s 1 s_1 , s 2 s_2 的字符,当他们相同或者距离小于 d = m a x ( x i , x 2 ) 2 1 d =\lfloor \frac{max(|x_i|,|x_2|)}{2}\rfloor - 1 ,则被认为是match的。

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

s 1 s_1 中的每一个字符都会与 s 2 s_2 中距离 d d 内的字符进行比较。将所有match的字符串,需要替调换顺序才能匹配的总数除以二就是transpositions的大小 t t 。这里两个字符串中匹配的分别是:"DION",“DION",所以 t = 0 t=0 。 另外 s 1 |s_1| =4, s 2 |s_2| =8, 则: d j = 1 3 ( 4 5 + 4 8 + 4 0 4 ) 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. 然后计算语料库所有句向量构成的矩阵的第一个主成分 u u ,让每个句向量减去它在 u u 上的投影(类似PCA)。其中,一个向量 v v 在另一个向量 u u 上的投影定义如下:

image_1e6iam2bv1vl2c281d7thjc1v1i2a.png-2.6kB

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

猜你喜欢

转载自juejin.im/post/7016573757015719972
今日推荐