Python:difflib.SequenceMatcher比较文本内容,返回差异部分

运用到的知识点:

s=difflib.SequenceMatcher(isjunk=None,a,b, autojunk=True) :构造函数,主要创建任何类型序列的比较对象。
isjunk是关键字参数,主要设置过滤函数,如想丢掉a和b比较序列里特定的字符,就可以设置相应的函数

s.get_opcodes()函数每执行一次返回5个元素的元组,元组描述了a和b比较序列的相同不同处。5个元素的元组表示为(tag, i1, i2, j1, j2),其中tag表示动作,i1表示序列a的开始位置,i2表示序列a的结束位置,j1表示序列b的开始位置,j2表示序列b的结束位置。
tag表示的字符串为:
replace 表示a[i1 : i2]将要被b[j1 : j2]替换。
delete  表示a[i1 : i2]将要被删除。
insert  表示b[j1 : j2]将被插入到a[i1 : i1]地方。
equal  表示a[i1 : i2] == b[j1 : j2]相同。

string.maketrans(instr,outstr)返回一个翻译表,instr中的字符是需要被outstr中的字符替换,而且instr和outstr的长度必须相等
str.maketrans(intab, outtab)方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。两个字符串的长度必须相同,为一一对应的关系。

import xlrd,re
import difflib

def E_trans_to_C(string):#英文符号转换为中文符号
    E_pun = u',.!?[]()<>"\''
    C_pun = u',。!?【】()《》“‘'
    trantab = str.maketrans(E_pun, C_pun)  # 制作翻译表
    return string.translate(trantab)

def change_txt(st):#转换文本:去除空格、去除符号、中英字符转换等
    # # 去除字符串开头或者结尾的空格
    # new_st = st.strip()
    # 去除全部空格
    new_st = ''.join(E_trans_to_C(st).split(' '))
    # 中英符号:将文本中所有符号转换为中文符号
    # 大小写转换
    # new_st = st.upper()
    # new_st = st.lower()
    return new_st

data = xlrd.open_workbook(r'D:\工作内容\content423.xlsx')
table = data.sheets()[0]

log=''
for i in range(1,table.nrows):
    row_value = table.row_values(i)
    txt1=row_value[1]
    txt2=row_value[2]
    s = difflib.SequenceMatcher(None, txt1, txt2)
    # s = difflib.SequenceMatcher(None, change_txt(txt1), change_txt(txt2))
    cw_num=0
    for tag, i1, i2, j1, j2 in s.get_opcodes():
        # print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" %  (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
        if tag != 'equal':
            print("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, txt1[i1:i2], j1, j2, txt2[j1:j2]))
            log += ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, txt1[i1:i2], j1, j2, txt2[j1:j2]) + '\n')
            if len(txt1[i1:i2]) > len(txt2[j1:j2]):
                cw_num += len(txt1[i1:i2])
            else:
                cw_num += len(txt2[j1:j2])
    print("{}检测存在差异的字数:{}".format(row_value[0],cw_num))
    log += ("{}检测存在差异的字数:{}".format(row_value[0],cw_num) + '\n')
    log += ("==============================================" + '\n')
with open(r'D:\工作内容\content423_log.txt', 'w', encoding="UTF-8") as f:
    f.write(log + '\n')

返回结果: (仅供参考)

 

Python中的`difflib`模块是一个用于比较序列的模块,它可以用于文本的相似度计算。`difflib`模块提供了一系列工具用于比较文本文件,生成不同格式的差异报告,以及计算两个序列的相似度或差异度。 要用`difflib`生成段落文本相似度计算,你可以使用`SequenceMatcher`类,这个类可以用来比较两个序列的相似度。相似度是通过一个介于0和1之间的分数来表示的,其中1表示完全相同,0表示完全不同。 下面是一个使用`difflib.SequenceMatcher`来计算两个段落文本相似度的示例代码: ```python import difflib def calculate_similarity(text1, text2): # 创建SequenceMatcher对象,初始化为两个文本的比较 seq_matcher = difflib.SequenceMatcher(None, text1, text2) # 获取两个文本的匹配分数,返回值是一个介于0到1之间的浮点数 similarity_score = seq_matcher.ratio() return similarity_score # 示例文本 text1 = "这是一个段落文本示例。" text2 = "这是另一个段落文本示例。" # 计算相似度 similarity = calculate_similarity(text1, text2) print(f"两个段落文本的相似度为: {similarity:.2f}") ``` 在上述代码中,我们定义了一个函数`calculate_similarity`,它接受两个文本字符串`text1`和`text2`作为参数,并返回它们的相似度评分。我们使用`SequenceMatcher`的`ratio`方法来计算相似度,该方法返回两个序列匹配的分数。 需要注意的是,`difflib`中的`ratio`方法是基于最长公共子序列算法,因此它对文本的重组、插入、删除和替换操作都很敏感。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值