cell数组变为字符串_字符串相似度

1  前提

梦中惊坐起,我还有个公众号,那就更新一下吧。

今天分享的是Levenshtein Distance(以下简称LD),中文叫莱文斯坦距离。他是干什么的呢?

2 遇见的问题

判断两个字符串是否相等:

a30e2a349bd75bc9b24b7634d86f5171.png只少了一个点,结果变为False,那么这两个字符串的相似度是多少呢?就用到了Levenshtein Distance

3 公式介绍

Levenshtein Distance指两个字串之间,由一个转换成另一个所需的最少编辑操作次数,允许的编辑操作包括:

  • 替换成另一个字符(Substitutions)
  • 插入一个字符(Insertions)
  • 删除一个字符(Deletions)

公式:

91eddb1f0dbca3ae3d20a58e24b3df47.png

这个数学公式最终得出的数值就是LD的值。举个例子:

将kitten这个单词转成sitting的LD值为3:每个转换的代价都是1

kitten → sitten (k→s)

sitten → sittin (e→i)

sittin → sitting (insert a 'g')

4 计算

可以用一个二维数组动态规划来计算LD。(动态规划相对于递归的好处大家都懂得!)

举例(两个非等长字符串):doge和dog。首先初始化一个4X3的矩阵:

542fc3aa8f8d79f30250dd385b0579e1.png然后根据公式往里面填数,最后结果为:

0ccded88d372ffb10484d503bcf5cf41.png可以得知LD=1

5 代码实现

import numpy as np

# 找最小编辑距离
def lev_distance(source,target):
    source=source.upper()
    target=target.upper()
    rows=len(source)
    columns=len(target)
    np.zeros((rows+1,columns+1))
    arr=np.zeros((rows+1,columns+1))
    for i in range(1,rows+1):
        for j in range(1,columns+1):
            arr[i][0]=i
            arr[0][j]=j        
    for i in range(1,rows+1):
        for j in range(1,columns+1):
            if target[j-1]==source[i-1]:
                cost=0
            else:
                cost=1
            arr[i,j]=min(arr[i-1,j]+1,arr[i,j-1]+1,arr[i-1,j-1]+cost)
    return arr[i,j]

# 计算匹配度
def lev_rate(source,target):
    distance=lev_distance(source,target)
    rate=1-distance/max(len(source),len(target))
    return rate

测试:

323f3bff14a24c331ba02382f1a808eb.png

6 使用场景

  • 字符串匹配
  • DNA分析
  • 论文查重
  • 脱敏数据和明文数据匹配

例子:脱敏数据

namephoneid_number
张*凡123****89130123213****5555

真实数据:

namephoneid_number
张小凡123456789130123213xxxx5555

满足LD(name)=1 && LD(phone)=4 &&  LD(id_number)=4条件,可以进行脱敏和明文数据的匹配。

299c1118229cbf24a69424f73e1eece5.png

转载美三代  点赞富一生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值