字符串相似度问题

问题这样引出,两个字符串的相似度如何进行比较?朴素的想:先比较长度,再单独比较每个字符,那么又有问题,当长度不一样字符也不一样的时候这个不同的度是多少?

这个问题表现了本人的思想一种奇怪的回路,多因素下的问题分析不清晰,定义模糊导致问题解决无法继续。

多维/多因素视角下的问题的确是存在和现实的,需要考虑将维度统一化:比如长度不同、字符不同,如果你把空位视为一个"字符",长度不同也是一种字符不同,而不必陷入去怎么定义;再或者长度不同时给他的度是多少,字符不同时他的度是多少,这种无法解决的问题或者给定任意数并不影响解决问题,这个可以归属到"系数"上面。

针对字符串不同的具体问题则会是:a和b的不同与a与s的不同的度量是否一样,其实这也是不影响解决问题的系数问题。在26键下,你可以定义a和s的差距是1,而ab是6,在9键输入时,可以定义a和b的差距是1,而as是5。这种考虑不能说是没有意义,它不应该阻碍你对模型的建立。

搜索一番,我们得到一些前人已有的结论:
https://zhuanlan.zhihu.com/p/91645988?utm_id=0

Jaccard 相似度

J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ J(A,B) = \frac{|A\cap B |}{|A\cup B |} = \frac{|A\cap B |}{|A| + |B| - |A \cap B|} J(A,B)=ABAB=A+BABAB
模怎么求?模就是集合A的长度

The Jaccard coefficient measures similarity between finite sample sets, and is defined as the size of the intersection divided by the size of the union of the sample sets

Sorensen Dice 相似度

s = 2 ∣ A ∩ B ∣ ∣ A ∣ ∪ ∣ B ∣ s = \frac{2|A\cap B |}{|A|\cup| B |} s=AB2∣AB

集合交集的 2 倍除以两个集合相加,并不是并集。

Levenshtein 莱文斯坦距离

这个算法比较重要,在很多领域有应用,实现算法也很妙,用了动态规划。这个算法会比较两个字符串的每个字符,把操作定义为:增加 修改 删除,称为编辑距离。
那么什么时候应该增加,修改删除呢?

比如字符串 abcd bcd,比较两个字符串第一个字符,a和b时,应该修改?把a改成b还是把b改成a?假定我们以长的为准,那么应该是把b改成a
于是有了 abcd acd 但是这两个字符串差异很小,实际上是对后者增加a就行了,但上述方法增加了复杂度,所以何时应该修改
那么,因为只有一个字符,我们看不出来应该增加还是修改,但是显然它不同,我们再纳入第二个字符
ab和bc?这个时候怎么对比?有点乱了。
自然想到,这个时候就需要n* n 次遍历比较了,这个显然不是n * n, 实际上是 n^4个,按照这个分法,一个长度为n的字符串就有 n(n+1)/2个组合: 长度为1的n,长度为2的n-1,长度为3的n-2,一直到长度为n的:n-(n-1) = 1个
固定一个,另一个动,两个都动没意义。
a b
a bc
a bcd
ab b
ab bc
ab bcd
abc b
abc bc
abc bcd
abcd b
abdc bc
abcd bcd
b b
b bc
b bcd
bc b

我们最终要求的是 abcd 和 bcd的距离
这个问题的确可以拆分成更小的子问题 L(abcd, bcd) =min( L(a,_ ) + L(bcd,bcd) , L(a,b) + L(bcd,cd) ,L(a, bc) + L (bcd,d) ...) 同级分解时取最小数
首先知道要拆分处理,但是拆分时又存在分割符移动,那么,简单地,遍历就行。这个东西真的不好陈述
莱温斯坦算法中已经定义变更分为三种:删除,插入,修改;要注意到的是这些操作只在源字符串操作,目标字符串时不动的,比如abcdef --> abcd 是删除ef, abcd --> abcdef 是插入ef,交换位置后,转化操作是互补的。
怎么决定字符串应不应该删除?在目标字符串前加入空白字符串来表示,就是上面的_,把删除也认为是一个字符,在遍历的时候经过它;
关于插入和修改的问题:当是等长对比时,字符不一样,那么显然就是修改;当源字符串长度小于目标字符串时,就是插入了,因为变更操作导致的编辑距离都是1,这里不考虑系数,所以直接加1就行
其实直接从上面跳到这里来是讲不通的

于是就有两个运算示例表
abcd和acd的距离,就是矩阵最后一个值1
s r c s p a c e a c d a 1 0 1 2 b 2 1 1 2 c 3 2 1 3 d 4 3 3 1 \begin{matrix} src & space & a & c & d\\ a & 1 & 0 & 1 & 2\\ b & 2 & 1 & 1 & 2 \\ c & 3 & 2 & 1 & 3 \\ d & 4 & 3 & 3 & 1 \end{matrix} srcabcdspace1234a0123c1113d2231
在确定 matrix[i][j]的值时,先取matrix[i-1][j-1] matrix[i][j-1] matrix[i-1][j]这三个的最小值,就是它的上方左方左上中的最小值,如果mtrix[i][0]是等于matrix[0][j],说明这个位置不需要再变化,直接取附近距离的最小值,否则加1。第一行(a 1 0 1 2 )和第二列 (1 2 3 4) 都可以直接写出来
以图中c=2 a=2 的位置(含字母矩阵matrix[3][3])计算举例,这个位置表示abc到a的莱温斯坦距离,
左上表示 L(ab->_ _ ) = 2
上方表示L( ab->a ) = 1
左方表示L(abc->_ _ _ ) = 3
因为a!=c 所以此位置为 1 + 1 = 2 表示L(abc -> a) = 2

汉明距离

两个等长字符串中的不一致字符的个数

余弦相似度

s = cos ⁡ ( θ ) = A B ∣ A ∣ ∣ B ∣ s = \cos (\theta )= \frac {AB}{|A||B|} s=cos(θ)=A∣∣BAB

∣ A ∣ = ∑ i = 1 n A i |A| = \sqrt { \sum_{i=1}^{n} A_{i} } A=i=1nAi
那么,已知字符串,怎么表示成向量A?
求两个字符串的并集,然后把每个字符,通过0表示不存在,1表示存在转换成向量

附录

Letax语法支持-在线书写:https://www.latexlive.com/
Letax语法支持-简书:https://www.jianshu.com/p/23e03593916d
莱文斯坦距离:https://www.zhihu.com/question/315634571

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值