第07章 文本信息提取

 

 

序言

1. 内容介绍

本章详细介绍了Word 文本信息提取方式、PDF 文本信息提取方式等内容。

2. 理论目标

  • 了解Word 文本信息提取方式
  • 了解PDF 文本信息提取方式

3. 实践目标

  • 掌握Word 文本信息提取方法,能完成Word 文本信息提取
  • 掌握PDF 文本信息提取方法,能完成PDF 文本信息提取

4. 实践案例

5. 内容目录

  • 1.文本提取介绍

  • 2.Word 文本信息提取

  • 3.PDF 文本信息提取

  • 4.文本信息提取实战


第1节 文本提取介绍

1. 文本提取概述

通过数据采集获取的数据信息往往五花八门、杂乱无章,因此需要对这些不同类型的数据进行集成,并将集成数据传入到电脑中,然后通过算法模型挖掘其潜在的价值,作为智能应用的支撑。

 

采集的原数据存在数据质量差、文档格式杂、数据表示形式多样化、数据信息错误等诸多问题,单纯考虑文本信息处理工作,就文本信息而言,采集到的文档数据可能是网页、SQL文件、PDF文档、doc文档等,对这些文本数据继承的思路就是文本信息的提取,然后进行格式化处理,常见的文本抽取方式包括:

  1. 使用在线格式转换工具转换。
  2. 使用office内置格式进行转换。
  3. 自己开发文本抽取工具进行文本抽取。

作为优秀的程序员,本章将针对第三种方式展开讨论。

2. Pywin32 库安装

Pywin32 是Python的第三方库文件,它提供了从Python 访问Windows API 的功能。Windows Pywin32 允许开发者使用Python 开发win32 应用和对Windows 系统实现自动化操作,Pywin32 核心模块是 win32.com。

本章通过Pywin32 启动Word应用程序,打开相关文档并将相关文本信息保存为txt文档。

安装命令

pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple/

5aec0fb2193874ed6511a189aabe805e.png

3. 文本提取步骤

本章将应用Pywin32 调用系统本地应用接口,通过本地应用对源文档进行打开、另存为文本文档。基本步骤:

  1. 打开Word应用程序

  2. 打开Word文档/PDF文档

  3. 保存为txt文档

  4. 关闭Word应用程序


第2节 Word文本信息提取

1. 文本提取需求概述

下面将以抽取Word文档中的文本为例,来介绍抽取文件信息的方法,Word文档内容信息如下:

84ab0447113fe69dc545902bbcfd7faa.png

2. 文本提取实现

代码逻辑:

  1. 打开Word应用程序
  2. 打开Word文档
  3. 保存为txt文档
  4. 关闭Word应用程序
 

from win32com import client as wc path = r'E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/' filename = r"Python数据预处理.docx" wordapp = wc.Dispatch('Word.Application') mytxt = wordapp.Documents.Open(path + filename) ## 建议此处使用绝对路径 mytxt.SaveAs(path + r"Python数据预处理word.txt", FileFormat=4) ## 建议此处使用绝对路径,FileFormat=4 表示提取文本信息 mytxt.Close()


第3节 PDF文本信息提取

1. 文本提取需求概述

下面将以抽取PDF文档中的文本为例,来介绍抽取文件信息的方法,PDF文档内容信息如下:

b53c622f46fdb7e77be2c1854c7e5596.png

2. 文本提取实现

代码逻辑:

  1. 打开Word应用程序
  2. 打开PDF文档
  3. 保存为txt文档
  4. 关闭Word应用程序
 

from win32com import client as wc path = r'E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/' filename = r"Python数据预处理.pdf" wordapp = wc.Dispatch('Word.Application') mytxt = wordapp.Documents.Open(path + filename) ## 建议此处使用绝对路径 mytxt.SaveAs(path + r"Python数据预处理pdf.txt", FileFormat=4) ## 建议此处使用绝对路径,FileFormat=4 表示提取文本信息 mytxt.Close()


第4节 文本信息提取实战

