本章详细介绍了Word 文本信息提取方式、PDF 文本信息提取方式等内容。
无
1.文本提取介绍
2.Word 文本信息提取
3.PDF 文本信息提取
4.文本信息提取实战
通过数据采集获取的数据信息往往五花八门、杂乱无章,因此需要对这些不同类型的数据进行集成,并将集成数据传入到电脑中,然后通过算法模型挖掘其潜在的价值,作为智能应用的支撑。
采集的原数据存在数据质量差、文档格式杂、数据表示形式多样化、数据信息错误等诸多问题,单纯考虑文本信息处理工作,就文本信息而言,采集到的文档数据可能是网页、SQL文件、PDF文档、doc文档等,对这些文本数据继承的思路就是文本信息的提取,然后进行格式化处理,常见的文本抽取方式包括:
作为优秀的程序员,本章将针对第三种方式展开讨论。
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/
本章将应用Pywin32 调用系统本地应用接口,通过本地应用对源文档进行打开、另存为文本文档。基本步骤:
打开Word应用程序
打开Word文档/PDF文档
保存为txt文档
关闭Word应用程序
下面将以抽取Word文档中的文本为例,来介绍抽取文件信息的方法,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()
下面将以抽取PDF文档中的文本为例,来介绍抽取文件信息的方法,PDF文档内容信息如下:
代码逻辑:
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()
需求描述
结合前述的文本抽取方法,实现目录下新闻文本的批量抽取(历史、教育、汽车各30篇的PDF文档文本内容的抽取),可以在根目录下文档的批量抽取,并自动保存到指定位置。
实现思路
实现思路:
遍历文件列表思路:
此处需重复执行骤1~步骤3,引入递归遍历策略,以上思路更新如下:
- 2.1. 如果不是二级目录,就打印出文件名(更新至文件列表内)
- 2.2. 如果是二级目录,继续做递归处理(即以二级目录代替步骤1的根目录重复调用),直至遍历所有文件为止。
实现方式:
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文本信息提取方法,通过函数封装,方便遍历时重复调用。
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
遍历“获取文件列表功能”返回的文件列表,重复调用函数“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
...
综合以上步骤方法,通过类封装成PDF转换txt文档工具,用户只要输入两个参数(源目录路径,目标目录路径),即可完成把源目录下的所有PDF文件转为txt文档,存放至目标目录下。
创建文档转换工具基本结构:
- 源目录路径
- 目标目录路径
#!/usr/bin/python # -*- coding: utf-8 -*- # @Time : 2021年8月17日 # @Author : Alan # @Webchat : [email protected] # @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() # 遍历文件并进行相关操作
开始实验