天天看点

Python 银行法律性文档审核的非人工识别异同

在银行日常工作中经常会碰到非标准格式的贷款合同、非标保函等等法律性文档,这些文档需要提交法务部门审核后才能使用。对比两个文档异同的这种小工作,如果人工来做是比较耗时耗力的,但使用点小代码就能省不少力,还不会出错。反正不管什么单位,要对比文档就交给python来做:

difflib 模块

>>> import difflib
>>> [_ for _ in dir(difflib) if _[0]<'Z' or _[0]>'a']
['Differ', 'HtmlDiff', 'IS_CHARACTER_JUNK', 'IS_LINE_JUNK', 
'Match', 'SequenceMatcher', 'context_diff', 'diff_bytes', 
'get_close_matches', 'ndiff', 'restore', 'unified_diff']
>>> 
           

docx 模块

>>> import docx
>>> [_ for _ in dir(docx) if _[0]<'Z' or _[0]>'a']
['Document', 'ImagePart', 'RT', 'blkcntnr', 'compat', 'dml',
 'document', 'enum', 'exceptions', 'image', 'opc', 'oxml',
 'package', 'parts', 'section', 'settings', 'shape',
 'shared', 'styles', 'text']
>>> 
           

部分函数的使用简介如下:

文本对比 difflib.Differ

>>> text1 = '''Python 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.csdn.net/boysoft2002/article/details/120257133
Python 不自己试试,还真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318
'''
>>> text2 = '''PYTHON 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.CSDN.net/boysoft2002/article/details/120257133
Python 真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318///
'''
>>> a = text1.splitlines(keepends=True)
>>> b = text2.splitlines(keepends=True)
>>> c = difflib.Differ()
>>> print(''.join(list(c.compare(a,b))))
- Python 斐波那契数列递归的改进,算第1000万项只要4秒钟!
?  ^^^^^
+ PYTHON 斐波那契数列递归的改进,算第1000万项只要4秒钟!
?  ^^^^^
- https://blog.csdn.net/boysoft2002/article/details/120257133
?              ^^^^
+ https://blog.CSDN.net/boysoft2002/article/details/120257133
?              ^^^^
- Python 不自己试试,还真猜不出递归函数的时间复杂度!
?        -------
+ Python 真猜不出递归函数的时间复杂度!
- https://blog.csdn.net/boysoft2002/article/details/120242318
+ https://blog.csdn.net/boysoft2002/article/details/120242318///
?                                                            +++

>>> 
           

符号含义说明

“-” 包含在第一个序列行中,但不包含在第二个序列行中

“+” 包含在第二个序列行中,但不包含在第一个序列行中

" " 两个序列行一致

“?” 标志两个序列行存在增量差异

“^” 标志出两个序列行存在的差异字符

超文本对比报告 difflib.HtmlDiff

>>> text1 = '''Python 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.csdn.net/boysoft2002/article/details/120257133
Python 不自己试试,还真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318
'''
>>> text2 = '''PYTHON 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.CSDN.net/boysoft2002/article/details/120257133
Python 真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318///
'''
>>> a = text1.splitlines(keepends=True)
>>> b = text2.splitlines(keepends=True)

>>> d = difflib.HtmlDiff()
>>> html = d.make_file(a,b)
>>> with open('difReport.html','w',encoding='utf-8') as f: f.write(html)

3223
>>> import os; os.startfile('difReport.html')
>>> 
           

 打开的html文件效果:

Python 银行法律性文档审核的非人工识别异同

文档对比相似度 difflib.SequenceMatcher

>>> a = '''Python 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.csdn.net/boysoft2002/article/details/120257133
Python 不自己试试,还真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318
'''
>>> b = '''PYTHON 斐波那契数列递归的改进,算第1000万项只要4秒钟!
https://blog.CSDN.net/boysoft2002/article/details/120257133
Python 真猜不出递归函数的时间复杂度!
https://blog.csdn.net/boysoft2002/article/details/120242318///
'''
>>> import difflib
>>> difflib.SequenceMatcher(None,a,b).ratio()*100
92.3076923076923
>>> 
           

Word文档转文本 docx.Document

def doc2txt(docxFile):
    x,doc='',docx.Document(docxFile)
    try:
        for i in doc.paragraphs:x+=i.text
        return x.replace('\t','').replace(' ','')
    except:
        return ''
           

综合以上知识,就能做做小应用可以给日常的工作提高不少效率。运行效果,代码略:

Python 银行法律性文档审核的非人工识别异同

-- All done!