Python查找两个word中的相同内容

参考链接:https://blog.csdn.net/weixin_43145361/article/details/103798581

参考链接:https://zhidao.baidu.com/question/326711580304676805.html

参考链接:https://blog.csdn.net/weixin_43245453/article/details/108335331

参考链接:https://python-docx.readthedocs.io/en/latest/index.html

参考链接:https://blog.csdn.net/weixin_42378365/article/details/85017115

一、使用python-docx库

https://python-docx.readthedocs.io/en/latest/index.html

二、对比规则

对比的基本思想是按小句进行比较,所以拆分以是标点,即,。?!等进行拆分。拆分完成以后,可以有很多的小段。本文中为了便于定位,先根据原始段落进行拆分,然后再将每段根据标点拆分成若干小句,即一个word文档 = [[段落1], [段落2], [段落3], ...,[段落n]],而每个段落= [[小句1],[小句2],[小句3],...,[小句m],]

循环对比输出,根据段落,两两进行对比,遇到匹配输出结果。

三、源码

# coding=utf-8

from docx import Document
import re, sys, datetime


def getText(wordname):
    d = Document(wordname)
    texts = []
    for para in d.paragraphs:
        texts.append(para.text)
    return texts

def is_Chinese(word):
    for ch in word:
        if '\u4e00' <= ch <= '\u9fff':
            return True
    return False

def msplit(s, seperators = ',|\.|\?|,|。|?|!'):
    return re.split(seperators, s)

def readDocx(docfile):
    print('*' * 80)
    print('文件', docfile, '加载中……')
    t1 = datetime.datetime.now()
    paras = getText(docfile)
    segs = []
    for p in paras:
        temp = []
        for s in msplit(p):
            if len(s) > 2:
                temp.append(s.replace(' ', ""))
        if len(temp) > 0:
            segs.append(temp)
    t2 = datetime.datetime.now()
    print('加载完成,用时: ', t2 - t1)
    showInfo(segs, docfile)
    return segs
    
def showInfo(doc, filename = 'filename'):
    chars = 0
    segs = 0
    for p in doc:
        for s in p:
            segs = segs + 1
            chars = chars + len(s)
    print('段落数: {0:>8d} 个。'.format(len(doc)))
    print('短句数: {0:>8d} 句。'.format(segs))
    print('字符数: {0:>8d} 个。'.format(chars))
          
def compareParagraph(doc1, i, doc2, j, min_segment = 5): 
    """
    功能为比较两个段落的相似度,返回结果为两个段落中相同字符的长度与较短段落长度的比值。
    :param p1: 行
    :param p2: 列
    :param min_segment = 5: 最小段的长度
    """
    p1 = doc1[i]
    p2 = doc2[j]
    len1 = sum([len(s) for s in p1])
    len2 = sum([len(s) for s in p2])
    #print(len1)
    #print(len2)
    if len1 < 10 or len2 < 10:
        return []
    
    list = []
    for s1 in p1:
        if len(s1) < min_segment:
            continue;
        for s2 in p2:
            if len(s2) < min_segment:
                continue;
            if s2 in s1:
                list.append(s2)
            elif s1 in s2:
                list.append(s1)
                
    # 取两个字符串的最短的一个进行比值计算
    count = sum([len(s) for s in list])
    ratio = float(count) /  min(len1, len2)
    if count > 10 and ratio > 0.1:
        print(' 发现相同内容 '.center(80, '*'))
        print('文件1第{0:0>4d}段内容:{1}'.format(i + 1, p1))
        print('文件2第{0:0>4d}段内容:{1}'.format(j + 1, p2))
        print('相同内容:', list)
        print('相同字符比:{1:.2f}%\n相同字符数: {0}\n'.format(count, ratio * 100))
    return list
 
#if len(sys.argv) < 3:
#    print("参数小于2.")


#doc1 = readDocx(sys.argv[1])
#print(doc1)
#doc2 = readDocx(sys.argv[2])
#print(doc2)

doc1 = readDocx('./document/doc1.docx')
doc2 = readDocx('./document/doc2.docx')

print('开始比对...'.center(80, '*'))
t1 = datetime.datetime.now()
for i in range(len(doc1)):
    if i % 100 == 0:
        print('处理进行中,已处理段落 {0:>4d} (总数 {1:0>4d} ) '.format(i, len(doc1)))
    for j in range(len(doc2)):
        compareParagraph(doc1, i, doc2, j)
 
