Python 读取PDF、Word文档

本文讲述了在AIGC应用中,如何处理企业文档的切片、向量化存储和检索,遇到的问题如内容丢失时如何检测,以及使用pdf2docx和pdfplumber工具解析PDF,以及如何通过比对原始文档与知识库/向量库内容进行校验的过程。
摘要由CSDN通过智能技术生成

  最近一直在搞AIGC应用相关测试,从大模型应用到底座算法,过程简单一些就是,企业将一些文档切片、向量化保存起来,应用端传递过来一个问题,算法层面通过关键词搜索相关知识块,然后将这些信息传递给GTP等大模型,大模型根据提供的信息进行加工处理,返回想要的结果。
有的时候应用回答不准确或回答不上来,就需要判断原因,这里面会涉及到知识库、向量库,因为这里可能存在内容丢失的情况,所以要验证是否有内容缺失,这也是今天要说的内容。思路就是,检查三个文档:原始文档、知识库切片后的文档、向量化文档。

  首先,向量库的内容要解析,怎么解析,各家有各家方法,如同加密一样,能加密就能解密,区别就是手段不同;然后是知识库文档,这个是切片后的文档不用解析,可以直接查看。但是,这两个文档的内容格式是有区别的,具体表现就是前缀、后缀不同,所以要分别处理,这里先跳过去,今天主要是介绍,如何提取原始文档,它是知识库、向量库的参照。文档主要是PDF、docx,还有就是纯表格形式的PDF。

  解析PDF文档,这里介绍两个工具:pdf2docxpdfplumber

  pdf2docx模块可以直接从PDF文件中提取文本和图片,并将其转换成可编辑的Word文档。它可以处理包含复杂布局和格式的PDF文件,并保留原始的字体、颜色、大小和格式等属性。可以直接调用 parse(pdf_file:str,docx_file:str=None, password:str=None, start:int=0, end:int=None, pages:list=None, **kwargs)。

pdf2docx.parse(r"E:\2023年1月5日第一次产品项目会.pdf",r"E:\src.docx")

pdf2docx.parse(r"E:\全新第三代RX5 保修及保养手册.pdf",r"E:\src.docx",pages=[15])

  也可以创建一个Converter对象后,调用convert(docx_filename:str=None,start:int=0,end:int=None,pages:list=None, **kwargs),最终都是生成一个 word文档。Converter对象还有一个方法 extract_tables(start:int=0,end:int=None,pages:list=None),输出pdf里面的表格,是一个数组,后期需要用 pandas处理。

cv = pdf2docx.Converter(r"E:\2023年1月5日第一次产品项目会.pdf")
cv.convert(r"E:\src.docx")
cv.close()
cv = pdf2docx.Converter(r"E:\MG7 配置表.pdf")
table = cv.extract_tables()
print(table)

  另一个处理PDF工具就是pdfplumber,首先调用 open(path_or_fp,pages=None),返回 PDF 实例,PDF实例有个属性 pages,调用 pages返回一个Page对象列表,里面存放的都是每一页的内容。Page对象的方法这里只介绍两个用到的:

  • extract_text():获取当页所有文本,如果内容为空,返回 None;使用该方法,表格中的文本也会被抽取出来,但是文本是按照"行"来读取的,表格内的文字会出现"错行"的情况。
  • extract_tables():返回从页面上找到的所有表中提取的文本,并以结构 table -> row -> cell 的形式表示为列表列表的列表。
import pdfplumber
with pdfplumber.open(r"E:\2023年1月5日第一次产品项目会.pdf") as fp:
    for p in  fp.pages:
        print(p.extract_text()

  这两个工具怎么选,看自己需求。pdf2docx 的parse()/convert()方法是将 PDF 转成了 word,如果既有文本,也有表格,一并输出,保持格式,所以,后面要再处理一次;而extract_tables()方法只处理表格,忽略文本。pdfplumber 的extract_text()方法输出的就是字符串,但是,如果里面有表格,会造成错行现象;而extract_tables()方法只处理表格,忽略文本。我这里的知识库保存的是txt格式,向量库解析后也是保存在txt,所以,处理纯文本pdf,我就用pdfplumber,处理表格就无所谓了,另外,我问过开发,文本与表格的解析切片方法不一样,而且,pdf里面的图片、表格他不处理,如果是重要的表格内容,建议做成纯表格文档单独解析。

  最后,处理docx文档,这个就是使用 docx 工具的 Document 方法,很简单,传入word文档地址,实例化一个 Document 对象,然后调用 paragraphs 返回一个所有段落对象Paragraph的列表,再调用 Paragraph 对象的 text 属性就可以获取每个段落的文本了。

doc = Document(r"E:\HDLP客户端卸载手册.docx")

for p in doc.paragraphs:
    print(p.text)

  到这里,初步完成了原始内容的获取,后面还有很多要处理的事情,因为拿到的源文档与知识库、向量库的格式不一样,要进行处理拼接,尤其是表格,把格式对齐之后,就可以比对内容了。相似度比较,也有很多工具,比如:FuzzyWuzzy、difflib、余弦相似度、TF-IDF等,网上有很多,这里不赘述,我是直接用Python自带的 difflib,比对字数、相似度,内容丢失,是成片的,不是丢失几个字,所以,大差不差就行了,方法如下:

def compare_str():
    src = pdf_table_src()
    load = pdf_load_file()
    ret = difflib.SequenceMatcher(None,src,load).quick_ratio()
    return len(src),len(load),ret

  今天就到这里,后面如果还有 AIGC 相关内容,也会继续输出,欢迎交流讨论!

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值