安装:

• pip3 install python-Levenshtein==0.12.0
• pip3 install Levenshtein

实例一:

#! /usr/bin/python
# -*- coding: utf8 -*-
# @Time    : 2024/01/24
# @Author  : gesila

from Levenshtein import *


# inverse()  # 用于反转所有的编辑操作序列

# matching_blocks()  # 找到他们不同的块和相同的块,从第六个开始相同,那么返回截止5-5不相同的1,第8个后面也开始相同所以返回8-8-1,相同后面进行对比不同,最后2个对比相同返回0

# median()  # 找到一个列表中所有字符串中相同的元素,并且将这些元素整合,找到最接近这些元素的值,可以不是字符串中的值。

# median_improve()  # 通过扰动来改进近似的广义中值字符串。

# [('delete', 0, 1, 0, 0), ('equal', 1, 3, 0, 2), ('insert', 3, 3, 2, 3), ('replace', 3, 4, 3, 4)]
# 第一个值是需要修改的权重,例如第一个元祖是要删除的操作,2和3是第一个字符串需要改变的切片起始位和结束位,例如第一个元祖是删除第一字符串的0-1这个下标的元素
# 4和5是第二个字符串需要改变的切片起始位和结束位,例如第一个元祖是删除第一字符串的0-0这个下标的元素,所以第二个不需要删除

# quickmedian()  # 最快的速度找到最相近元素出现最多从新匹配出的一个新的字符串

# setmedian()  # 找到一个字符串集的中位数(作为序列传递)。 取最接近的一个字符串进行传递,这个字符串必须是最接近所有字符串,并且返回的字符串始终是序列中的字符串之一。

# setratio()  # 计算两个字符串集的相似率(作为序列传递)。


# 计算2个字符串之间需要操作的绝对距离,返回一个整数,表示将str1转换为str2所需的最少单字符编辑次数
print("distance()函数: ", distance('Hello world!', 'Hello world!'))
print("distance()函数: ", distance('Hello world!', 'Holly world!'))

# 计算2个字符串不同字符的个数,这2个字符串长度必须相同
print("hamming()函数: ", hamming('Hello world!', 'Holly world!'))

# 计算2个字符串的相似度,它是基于最小编辑距离
print("ratio()函数: ", ratio('spam', 'spark'))

# 计算2个字符串的相识度,这个给与相同的字符更高的权重指数
print("jaro()函数: ", jaro('spam', 'spark'))
print("jaro()函数: ", jaro('yukangrtyu', 'yukangrtyi'))

# 计算2个字符串的相识度,相对于jaro 他给相识的字符串添加了更高的权重指数,所以得出的结果会相对jaro更大(%百分比比更大)
print("jaro_winkler()函数: ", jaro_winkler("spam", 'spark'))
print("jaro_winkler()函数: ", jaro_winkler("yukangrtyu", 'yukangrtyi'))

# 给出所有第一个字符串转换成第二个字符串需要权重的操作和操作详情会给出一个列表,列表的值为元祖,每个元祖中有5个值
print("opcodes()函数: ", opcodes('spam', 'park'))

# 计算两个字符串序列的相似率。
print("seqration()函数: ", seqratio('spam', 'spark'))
print("seqration()函数: ",
      seqratio(['newspaper', 'litter bin', 'tinny', 'antelope'], ['caribou', 'sausage', 'gorn', 'woody']))

# 找到将一个字符串转换成另外一个字符串的所有编辑操作序列
e = editops('man', 'scotsman')
e1 = e[:3]
# 根据第一个参数editops()给出的操作权重,对第一个字符串基于第二个字符串进行相对于权重的操作
bastard = apply_edit(e1, 'man', 'scotsman')
print("e: ", e)
print("e1: ", e1)
print("bastard: ", bastard)
# 从序列中减去一个编辑子序列。看例子这个比较主要的还是可以将第一个源字符串进行改变,并且是基于第二个字符串的改变,最终目的是改变成和第二个字符串更相似甚至一样
print("subtract_edit()函数: ", subtract_edit(e, e1))
print(apply_edit(subtract_edit(e, e1), bastard, 'scotsman'))


def acquaintance(a, b):
    for i in a:
        item = {}
        for j in b:
            if ratio(u"%s" % i, u"%s" % j):
                # print("这两个字符串可做比较: ", i, j)
                item[ratio(u"%s" % i, u"%s" % j)] = (i, j)
        d = item[max(list(item.keys()))]
        c = '"%s"和"%s"-最相似---匹配度为:%f' % (d[0], d[1], max(list(item.keys())))
        print(c)


a = ["你好", 'hello,world', '计算偏差大不大啊?', '文本可以吗', '请看这里', 'hellow']
b = ['helloworld', "你好吗?", '可以吗', '请这里', '计算偏差大不大', '我叫什么']
acquaintance(a, b)

结果

distance()函数:  0
distance()函数:  2
hamming()函数:  2
ratio()函数:  0.6666666666666667
jaro()函数:  0.7833333333333333
jaro()函数:  0.9333333333333332
jaro_winkler()函数:  0.8483333333333334
jaro_winkler()函数:  0.96
opcodes()函数:  [('delete', 0, 1, 0, 0), ('equal', 1, 3, 0, 2), ('insert', 3, 3, 2, 3), ('replace', 3, 4, 3, 4)]
seqration()函数:  0.6666666666666666
seqration()函数:  0.21517857142857144
e:  [('insert', 0, 0), ('insert', 0, 1), ('insert', 0, 2), ('insert', 0, 3), ('insert', 0, 4)]
e1:  [('insert', 0, 0), ('insert', 0, 1), ('insert', 0, 2)]
bastard:  scoman
subtract_edit()函数:  [('insert', 3, 3), ('insert', 3, 4)]
scotsman
"你好"和"你好吗?"-最相似---匹配度为:0.666667
"hello,world"和"helloworld"-最相似---匹配度为:0.952381
"计算偏差大不大啊?"和"计算偏差大不大"-最相似---匹配度为:0.875000
"文本可以吗"和"可以吗"-最相似---匹配度为:0.750000
"请看这里"和"请这里"-最相似---匹配度为:0.857143
"hellow"和"helloworld"-最相似---匹配度为:0.750000

实例二:

ratio_threshold=0.9
ratio = Levenshtein.ratio(page404.content, r.content)
if ratio > ratio_threshold:
    return False
return True