1. 需求描述与实现思路

需求描述

结合前述的文本抽取方法,实现目录下新闻文本的批量抽取(历史、教育、汽车各30篇的PDF文档文本内容的抽取),可以在根目录下文档的批量抽取,并自动保存到指定位置。

fcf9a7e41c5b7d5840c11a7b066541a1.png

实现思路

实现思路:

  1. 实现获取文件列表功能;
  2. 实现PDF文档文本信息提取功能(保存为txt文档);
  3. 调用获取文件列表功能(步骤1),循环调用文本信息提取功能(步骤2),完成文本信息提取。

2. 获取文件列表

遍历文件列表思路:

  1. 获取目录下所有文件及文件夹
  2. 判断是文件还是文件夹
  3. 如果是文件则更新至文件列表内,如果是文件夹则返回步骤1

此处需重复执行骤1~步骤3,引入递归遍历策略,以上思路更新如下:

  • 步骤1.首先通过传入根目录来判断是否是文件夹,然后判断文件夹下是否有二级目录
  • 步骤2.判断是文件还是二级目录
  • 2.1. 如果不是二级目录,就打印出文件名(更新至文件列表内)
  • 2.2. 如果是二级目录,继续做递归处理(即以二级目录代替步骤1的根目录重复调用),直至遍历所有文件为止。

实现方式:

  1. 获取文件列表功能使用类封装:
  2. 使用时先创建对象,创建时初始化待遍历目录路径:
  3. 然后调用遍历目录文件方法获取文件列表,访问目录下文件列表、新文件列表等属性。
 

import os, time class FileScan(): def __init__(self, rootDir): # 1 初始化 self.rootDir = rootDir # 目录路径 self.fileList = [] # 目录下文件列表 self.newFileList = [] # 新文件列表 def AllFilesScan(self, rootDir): # 2 递归遍历所有文件,并提供具体文件操作功能 for rootDiri in os.listdir(rootDir): # 返回指定目录包含的文件或文件夹的名字的列表 path = os.path.join(rootDir, rootDiri) # 待处理文件夹名字集合 if os.path.isfile(path): # 核心算法:如果是文件就更新至文件列表,如果是目录则递归调用函数自身 self.fileList.append(os.path.abspath(path)) # 获取绝对路径 filename = path.replace("./", "").replace("/", "_").replace("\\", "_").replace(".pdf", ".txt") # 增加路径前缀 self.newFileList.append(filename) elif os.path.isdir(path): self.AllFilesScan(path) def DirScan(self): # 3 启动遍历目录文件方法 self.AllFilesScan(self.rootDir) if __name__ == '__main__': rootDir = r"./EnPapers/" # 根目录文件路径 fs = FileScan(rootDir) # 默认方法参数打印所有文件路径 fs.DirScan() # 遍历文件并进行相关操作 print(len(fs.fileList)) # 访问根目录文件列表 print(len(fs.newFileList))

3. PDF文本信息提取

结合第 3 节介绍的PDF文本信息提取方法,通过函数封装,方便遍历时重复调用。

  • 实现针对指定PDF文件信息进行提取,并保存到指定位置。
 

from win32com import client as wc def pdf2txt(fin, fd, fout): print(fin) wordApp = wc.Dispatch('Word.Application') mytxt = wordApp.Documents.Open(fin) mytxt.SaveAs(fd + fout, FileFormat=4) mytxt.Close() if __name__ == '__main__': fin = r'E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/' + r"Python数据预处理.pdf" fd = r'E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/EnPapersOutput/' fout = r"Python数据预处理.txt" pdf2txt(fin, fd, fout)

E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/Python数据预处理.pdf

4. 遍历提取文本信息

遍历“获取文件列表功能”返回的文件列表,重复调用函数“PDF文本信息提取”,完成文本信息提取及保存。

 