t2 = datetime.datetime.now() 
print('\n比对完成,总用时: ', t2 - t1)   

其中,doc1.docx中内容为

新交规扣12分的违章行为
  1、驾驶营运客车超载20%以上,其中除了出租车、长途客运车辆等常规营运车辆外(不含公交车),在新规则中还首次加入了校车。
  2、严重超速:驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速20%以上或者在高速公路、城市快速路以外的道路上行驶超过规定时速50%以上,以及驾驶其他机动车行驶超过规定时速50%以上。
  3、故意遮挡号牌:从1月1日起,上道路行驶的机动车未悬挂机动车号牌的,或者故意遮挡、污损、不按规定安装机动车号牌一律会被一次性扣除12分。另外,对于牌照架也更新了规定,对于使用不符合规定的牌照架会受到200元并扣6分的处罚。
  4、驾驶营运客车在高速公路车道内停车:如果营运客车在高速公路上擅自停车(没有事故、车辆故障等原因)将受到一次性扣除12分的处罚。
  5、连续驾驶中型以上载客汽车、危险物品运输车辆超过4小时未停车休息或者停车休息时间少于20分钟。
  6、未取得校车驾驶资格驾驶校车(新增)
  校车准驾驾驶资格:驾龄3年以上,年龄不超过60周岁;最近连续3个分周期内没有满分记录;无致人死亡或者重伤的交通责任事故;无饮酒或者醉酒后驾驶记录,最近1年内无驾驶客运车辆超员、超速等严重交通违法行为;无犯罪记录,无因违反治安管理行为受到拘留处罚的记录;身体健康,无酗酒、吸毒行为记录,无传染性疾病,无癫痫、精神病等可能危及行车安全的病史。
  7、饮酒后驾驶机动车:酒后驾车除了扣除12分之外,还将扣押驾照6个月,并给予不超过2000元的现金处罚。对于醉酒驾车则是吊销驾驶证的处罚,除此之外还有刑事责任的处罚,且5年内不得重新考取驾照。
  8、驾驶与准驾车型不符:该行为实际上讲越级驾驶可以视为无照驾驶。另外除了扣除12分之外,交警还有权利给予200-2000元和扣车等处罚。
  9、造成交通事故后逃逸:交通事故肇事逃逸,尚不构成犯罪者将会受到12分的处罚。致人重伤、死亡或者使公私财产遭受重大损失的,处三年以下有期徒刑或者拘役;交通运输肇事后逃逸或者有其他特别恶劣情节的,处三年以上七年以下有期徒刑;因逃逸致人死亡的,处七年以上有期徒刑。
  10、伪造、更改号牌和证件:对于使用伪造、擅自更改的机动车号牌、行驶证、驾驶证、校车标牌,或者使用其他机动车号牌、行驶证等行为将会一次性扣除12分。
  11、驾驶机动车在高速公路上倒车、逆行、穿越中央分隔带掉头等严重影响交通安全的,都会受到12分的处罚。
  新交规扣6分的违章行为
  1、驾驶机动车违反道路交通信号灯通行:由于侥幸心理导致的闯红灯行为,过去是扣除3分,从2017年开始升级为扣除6分。
  2、货车超载:超过额定载重量30%以上的车辆,或违反规定载客的车辆将受到扣除6分的处罚。
  3、营运车辆超载未超过20%:驾驶营运客车(不包括公共汽车)、校车载人超过核定人数未达20%的,或者驾驶其他载客汽车载人超过核定人数20%以上将受到扣除6分的处罚。
  4、高速公路超速未达到20%(新增):驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速未达20%的车辆将受到扣除6分的处罚。
  5、普通公路超速20%以上(新增):驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路以外的道路上行驶或者驾驶其他机动车行驶超过规定时速20%以上未达到50%将受到此处罚。
  6、驾驶机动车不按照规定避让校车(新增),扣6分;
  7、低能见度气象条件下驾驶机动车在高速公路上不按规定行驶(新增),在恶劣天气中,应该做到:
  能见度小于200米时,开启雾灯、近光灯、示廓灯和前后雾灯,车速不得超过每小时60公里,与同车道前车保持100米以上的距离;
  能见度小于100米时,开启雾灯、近光灯、示廓灯、前后雾灯和危险报警闪光灯,车速不得超过每小时40公里,与同车道前车保持50米以上的距离;
  能见度小于50米时,开启雾灯、近光灯、示廓灯、前后雾灯和危险报警闪光灯,车速不得超过每小时20公里,并从最近的出口尽快驶离高速公路。
  8、机动车驾驶证被暂扣期间驾驶机动车,在被暂扣期间属于无照驾驶。
  9、驾驶营运客车以外的机动车在高速公路车道内停车;

 doc2.docx中内容为

