赞
踩
最近一直在搞AIGC应用相关测试,从大模型应用到底座算法,过程简单一些就是,企业将一些文档切片、向量化保存起来,应用端传递过来一个问题,算法层面通过关键词搜索相关知识块,然后将这些信息传递给GTP等大模型,大模型根据提供的信息进行加工处理,返回想要的结果。
有的时候应用回答不准确或回答不上来,就需要判断原因,这里面会涉及到知识库、向量库,因为这里可能存在内容丢失的情况,所以要验证是否有内容缺失,这也是今天要说的内容。思路就是,检查三个文档:原始文档、知识库切片后的文档、向量化文档。
首先,向量库的内容要解析,怎么解析,各家有各家方法,如同加密一样,能加密就能解密,区别就是手段不同;然后是知识库文档,这个是切片后的文档不用解析,可以直接查看。但是,这两个文档的内容格式是有区别的,具体表现就是前缀、后缀不同,所以要分别处理,这里先跳过去,今天主要是介绍,如何提取原始文档,它是知识库、向量库的参照。文档主要是PDF、docx,还有就是纯表格形式的PDF。
解析PDF文档,这里介绍两个工具:pdf2docx、pdfplumber。
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对象的方法这里只介绍两个用到的:
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 相关内容,也会继续输出,欢迎交流讨论!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。