首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RAG 召回率低?3 大方案教你批量处理多格式文档,秒变数据大神!

这个数据系列,原计划更新 3 篇!

如果你还没有看前面的内容,可以直接从这里开始。以下是三种处理方案:

方案一:

文本 / 图片 / 表格分别提取处理(点击学习)

将 word、ppt、pdf 等不同格式的文件,统一转换为 html 或 md 格式。然后,分别提取文本、图片和表格,并将图片和表格单独处理成文本形式。

方案二:

统一为图片,统一提取!(点击学习)

把所有文档都转换成图像格式,使用 OCR 技术统一提取其中的内容。这是一种较为简便的方法,将图表与原文本连接在一起,确保文本之间的相关性。

方案三:

所有文档一次性转文本(本篇)

无论是 word、ppt、excel、pdf 还是 jpg 等格式的文档,都可以通过一个脚本智能化地提取其中的文本内容,并将其整理成数据集。

下载了微软官方的财报,其中包含了 word、excel、ppt 等多种格式的办公数据,这些数据在大多数公司中都较为常见。在处理文档时,最大的挑战在于不同格式的数据无法批量处理,需要根据数据格式采用不同的处理策略:

word 文本:直接提取其中的内容。

excel:提取数据并转换为 csv 格式。

ppt / 图像:使用 OCR 技术提取其中的文本。

是否有一种智能化的方法,能够不分开提取,实现自动化处理呢?以下是具体的实现目标:

#A 分类:将文本、表格、图像分门别类。

#B 分别处理:使用合适的工具,智能化地将各类内容处理成文本形式。

#C 合并到 JSON:将同一文件的数据合并到一个 JSON 文件中。

#D

制作成数据集:将处理好的数据制作成数据集,用于 RAG 或微调。

最终呈现的数据格式如下:

格式说明:

sample_number: 样本的唯一编号。

file_source: 文本样本来源的文件名。

text: 实际的文本内容。

拥有了这样的数据,你的 RAG 还会愁召回率低吗?

但是,要获取这样的数据并不简单!

需要将所有文件(无论是文本、图片还是表格)汇总到一个 jsonl 文件中,才能呈现最终的数据格式。以下是一个示例:

格式说明:

block_ID: 文本块的唯一标识符。

doc_ID: 文档的唯一标识符。

content_type: 内容的类型,这里是 "text"。

file_type: 文档的文件类型,这里是 "docx"。

master_index: 主索引,用于跟踪文本块在文档中的位置。

master_index2: 第二个主索引,同样用于跟踪文本块的位置。

coords_x, coords_y, coords_cx, coords_cy: 坐标信息,表示文本块在文档中的位置或大小。

author_or_speaker: 文档的作者或发言者。

modified_date: 文档最后一次修改的日期。

created_date: 文档创建的日期。

creator_tool: 创建文档的工具。

added_to_collection: 文档被添加到集合的时间。

file_source: 文档的源文件名。

external_files: 与文本块相关的外部文件。

header_text: 文档的头部文本。

text_search: 文档中的文本内容,可用于搜索。

user_tags: 用户定义的标签。

special_field1, special_field2, special_field3: 特殊字段,用于存储特定的元数据或标记。

graph_status: 是否包含图表的状态。

dialog: 是否是对话框文本。

embedding_flags: 嵌入标记,指示文本块的处理方式。

数据整理清晰后,就可以依赖你的 RAG 策略了!

整个结果是如何实现的呢?一步步来操作!

人的专注力通常只有 10 分钟!话不多说,我们直接开始:

第一部分:环境准备和搭建

是在 linux 系统上搭建的环境,具体如下:

操作系统:linux/wsl

python 版本:3.10

运行环境:conda

搭建好环境后,我们就可以开始操作了!

具体步骤如下:

创建 conda 环境:conda create -n yiyiai python=3.10

激活环境:conda activate yiyiai

进入刚刚下载依赖的目录:cd **

安装依赖:pip install -r requirements.txt

已经将所有依赖打包好了,你可以直接下载安装。至此,环境搭建完成!

第二部分:运行程序

