Youtu-Parsing多模态文档解析实战:基于Python的自动化信息提取教程

news2026/5/5 6:51:56
Youtu-Parsing多模态文档解析实战基于Python的自动化信息提取教程你是不是经常被一堆PDF、Word文档搞得头大财务报告、合同扫描件、产品手册这些非结构化的文档里藏着大量有用信息但手动提取既费时又容易出错。我之前接手一个项目需要从几百份供应商合同里提取关键条款和金额差点没把我累趴下。后来我发现用多模态AI模型来解析文档效率能提升几十倍。今天要聊的Youtu-Parsing就是一个专门干这事的“文档理解专家”。它能看懂文档里的文字、表格、图片还能理解它们之间的关系把乱七八糟的文档变成结构化的数据。这篇文章我就手把手带你走一遍完整的流程怎么在星图GPU平台上一键部署这个模型怎么用Python脚本批量处理文档以及怎么把解析出来的信息整理成你想要的格式。就算你之前没接触过文档解析跟着做一遍也能搞定。1. 环境准备与快速部署首先得有个能跑模型的地方。Youtu-Parsing对算力有点要求特别是处理高分辨率扫描件的时候。自己配环境太麻烦我推荐直接用星图GPU平台的预置镜像几分钟就能搭好。1.1 获取并启动镜像登录星图平台在镜像广场搜索“Youtu-Parsing”。你会看到一个官方维护的镜像点进去看看配置说明。通常它会预装好模型所需的所有依赖比如PyTorch、相关的Python库还有模型权重文件本身。选择适合你需求的GPU规格。如果只是测试和解析少量文档中等规格的GPU就够用了如果要批量处理大量高清文档建议选显存大一点的。选好配置后点击“部署”或“启动”平台会自动创建一台云主机实例。这个过程就像租了一台已经装好所有软件的超级电脑省去了自己安装、配置、下载模型文件的繁琐步骤。等个两三分钟实例状态变成“运行中”后记下它的公网IP地址。这个地址就是你后续访问API的入口。1.2 验证服务状态实例启动后模型服务通常会自动在后台运行。我们需要确认一下它是否正常工作了。打开你的终端本地电脑上的就行用curl命令或者直接在浏览器里访问一下健康检查接口。假设你的实例IP是123.123.123.123服务端口默认是8000具体端口请以镜像说明为准那么可以试试这个命令curl http://123.123.123.123:8000/health如果返回一个包含{status: ok}之类的JSON消息那就说明模型服务已经准备就绪在等你发号施令了。如果没反应或者报错可以去实例的控制台查看日志通常问题出在端口没开或者依赖库缺失按照日志提示解决就好。2. 核心概念它到底能“解析”出什么在写代码之前咱们先搞清楚这个模型投喂文档后能吐出些什么东西。这决定了我们后续怎么处理这些结果。Youtu-Parsing的“解析”是立体的不仅仅是把图片上的字认出来OCR。它会把一个文档页面理解成一个由不同“元素”组成的画面文本行Text Line一段连续的文本就像你肉眼看到的一行字。模型会给出这行文字的内容以及它在页面上的精确位置一个包围框的坐标。文本框Text Block由多个语义相关的文本行组成的区域比如一个段落、一个标题。模型会尝试把这些零散的行聚合成有逻辑的块。表格Table这是重头戏。模型不仅能检测出表格的区域还能识别出表格的结构——有几行几列每个单元格里是什么内容。输出结果通常是一个二维数组列表的列表或者更结构化的数据方便你直接转成Excel。图片Figure文档中的插图、图表、logo等。模型会标出它们的位置有时还能对图片内容进行简单的分类或描述。文档结构Layout模型能判断哪些是标题、哪些是正文、哪些是页眉页脚。这对于理解文档的层次和自动生成大纲很有帮助。简单来说你给它一张文档图片或一个PDF文件它还你一份详细的“元素清单”和“位置地图”。接下来的Python脚本就是用来和这份清单打交道的。3. 用Python脚本调用解析API环境好了原理懂了现在开始写代码。整个过程就是准备文档、发送请求、处理响应。3.1 安装必要的Python库在你的本地开发环境或者星图实例的终端里安装几个必备的库。如果实例的镜像已经预装了可以跳过这一步。pip install requests Pillow opencv-python PyPDF2requests用来发送HTTP请求到我们的模型API。Pillow(PIL)一个非常常用的图像处理库用来加载和预处理图片。opencv-python(cv2)另一个强大的图像处理库这里我们主要可能用它来读图片或做简单转换。PyPDF2用于处理PDF文件比如提取某一页转换为图片。3.2 准备待解析的文档模型API通常接受直接上传的图像文件如PNG, JPG或PDF文件。我们需要把文档准备好如果是多页PDF可能需要一页一页地处理。这里写一个函数演示如何将PDF的第一页转换为图像这对于处理扫描版PDF非常有用。import io from PIL import Image import PyPDF2 import requests def convert_pdf_first_page_to_image(pdf_path, output_image_pathfirst_page.jpg): 将PDF文件的第一页转换为JPG图像。 参数: pdf_path: PDF文件的路径。 output_image_path: 输出的图像文件路径。 返回: 图像文件的路径。 # 打开PDF文件 with open(pdf_path, rb) as file: reader PyPDF2.PdfReader(file) # 获取第一页 first_page reader.pages[0] # 这里简化处理实际上PyPDF2不直接转图像可能需要用pdf2image库。 # 为了示例流畅我们假设使用了一个虚拟的转换函数。 # 在实际项目中你可能需要安装 pdf2image 并配合 poppler。 # from pdf2image import convert_from_path # images convert_from_path(pdf_path, first_page1, last_page1) # images[0].save(output_image_path, JPEG) print(f[提示] 在实际项目中请使用 pdf2image 库进行PDF到图像的转换。) print(f[模拟] 已将PDF {pdf_path} 的第一页准备为图像 {output_image_path}。) # 模拟一个已存在的图像文件路径用于后续步骤 return output_image_path # 假设我们有一个PDF文件 pdf_file sample_contract.pdf image_file convert_pdf_first_page_to_image(pdf_file)注意上面的代码中PDF转图像部分我用了模拟说明。在实际操作中我强烈推荐使用pdf2image这个库它转换质量很好。安装命令是pip install pdf2image同时你的系统或环境里还需要安装poppler-utils。3.3 调用模型API进行解析这是最核心的一步。我们将准备好的图像文件通过HTTP POST请求发送给部署好的Youtu-Parsing服务。def parse_document_with_youtu(image_path, server_urlhttp://123.123.123.123:8000): 调用Youtu-Parsing服务解析文档图像。 参数: image_path: 要解析的图像文件路径。 server_url: Youtu-Parsing模型服务的地址不含端点。 返回: 解析结果的JSON字典。 # 构建完整的API端点URL这里假设端点是 /parse api_endpoint f{server_url}/parse # 以二进制模式打开图像文件 with open(image_path, rb) as img_file: # 构建请求数据通常文件字段名是 image 或 file files {image: (image_path, img_file, image/jpeg)} # 可以附加一些参数比如是否返回表格结构、是否启用OCR增强等 data {return_table_html: True, enable_enhancement: True} print(f正在向 {api_endpoint} 发送解析请求...) try: response requests.post(api_endpoint, filesfiles, datadata, timeout60) response.raise_for_status() # 如果状态码不是200抛出异常 result response.json() print(文档解析成功) return result except requests.exceptions.RequestException as e: print(f请求失败: {e}) if hasattr(e, response) and e.response is not None: print(f错误详情: {e.response.text}) return None # 使用上一步“准备”好的图像文件进行解析 parsed_result parse_document_with_youtu(image_file) if parsed_result: # 可以先简单打印一下结果的结构看看有哪些键 print(\n解析结果包含的顶级字段:, parsed_result.keys())这段代码做了几件事读取图片、打包成请求、发送给服务器、接收JSON格式的解析结果。timeout参数设定了60秒超时因为解析复杂文档可能需要一些时间。4. 处理与利用解析结果拿到那一大坨JSON数据后我们得把它变成有用的信息。下面看看怎么提取最常见的文本和表格。4.1 提取并整理文本内容解析结果中的文本信息可能分布在text_lines文本行和text_blocks文本框中。我们可以按位置通常是自上而下、从左至右将它们排序拼接成连贯的文本。def extract_and_order_text(parsed_data): 从解析结果中提取文本并按阅读顺序排序。 参数: parsed_data: parse_document_with_youtu 返回的字典。 返回: 排序后的文本字符串列表以及完整的文档文本。 all_text_elements [] # 检查并处理文本行 if text_lines in parsed_data: for line in parsed_data[text_lines]: # 假设每行数据包含 text 和 bbox (边界框) if text in line and bbox in line: # bbox 通常是 [x1, y1, x2, y2]取左上角y坐标作为排序依据 x1, y1, x2, y2 line[bbox] all_text_elements.append({ text: line[text], y_top: y1, x_left: x1 }) # 也可以处理文本框逻辑类似 if text_blocks in parsed_data: for block in parsed_data[text_blocks]: if text in block and bbox in block: x1, y1, x2, y2 block[bbox] all_text_elements.append({ text: block[text], y_top: y1, x_left: x1 }) # 按从上到下(y_top)从左到右(x_left)排序 all_text_elements.sort(keylambda elem: (elem[y_top], elem[x_left])) ordered_texts [elem[text] for elem in all_text_elements] full_text \n.join(ordered_texts) print(f共提取出 {len(ordered_texts)} 个文本元素。) print(--- 前5个排序后的文本 ---) for i, text in enumerate(ordered_texts[:5]): print(f{i1}. {text}) return ordered_texts, full_text if parsed_result: ordered_texts, full_doc_text extract_and_order_text(parsed_result) # 你可以把 full_doc_text 保存到文件或者进行进一步的分析 with open(extracted_text.txt, w, encodingutf-8) as f: f.write(full_doc_text) print(\n全文已保存至 extracted_text.txt)4.2 提取并重建表格数据表格提取是Youtu-Parsing的强项。结果里可能直接包含了结构化的表格数据。def extract_tables(parsed_data): 从解析结果中提取表格数据。 参数: parsed_data: 解析结果字典。 返回: 一个列表每个元素是一个表格的二维列表行x列。 extracted_tables [] if tables in parsed_data: for i, table in enumerate(parsed_data[tables]): print(f\n处理表格 {i1}...) # 表格数据可能以多种形式存在比如 html, cells, data table_data [] if data in table and isinstance(table[data], list): # 情况1直接提供了二维数组 table_data table[data] print(f 直接获取到 {len(table_data)} 行数据。) elif cells in table and isinstance(table[cells], list): # 情况2提供了单元格列表需要根据行列索引重建 # 假设每个cell有 row, col, text cells table[cells] if cells: max_row max(cell.get(row, 0) for cell in cells) max_col max(cell.get(col, 0) for cell in cells) # 初始化一个空表格 table_data [[ for _ in range(max_col 1)] for _ in range(max_row 1)] for cell in cells: r, c cell.get(row, 0), cell.get(col, 0) if r max_row and c max_col: table_data[r][c] cell.get(text, ) print(f 从 {len(cells)} 个单元格重建表格。) if table_data: extracted_tables.append(table_data) # 打印前几行看看效果 print(f 表格前3行预览:) for row_idx, row in enumerate(table_data[:3]): print(f 行{row_idx}: {row}) print(f\n总共提取了 {len(extracted_tables)} 个表格。) return extracted_tables if parsed_result: tables extract_tables(parsed_result) # 可以将表格保存为CSV import csv for idx, table in enumerate(tables): csv_filename ftable_{idx1}.csv with open(csv_filename, w, newline, encodingutf-8-sig) as csvfile: # utf-8-sig支持Excel中文 writer csv.writer(csvfile) writer.writerows(table) print(f表格 {idx1} 已保存为 {csv_filename})4.3 实现批量处理与结果汇总单文件解析搞定后批量处理就是加个循环。我们还可以把每个文件的结果汇总到一个结构化的报告里比如JSON或数据库。import os import json def batch_parse_documents(doc_folder, server_url, output_folderparsed_results): 批量解析一个文件夹内的文档支持PDF和图像。 参数: doc_folder: 存放文档的文件夹路径。 server_url: 模型服务地址。 output_folder: 存放解析结果的文件夹。 # 创建输出文件夹 os.makedirs(output_folder, exist_okTrue) # 支持的文件格式 supported_ext [.pdf, .jpg, .jpeg, .png, .tiff, .bmp] all_results_summary [] for filename in os.listdir(doc_folder): filepath os.path.join(doc_folder, filename) file_ext os.path.splitext(filename)[1].lower() if file_ext not in supported_ext: continue print(f\n{*50}) print(f正在处理文件: {filename}) image_to_parse None # 如果是PDF转换第一页为图片这里需要你实现或调用实际的转换函数 if file_ext .pdf: # 此处应替换为实际的PDF转图像代码例如使用 pdf2image # images convert_from_path(filepath, first_page1, last_page1) # image_to_parse temp_first_page.jpg # images[0].save(image_to_parse) print(f [注意] 跳过PDF {filename}请补充转换代码。) continue # 跳过仅作演示 else: image_to_parse filepath # 调用解析函数 result parse_document_with_youtu(image_to_parse, server_url) if result: # 提取关键信息 _, full_text extract_and_order_text(result) tables extract_tables(result) # 构建该文件的摘要 file_summary { filename: filename, text_preview: full_text[:500] ... if len(full_text) 500 else full_text, # 预览前500字符 table_count: len(tables), has_figures: figures in result and len(result[figures]) 0 } all_results_summary.append(file_summary) # 将完整结果保存为JSON文件 result_filename os.path.splitext(filename)[0] _parsed.json result_path os.path.join(output_folder, result_filename) with open(result_path, w, encodingutf-8) as f: json.dump(result, f, ensure_asciiFalse, indent2) print(f 完整结果已保存至: {result_path}) # 保存批量处理摘要 summary_path os.path.join(output_folder, batch_summary.json) with open(summary_path, w, encodingutf-8) as f: json.dump(all_results_summary, f, ensure_asciiFalse, indent2) print(f\n{*50}) print(f批量处理完成摘要已保存至: {summary_path}) print(f共处理了 {len(all_results_summary)} 个文档。) # 示例调用 # batch_parse_documents(./my_docs, http://123.123.123.123:8000)5. 常见问题与排查指南第一次跑通流程可能会遇到些小麻烦这里列几个我常碰到的API连接失败检查星图实例的IP和端口是否正确确认安全组规则是否放行了该端口例如8000。在实例内部用curl localhost:8000/health测试如果内部通外部不通就是网络配置问题。解析结果为空或不准可能是文档图片质量太差分辨率低、倾斜、阴影。上传前可以用图像处理库如OpenCV做个简单的预处理转灰度、二值化、纠偏。对于PDF确保转换图像时的DPI设置足够高建议300 DPI以上。处理速度慢复杂文档或高分辨率图像解析需要时间。在代码中适当增加timeout值。如果是批量任务可以考虑使用异步请求如aiohttp库来并发处理或者检查GPU利用率是否饱和。内存不足OOM处理特大尺寸图片时可能发生。可以在调用API前使用PIL库将图像等比例缩放至一个合理尺寸如宽度不超过2000像素同时保持长宽比。表格结构错乱有些合并单元格或样式复杂的表格模型识别可能不完美。对于关键数据可以结合正则表达式或规则对提取后的表格数据进行二次清洗和校验。6. 总结走完这一趟你应该已经能在星图平台上把Youtu-Parsing模型跑起来并且用Python脚本指挥它为你自动解析文档了。从环境部署、API调用到结果处理这套组合拳打下来处理成百上千份文档就不再是体力活。实际用起来你会发现最大的功夫可能花在结果的后处理上。模型给了你丰富的原材料文本块、表格数据、位置信息如何把这些信息精准地抽取成你业务系统需要的字段比如合同里的甲乙方、金额、日期还需要结合一些规则模板或者更高级的信息抽取模型。但无论如何Youtu-Parsing已经完成了最困难、最基础的一步——把非结构化的文档图像变成了结构化的数据。接下来你可以试着用它去处理你自己的文档比如发票、报告、简历。开始的时候从简单的、清晰的文档入手看看效果。遇到识别不好的情况想想是不是图片质量问题或者调整一下API的调用参数。多试几次你就能摸清它的脾气让它更好地为你服务了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…