核心提示:最新交通法规扣分细则规定,扣三分的行为有十二种,表现在驾驶货车载物超过核定载质量未达30%的;驾驶禁止驶入高速公路的机动车驶入高速公路的;驾驶机动车违反禁令标志、禁止 标线指示等方面。法律快车编辑在下文为您详细整理相关内容,仅供参考。
  最新交通法规扣分细则规定,机动车驾驶人有下列违法行为之一,一次记3分:
  (一)驾驶营运客车(不包括公共汽车)、校车以外的载客汽车载人超过核定人数未达20%的;
  (二)驾驶中型以上载客载货汽车、危险物品运输车辆在高速公路、城市快速路以外的道路上行驶或者驾驶其他机动车行驶超过规定时速未达20%的;
  (三)驾驶货车载物超过核定载质量未达30%的;
  (四)驾驶机动车在高速公路上行驶低于规定最低时速的;
  (五)驾驶禁止驶入高速公路的机动车驶入高速公路的;
  (六)驾驶机动车在高速公路或者城市快速路上不按规定车道行驶的;
  (七)驾驶机动车行经人行横道,不按规定减速、停车、避让行人的;
  (八)驾驶机动车违反禁令标志、禁止 标线指示的;
  (九)驾驶机动车不按规定超车、让行的,或者逆向行驶的;
  (十)驾驶机动车违反规定牵引挂车的;
  (十一)在道路上车辆发生故障、事故停车后,不按规定使用灯光和设置警告标志的;
  (十二)上道路行驶的机动车未按规定定期进行安全技术检验的。
  以上是现场处罚,下面法律快车为您介绍非现场处罚扣掉3分的行为:
  从2012年7月起,7种摄录违法(非现场处罚)罚款+记分:(是摄录罚款)1、闯红灯,罚款200元。2、不按导向车道行驶,罚款200元。3、违反禁止标线行驶,罚款100元。4、超速行车,罚款200元。5、机动车走非机动车车道,罚款100元。6、逆行,罚款200元。7、违停车,罚款200元。
  下述非现场处罚交通违法记3分
2、严重超速:驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速20%以上或者在高速公路、城市快速路以外的道路上行驶超过规定时速50%以上,以及驾驶其他机动车行驶超过规定时速50%以上。

最终的结果为

********************************************************************************
文件 ./document/doc1.docx 加载中……
加载完成,用时:  0:00:00.004986
段落数:       26 个。
短句数:       70 句。
字符数:     1684 个。
********************************************************************************
文件 ./document/doc2.docx 加载中……
加载完成,用时:  0:00:00.003001
段落数:       18 个。
短句数:       43 句。
字符数:      835 个。
************************************开始比对...*************************************
处理进行中,已处理段落    0 (总数 0026 ) 
************************************ 发现相同内容 ************************************
文件1第0003段内容:['\u3000\u30002、严重超速:驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速20%以上或者在高速公路、城市快速路以外的道路上行驶超过规定时速50%以上', '以及驾驶其他机动车行驶超过规定时速50%以上']
文件2第0018段内容:['2、严重超速:驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速20%以上或者在高速公路、城市快速路以外的道路上行驶超过规定时速50%以上', '以及驾驶其他机动车行驶超过规定时速50%以上']
相同内容: ['2、严重超速:驾驶中型以上载客载货汽车、校车、危险物品运输车辆在高速公路、城市快速路上行驶超过规定时速20%以上或者在高速公路、城市快速路以外的道路上行驶超过规定时速50%以上', '以及驾驶其他机动车行驶超过规定时速50%以上']
相同字符比:100.00%
相同字符数: 110


比对完成,总用时:  0:00:00.001989
[Finished in 0.2s]

四、出现问题

解决方法

pip install python-docx

出现问题2 

解决方法 

猜你喜欢

转载自blog.csdn.net/yql_617540298/article/details/108522075
今日推荐