运行程序非常简单!直接使用以下指令即可:python slicing_and_dicing_office_docs.py稍后我们会详细讲解代码。

第三部分:关键代码详解

整个代码主要完成了以下核心任务:

#A 分类:将文本、表格、图像进行分类。在处理文档时,首先需要识别文档中的不同元素,并将它们分到各自的类别中。

#B

分别处理:使用相应的工具和方法,将不同类型的内容处理成文本格式。具体来说:

文本内容:直接提取并使用。

表格内容:使用专门的表格解析工具提取数据。

图像内容:使用 OCR 技术从图像中提取文本。

这个过程涉及将非文本内容(如表格和图像)转换为文本格式,以便进一步分析。

#C 合并到 JSON:将处理后的文本内容合并到一个结构化的数据格式中,例如 JSON。每个文档或文档的部分会被转换成一个 JSON 对象,其中包含各种元数据和提取的文本。

#D

制作成数据集:将这些 JSON 对象组合成一个或多个数据集,用于各种下游任务,如 RAG 或微调。

现在,我们来详细了解如何实现这些功能!首先,定义智能化处理机制。雄哥编写了一个机制,按照标准处理文本。如果遇到表格,将get_tables设置为True,则转入表格处理流程;如果遇到图片,则转入图片处理流程:

# 解析解压后的文件,添加智能化分块,捕捉标点符号或回车

parsing_output = my_lib.add_files(temp_dir, chunk_size=400, max_chunk_size=600, smart_chunking=1, get_tables=get_tables, get_images=get_images)

遇到表格时,将其提取为 csv 格式,并保存到output_path:

这行代码创建了一个Query类的实例q,并将lib作为参数传递给Query类的构造函数。lib是一个包含数据源或配置信息的对象,Query类将使用这些信息执行查询操作。接着,调用q对象的export_all_tables方法,该方法用于从lib中提取所有表格数据,并将数据导出到由output_fp参数指定的文件路径,而output_fp通过lib.output_path获取,表明lib对象具有output_path属性,用于定义输出文件的位置。

遇到图片时,使用 OCR 进行处理:

这段代码调用了lib对象的run_ocr_on_images方法,并在方法执行完毕后打印一条消息。具体说明如下:

run_ocr_on_images

调用该方法对图像进行光学字符识别(OCR)处理。

add_to_library=True

该参数表示处理后的 OCR 结果将被添加到某个库或集合中,便于后续进一步处理。

chunk_size=400

该参数指定了 OCR 处理过程中,一次处理的图像数量或数据大小。这里设置为 400,意味着 OCR 处理将以 400 个图像或数据块为单位进行。

min_size=10

该参数指定了图像的最小尺寸,低于这个尺寸的图像将不会被处理。

realtime_progress=True

该参数表示在 OCR 处理过程中,将实时输出进度信息,设置为True时,用户可以实时看到处理状态或进度。

最后,将所有文本信息导出为 json:

然后,创建一个数据集:

以下是对这段代码的逐行介绍:

ds = Datasets(library=lib, testing_split=0.10, validation_split=0.10, ds_id_mode="random_number")

Datasets

这是一个类名,用于创建数据集的实例。

library=lib

将lib对象传递给Datasets类,lib是一个包含数据源和配置信息的库。

testing_split=0.10

该参数指定数据集中用于测试的比例,这里 10% 的数据将被用作测试集。

validation_split=0.10

该参数指定数据集中用于验证的比例,同样 10% 的数据将被用作验证集。

ds_id_mode="random_number"

该参数用于指定如何生成数据集中的样本 ID,这里设置为"random_number",表示 ID 将基于随机数生成。

ds_output = ds.build_text_ds(min_tokens=100, max_tokens=500)

build_text_ds

这是ds对象的一个方法,用于构建文本数据集。

min_tokens=100

该参数指定数据集中每个文本样本的最小令牌(token)数量,小于 100 个令牌的文本样本将不会被包含在数据集中。

max_tokens=500

该参数指定数据集中每个文本样本的最大令牌数量,超过 500 个令牌的文本样本将被截断或排除。

至此,整个处理过程就完成了!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OON8TFljmm7NAIAgOIhr-s3A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券