比较两个字符串是否近似
方法1:使用difflib中的ratio/quick_ratio/real_quick_ratio:比较方式:2*匹配相同的字符串长度/2个字符串的长度之和
query_str = '市公安局' s1 = '广州市邮政局' s2 = '广州市公安局' s3 = '广州市检查院' print(difflib.SequenceMatcher(None, query_str, s1).quick_ratio()) print(difflib.SequenceMatcher(None, query_str, s2).quick_ratio()) print(difflib.SequenceMatcher(None, query_str, s3).quick_ratio())
Levenshtein与difflib(SequenceMatcher)有一些重叠。它只支持字符串,而不是任意的序列类型,但另一方面它更快。
#计算 汉明距离。 要求str1和str2必须长度一致。是描述两个等长字串之间 对应 位置上 不同 字符的个数。
hamming(string1, string2)
>>> hamming('Hello world!', 'Holly grail!')
7
>>> hamming('Brian', 'Jesus')
5
#计算编辑距离(也称为 Levenshtein距离)。是描述由一个字串转化成另一个字串最少的操作次数,在其##中的操作包括插入、删除、替换
#distance(string1, string2)
>>> distance('Levenshtein', 'Lenvinsten')
4
>>> distance('Levenshtein', 'Levensthein')
2
>>> distance('Levenshtein', 'Levenshten')
1
>>> distance('Levenshtein', 'Levenshtein')
0
#使得两个字符串相同的,计算编辑操作过程,返回三元的元祖,第一个是操作,第二个是第一个字符串位置,第二个是第二个字符串位置 >>> editops('spam', 'park') [('delete', 0, 0), ('insert', 3, 2), ('replace', 3, 3)]
#inverse是将目标字符串变化成原始字符串的操作过程 inverse(edit_operations) >>> inverse(editops('spam', 'park')) [('insert', 0, 0), ('delete', 2, 3), ('replace', 3, 3)] >>> editops('park', 'spam') [('insert', 0, 0), ('delete', 2, 3), ('replace', 3, 3)]
ratio(string1, string2) 计算莱文斯坦比。计算公式r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是 类编辑距离 注意 :这里的类编辑距离不是distance中所说的编辑距离,2中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2 >>> ratio('Hello world!', 'Holly grail!') 0.58333333333333337 >>> ratio('Brian', 'Jesus') 0.0
计算jaro距离,Jaro Distance据说是用来判定健康记录上两个名字是否相同,也有说是是用于人口普查,我们先来看一下Jaro Distance的定义。
两个给定字符串S1和S2的Jaro Distance为:

其中的m为s1, s2匹配的字符数,t是换位的数目。
两个分别来自S1和S2的字符如果相距不超过

时,我们就认为这两个字符串是匹配的;而这些相互匹配的字符则决定了换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半即为换位的数目t。举例来说,MARTHA与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1。
两个字符串的Jaro Distance即为:

jaro(string1, string2)
>>> jaro('Brian', 'Jesus')
0.0
>>> jaro('Thorkel', 'Thorgier')
0.77976190476190477
>>> jaro('Dinsdale', 'D')
0.70833333333333337
计算Jaro–Winkler距离,而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为ι的部分相同,则Jaro-Winkler Distance为:

dj是两个字符串的Jaro Distance
ι是前缀的相同的长度,但是规定最大为4
p则是调整分数的常数,规定不能超过25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1
这样,上面提及的MARTHA和MARHTA的Jaro-Winkler Distance为:
浙公网安备 33010602011771号