if __name__ == '__main__': rootDir = r"./EnPapers/" # 根目录文件路径 fd = r'E:/gdlgxy/6.数据采集与预处理/准备材料/01教学课件/MarkDown/第07章_文本信息提取/EnPapersOutput/' # 结果文件路径 fs=FileScan(rootDir) # 默认方法参数打印所有文件路径 fs.DirScan() # 遍历文件并进行相关操作 for i in range(len(fs.fileList)): # 访问根目录文件列表 fin = fs.fileList[i] fout = fs.newFileList[i] print(fin) pdf2txt(fin, fd, fout)

E:\gdlgxy\6.数据采集与预处理\准备材料\01教学课件\MarkDown\第07章_文本信息提取\EnPapers\历史\1.pdf
E:\gdlgxy\6.数据采集与预处理\准备材料\01教学课件\MarkDown\第07章_文本信息提取\EnPapers\历史\10.pdf
E:\gdlgxy\6.数据采集与预处理\准备材料\01教学课件\MarkDown\第07章_文本信息提取\EnPapers\历史\11.pdf
E:\gdlgxy\6.数据采集与预处理\准备材料\01教学课件\MarkDown\第07章_文本信息提取\EnPapers\历史\12.pdf
E:\gdlgxy\6.数据采集与预处理\准备材料\01教学课件\MarkDown\第07章_文本信息提取\EnPapers\历史\13.pdf
...

5. 文本信息提取实战小结

综合以上步骤方法,通过类封装成PDF转换txt文档工具,用户只要输入两个参数(源目录路径,目标目录路径),即可完成把源目录下的所有PDF文件转为txt文档,存放至目标目录下。

创建文档转换工具基本结构:

  1. 定义类 FileScan
  2. 定义构造器(实例属性)
  • 源目录路径
  • 目标目录路径
  1. PDF转txt方法
  2. 遍历目录文件方法
  3. 遍历目录文件方法启动
 

#!/usr/bin/python # -*- coding: utf-8 -*- # @Time : 2021年8月17日 # @Author : Alan # @Webchat : kingdragon_lun@126.com # @FileName: ch07.py # @Software: Python 3.7 ''' 功能描述: 遍历目录,将目录下所有PDF文件提取为txt文档 参数描述: 1 rootDir 源目录路径 2 destDir 目标目录路径 ''' import os from win32com import client as wc class FileScan(): def __init__(self, rootDir, destDir): # 1 初始化 self.rootDir = rootDir # 源目录路径(此处只能是相对路径) self.destDir = destDir # 目标目录路径 def pdf2txt(self, fin, fout): # 2 PDF转txt wordApp = wc.Dispatch('Word.Application') mytxt = wordApp.Documents.Open(fin) print(self.destDir + fout) mytxt.SaveAs(self.destDir + fout, FileFormat=4) mytxt.Close() def AllFilesScan(self, rootDir): # 3 递归遍历所有文件,并提供具体文件操作功能 # 返回指定目录包含的文件或文件夹的名字的列表 for rootDiri in os.listdir(rootDir): path = os.path.join(rootDir, rootDiri) # 待处理文件夹名字集合 # 核心算法:如果是文件就更新至文件列表,如果是目录则递归调用函数自身 if os.path.isfile(path): if path[-4:] == '.pdf': fin = os.path.abspath(path) # 获取绝对路径 filename = path.replace("./", "").replace("/", "_").replace("\\", "_").replace(".pdf", ".txt") # 增加路径前缀 self.pdf2txt(fin, filename) else: pass elif os.path.isdir(path): self.AllFilesScan(path) def fileTrans(self): # 4 遍历目录文件方法启动 self.AllFilesScan(self.rootDir) if __name__ == '__main__': rootDir = r"./EnPapers/" # 源目录文件路径(此处只能是相对路径) destDir = r'E:/python/python37/DataCollection/ch07/EnPapersOutput/' # 目标目录文件路径 fs=FileScan(rootDir, destDir) # 默认方法参数打印所有文件路径 fs.fileTrans() # 遍历文件并进行相关操作


开始实验

第5节 附录

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撸码的xiao摩羯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值