Python3的PDF文件读取与处理


Python3的PDF文件读取与处理

由于财报和社会责任报告都是PDF格式的,所以为了与我们的BERT分类工作衔接起来,需要读取并且简单处理一下PDF文件,变成我们需要的字符串格式,并且从中提取我们需要的信息。

PDF文件读取

首先我们把PDF文件读进来,需要安装一个包pdfminer.six

pip install pdfminer.six

这是Python3用于处理PDF文件,提取文字内容的包。然后参考这篇文章的代码,先跑一下试试看看能不能读取PDF文件。以下是源码,这里我们读取中国平安2020年的财报:

import sys
import importlib
importlib.reload(sys)

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfpage import PDFTextExtractionNotAllowed

# 对本地保存的pdf文件进行读取和写入到txt文件当中

# 定义解析函数
def pdftotxt(path,new_name):
    # 创建一个文档分析器
    parser = PDFParser(path)
    # 创建一个PDF文档对象存储文档结构
    document =PDFDocument(parser)
    # 判断文件是否允许文本提取
    if not document.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建一个PDF资源管理器对象来存储资源
        resmag =PDFResourceManager()
        # 设定参数进行分析
        laparams =LAParams()
        # 创建一个PDF设备对象
        # device=PDFDevice(resmag)
        device =PDFPageAggregator(resmag,laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter = PDFPageInterpreter(resmag, device)
        # 处理每一页
        for page in PDFPage.create_pages(document):
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout =device.get_result()
            for y in layout:
                if(isinstance(y,LTTextBoxHorizontal)):
                    with open("%s"%(new_name),'a',encoding="utf-8") as f:
                        f.write(y.get_text()+"\n")

# 获取文件的路径
path =open( "海天味业:海天味业2020年年度报告.pdf",'rb')
pdftotxt(path, "pdfminer.txt")

经过运行之后得到pdfminer.txt,打开之后发现对于连续的文字内容的提取效果还是可以的,大概可以把财报中连续的文字部分的每一行,处理为字符串形式的一行,是可以供我们使用的。

简单处理

一份典型的财报主要内容包括:释义、公司简介及主要财务指标、公司业务概要、经营情况讨论与分析、重要事项等情况,每一部分又有特定的小标题,我们来加一个简单的筛选,把“公司业务概要”中的“报告期内核心竞争力分析”部分提取出来,并且把得到的内容变成句号分割的单独文本:

import sys
import importlib
importlib.reload(sys)

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
# 对本地保存的pdf文件进行读取和写入到txt文件当中

index = 0

# 定义解析函数
def pdftotxt(path):
	# 创建一个文档分析器
	parser = PDFParser(path)
	# 创建一个PDF文档对象存储文档结构
	document =PDFDocument(parser)
	# 判断文件是否允许文本提取
	if not document.is_extractable:
		raise PDFTextExtractionNotAllowed
	else:
		# 创建一个PDF资源管理器对象来存储资源
		resmag =PDFResourceManager()
		# 设定参数进行分析
		laparams =LAParams()
		# 创建一个PDF设备对象
		# device=PDFDevice(resmag)
		device =PDFPageAggregator(resmag,laparams=laparams)
		# 创建一个PDF解释器对象
		interpreter = PDFPageInterpreter(resmag, device)
		# 处理每一页
		flag = 0
		content = ''
		for page in PDFPage.create_pages(document):
			interpreter.process_page(page)
			# 接受该页面的LTPage对象
			layout =device.get_result()
			for y in layout:
				if(isinstance(y,LTTextBoxHorizontal)):
					temp = y.get_text()
					if '报告期内核心竞争力分析' in temp: flag = 1
					if '经营情况讨论与分析' in temp: flag = 0
					if flag: content = content+temp.replace('\n', '')

		global index
		content = content.split('。')
		print(content)
		for temp in content:
			with open(str(index)+'.txt','w',encoding="utf-8") as f:
				f.write(temp)
				f.close()
				index = index+1

# 获取文件的路径
path =open( "海天味业:海天味业2020年年度报告.pdf",'rb')
pdftotxt(path)

然后我们就可以得到很多个文本啦。后面我们可以根据需要,以不同的方式进行分割,然后小仙女来打标签,再接着进行训练。因为这里的文本变化是从0递增的,所以将来就新建一个excel,按列来写入标签即可,有类别或者无类别,有类别的话属于什么类别,就可以进行后续BERT步骤啦。

开心!基于BERT预训练模型的分类整个pipeline就打通啦!完结撒花!


评论
  目录