问题描述

提取word文档中的缩略语,并将文档内的缩略语替换为全称

解决方案

首先观察数据,缩小问题范围
发现文档内缩略语基本都以表格方式呈现,一般是两列,有时也有四列,所以只考虑解决缩略语为表格且为2、4列的情况,其他特殊情况(段落等非表格形式,列数不为2、4)不考虑

缩略语判断逻辑主要就是单元格内文本是大写字符串的比例

代码里我写了两种逻辑,V1是判断大写单元格占总的单元格比例,V2是,奇数列大写与偶数列非大写的比例

判断缩略语提取缩略语
def extract_abbreviation(file, cfd=0.1, judgement='V1'):start_time = time.time()all_abrvt = []for table in file.tables:try:width, length = len(table.columns), len(table.rows)if not (width == 2 or width ==4):continueif judgement == 'V1':   # 判断英文大写占单元格文本比例cell_text = [cell.text for row in table.rows for cell in row.cells if cell.text]cell_upper = [i for i in cell_text if i.isupper()]if 0.4 < (len(cell_upper)+1) / (len(cell_text)+1) < 0.6:is_abrvt = Trueelse:is_abrvt = Falseelif judgement == 'V2':   # 判断每列单元格文本类型比例column_odd_text = [cell.text for i in range(0, width, 2) for cell in table.columns[i].cells if cell.text]column_even_text = [cell.text for i in range(1, width, 2) for cell in table.columns[i].cells if cell.text]column_odd_upper = [i for i in column_odd_text if i.isupper()]column_even_upper = [i for i in column_even_text if not i.isupper()]if 0.8 < (len(column_odd_upper)+1) / (len(column_even_upper)+1) < 1.2:is_abrvt = Trueelse:is_abrvt = Falseif  is_abrvt:abrvt, cfd_num, confidence= [], 0, 0for i in range(length):for j in range(0, width, 2):cell_1, cell_2 = table.rows[i].cells[j].text, table.rows[i].cells[j+1].textif cell_1.isupper() and len(cell_1)>1 and len(cell_2)>2:abrvt.append([cell_1, cell_2])c_word = cell_2.split(' ')c_head = ''.join([k[0] for k in c_word if k])if c_head.lower() == cell_1.lower():cfd_num += 1if length == 2:confidence = cfd_num / lengthelse:confidence = cfd_num / (length * 2)if confidence > cfd:logging.info('***** 发现缩略语表,%s, confidence: %s' % (abrvt, confidence))all_abrvt.extend(abrvt)else:continueexcept Exception as e:logging.error('Error: ' + str(e), exc_info=True)print(e)print(all_abrvt)print('time: ', time.time()-start_time)return all_abrvt

提取出来的缩略语事例:

文档内缩略语的替换
这里函数的输入是文本段落内容和抓取到的缩略语列表,

def abrvt_replace(file_text_total, abrvt):try:file_text = file_text_total.copy()for i in range(len(file_text)):abr_text = word_tokenize(file_text[i])for j in abrvt:if (file_text[i] != j[0]) and (j[0] in abr_text)  and \(j[1].lower() not in file_text[i].lower()):for k in range(len(abr_text)):if abr_text[k] == j[0]:abr_text[k] = j[1] + "(" + j[0] + ")"breakfile_text[i] = ' '.join(abr_text)return file_textexcept Exception as e:logging.info("***** 缩略语替换出错")logging.error('Error: ' + str(e), exc_info=True)return file_text_total

以上抓取和替换都不是很严谨,总能构造出反例,但实际效果以足够解决90%以上但问题了

python docx 一种文档缩略语提取方案相关推荐

  1. python 合并word文件_使用python docx合并word文档

    合并包含所有样式的两个文档的另一种方法是使用python库docxcompose(https://pypi.org/project/docxcompose/).我们不需要明确定义样式,也不必逐段阅读文 ...

  2. python docx修改word文档格式

    修改word文档格式,包括修改目录字体字号间距,修改一级标题字体字号间距,二级标题字体字号间距....正文字体字号间距,表格中的文字的字体字号间距,以图或表开头的图名称和表名称的字体字号间距. wor ...

  3. python docx处理word文档中表格合并问题

    问题描述 python中用docx库读取word文件,若word文件中包含合并的表格表格 则通过docx读取显示: file = docx.Document(path) for table in fi ...

  4. Word处理控件Aspose.Words功能演示:用Java从Word文档中提取文本

    Aspose.Words For .NET是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsof ...

  5. Word处理控件Aspose.Words功能演示:在 C# 中从 Word 文档中提取文本

    从 Word 文档中提取文本通常在不同的场景中执行.例如,分析文本,提取文档的特定部分并将它们组合成单个文档,等等.在本文中,您将学习如何使用 C# 以编程方式从 Word 文档中提取文本.此外,我们 ...

  6. Python批量提取docx格式Word文档中所有批注

    封面图片:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配 ...

  7. 【Python】导出docx格式Word文档中的文本、图片和附件等

    [Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...

  8. python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...

  9. python批量提取word指定内容到excel_(转)用python批量读取word文档并整理关键信息到excel表格...

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...

最新文章

  1. PLSQL连Oracle数据库Could not load ……\bin\oci.dll
  2. Ubuntu16.04运行VoxelNetRos
  3. Spring RESTFul Client – RestTemplate Example--转载
  4. (算法)Word Break
  5. Java开发知识体系!我用2个月的时间破茧成蝶
  6. 第2课 - 搭建Lua开发环境
  7. mt4 指标 涨跌幅 颜色k线_通达信精选指标——彩色K线指标
  8. JVM学习-垃圾回收器
  9. Python 偏函数
  10. 智慧电商erp通用版管理系统+采购管理+仓库管理+订单管理+财务管理+系统管理+Axure高保真交互ERP通用版电商web端管理系统+全局说明+竞品分析+协同办公
  11. Bsdiff差分算法讲解
  12. mysql innodb 幻读_MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读
  13. python 四元数转欧拉角
  14. 利用win10自带的系统配置禁止开机启动项和程序
  15. docker的代理配置_wuli大世界_新浪博客
  16. 模拟慢网速的一些测试工具介绍(Fiddler|NetLimiter|Network Delay Simulator)
  17. 负数除以整数的余数怎么算?
  18. php receivemail下载,php receivemail,php mail,preceive
  19. “华为云,有技术”,并不只是一句口号而已
  20. C++取整数与取小数的函数和方法

热门文章

  1. FCOS论文复现:通用物体检测算法
  2. wordpress空间访问gravatar头像方法汇总
  3. 杀不死我的,必将被我杀死 ——2019半年总结
  4. flutter 值得推荐的插件
  5. 技术类博客网站推荐(转)
  6. 微信授权登陆接入第三方App(步骤总结)Android
  7. 第一次用uni-app写项目,无法自动运行微信小程序,怎么解决呢
  8. 数据库运维工程师的职责
  9. HTTP:Web服务器的实现
  10. python加速度算位移,计算加速度给定速度