这个数据系列,原计划更新 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 个令牌的文本样本将被截断或排除。
至此,整个处理过程就完成了!
领取专属 10元无门槛券
私享最新 技术干货