一、文档解析器工厂架构详解1.1 deepdoc/parser/init.py解析器工厂完整解析代码完整解析(40行)# Licensed under the Apache License, Version 2.0 (the "License");# you may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.from.docx_parserimportRAGFlowDocxParserasDocxParser# Word文档解析器# 【设计】别名简化:RAGFlowDocxParser → DocxParser# 【职责】解析.docx文件,提取结构化文本和表格from.excel_parserimportRAGFlowExcelParserasExcelParser# Excel表格解析器# 【设计】别名简化:RAGFlowExcelParser → ExcelParser# 【职责】解析.xlsx文件,识别表格结构和数据from.html_parserimportRAGFlowHtmlParserasHtmlParser# HTML网页解析器# 【职责】解析HTML网页,提取文本和超链接from.json_parserimportRAGFlowJsonParserasJsonParser# JSON数据解析器# 【职责】解析JSON数据,提取结构化信息from.markdown_parserimportMarkdownElementExtractor# Markdown元素提取器# 【职责】提取Markdown标题、列表、代码块等元素from.markdown_parserimportRAGFlowMarkdownParserasMarkdownParser# Markdown文档解析器# 【职责】完整解析Markdown文档from.pdf_parserimportPlainParser# PDF纯文本解析器# 【职责】仅提取PDF文本,不OCR,速度快(适合纯文本PDF)from.pdf_parserimportRAGFlowPdfParserasPdfParser# PDF深度解析器# 【职责】OCR+布局分析+表格识别(适合复杂PDF,准确率高)from.ppt_parserimportRAGFlowPptParserasPptParser# PPT演示文稿解析器# 【职责】解析PPT,提取幻灯片文本和图片from.txt_parserimportRAGFlowTxtParserasTxtParser# 纯文本解析器# 【职责】解析.txt文件,最简单的解析器__all__=[# 模块导出控制,对外暴露的解析器"PdfParser",# PDF深度解析器(最复杂)"PlainParser",# PDF纯文本解析器(最简单)"DocxParser",# Word文档解析器"ExcelParser",# Excel表格解析器"PptParser",# PPT演示文稿解析器"HtmlParser",# HTML网页解析器"JsonParser",# JSON数据解析器"MarkdownParser",# Markdown文档解析器"TxtParser",# 纯文本解析器"MarkdownElementExtractor",# Markdown元素提取器(辅助工具)]# 【设计】导出顺序:按复杂度排序,PdfParser最复杂排第一# 【用途】外部模块通过 `from deepdoc.parser import PdfParser` 导入【设计模式分析】:工厂模式:__init__.py作为解析器工厂,统一管理所有解析器类别名模式:as DocxParser简化类名,便于使用(减少RAGFlow前缀)模块导出控制:__all__明确导出内容,避免私有解析器被误用职责分离:每个解析器专注单一文档格式,符合单一职责原则【技术决策】:为什么分开PlainParser和PdfParser?纯文本PDF用PlainParser速度快(直接提取文本)图片/扫描PDF用PdfParser准确率高(OCR识别)用户可根据文档类型选择合适解析器为什么用别名?原始类名RAGFlowPdfParser太长(15字符)别名PdfParser简洁(9字符)便于代码编写和阅读为什么导出MarkdownElementExtractor?提取Markdown元素是独立功能不依赖完整解析器用户可单独调用提取标题、列表等为什么支持9种格式?实际业务文档类型多样多格式支持提升适用性覆盖常见文档类型1.2 解析器工厂架构图.pdf.pdf纯文本.docx.xlsx.pptx.html.json.md.txt文档输入各种格式文件格式判断文件扩展名PdfParserOCR+布局+表格PlainParser文本提取DocxParser结构化提取ExcelParser表格识别PptParser幻灯片提取HtmlParser网页解析JsonParser数据解析MarkdownParser格式解析TxtParser纯文本OCR引擎文本识别布局识别器标题/段落/表格表格识别器结构识别文本块列表统一输出格式文本+位置+结构传递给RAG Pipeline分块和向量化1.3 解析器输出格式详解所有解析器统一输出格式(标准化处理):# 解析器输出格式示例(JSON结构){"document_id":"doc_123abc",# 文档唯一ID"pages":[# 页面列表(PDF多页,其他单页){"page_num":1,# 页码(从1开始)"blocks":[# 文本块列表{"type":"text",# 块类型:text/title/table/figure"text":"这是标题文本",# 文本内容"bbox":[100,200,500,250],# 坐标:[x0,y0,x1,y1]"page":1,# 所在页码"confidence":0.95,# OCR置信度(0-1)"layout_type":"Title",# 布局类型:Title/Text/Table等"font_size":18,# 字体大小(推断)"is_bold":True,# 是否粗体(推断)},{"type":"table",# 表格块"text":"表头1 | 表头2 | 表头3\n数据1 | 数据2 | 数据3","bbox":[100,300,600,500],"page":1,"html":"tabletrth表头1/th.../table",# 表格HTML"rows":5,# 行数"cols":3,# 列数},{"type":"text","text":"这是段落文本...","bbox":[100,520,600,700],"page":1,"layout_type":"Text",},],},{"page_num":2,# 第二页"blocks":[...],},],"total_pages":10,# 总页数"parse_time":12.5,# 解析耗时(秒)"parser_type":"PdfParser",# 使用的解析器类型}【输出格式设计】:统一结构:所有解析器输出相同格式,便于后续处理位置信息:bbox坐标支持文本定位和引用标注类型分类:type和layout_type区分标题、段落、表格等置信度:OCR置信度帮助判断识别准确性表格HTML:表格输出HTML格式,便于展示和引用二、PDF解析器核心源码详解PDF解析器是RAGFlow最复杂的解析器,包含OCR识别、布局分析、表格识别等多个核心模块。2.1 导入和全局变量详解(行17-53)importasyncio# 异步IO支持,并发处理多页importlogging# 日志记录,调试和监控importmath# 数学计算,坐标变换importos# 环境变量和路径操作importrandom# 随机数生成,可能用于采样importre# 正则表达式,文本清洗importsys# 系统操作,模块管理importthreading# 多线程支持,并发控制fromcollectionsimportCounter,defaultdict# 计数和分组工具fromcopyimportdeepcopy# 深拷贝,避免修改原始数据fromioimportBytesIO# 字节流处理,内存操作fromtimeitimportdefault_timerastimer# 性能计时,耗时分析/
RAGFlow源码解析-4、文档处理(deepdoc)(第二周)
一、文档解析器工厂架构详解1.1 deepdoc/parser/init.py解析器工厂完整解析代码完整解析(40行)# Licensed under the Apache License, Version 2.0 (the "License");# you may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.from.docx_parserimportRAGFlowDocxParserasDocxParser# Word文档解析器# 【设计】别名简化:RAGFlowDocxParser → DocxParser# 【职责】解析.docx文件,提取结构化文本和表格from.excel_parserimportRAGFlowExcelParserasExcelParser# Excel表格解析器# 【设计】别名简化:RAGFlowExcelParser → ExcelParser# 【职责】解析.xlsx文件,识别表格结构和数据from.html_parserimportRAGFlowHtmlParserasHtmlParser# HTML网页解析器# 【职责】解析HTML网页,提取文本和超链接from.json_parserimportRAGFlowJsonParserasJsonParser# JSON数据解析器# 【职责】解析JSON数据,提取结构化信息from.markdown_parserimportMarkdownElementExtractor# Markdown元素提取器# 【职责】提取Markdown标题、列表、代码块等元素from.markdown_parserimportRAGFlowMarkdownParserasMarkdownParser# Markdown文档解析器# 【职责】完整解析Markdown文档from.pdf_parserimportPlainParser# PDF纯文本解析器# 【职责】仅提取PDF文本,不OCR,速度快(适合纯文本PDF)from.pdf_parserimportRAGFlowPdfParserasPdfParser# PDF深度解析器# 【职责】OCR+布局分析+表格识别(适合复杂PDF,准确率高)from.ppt_parserimportRAGFlowPptParserasPptParser# PPT演示文稿解析器# 【职责】解析PPT,提取幻灯片文本和图片from.txt_parserimportRAGFlowTxtParserasTxtParser# 纯文本解析器# 【职责】解析.txt文件,最简单的解析器__all__=[# 模块导出控制,对外暴露的解析器"PdfParser",# PDF深度解析器(最复杂)"PlainParser",# PDF纯文本解析器(最简单)"DocxParser",# Word文档解析器"ExcelParser",# Excel表格解析器"PptParser",# PPT演示文稿解析器"HtmlParser",# HTML网页解析器"JsonParser",# JSON数据解析器"MarkdownParser",# Markdown文档解析器"TxtParser",# 纯文本解析器"MarkdownElementExtractor",# Markdown元素提取器(辅助工具)]# 【设计】导出顺序:按复杂度排序,PdfParser最复杂排第一# 【用途】外部模块通过 `from deepdoc.parser import PdfParser` 导入【设计模式分析】:工厂模式:__init__.py作为解析器工厂,统一管理所有解析器类别名模式:as DocxParser简化类名,便于使用(减少RAGFlow前缀)模块导出控制:__all__明确导出内容,避免私有解析器被误用职责分离:每个解析器专注单一文档格式,符合单一职责原则【技术决策】:为什么分开PlainParser和PdfParser?纯文本PDF用PlainParser速度快(直接提取文本)图片/扫描PDF用PdfParser准确率高(OCR识别)用户可根据文档类型选择合适解析器为什么用别名?原始类名RAGFlowPdfParser太长(15字符)别名PdfParser简洁(9字符)便于代码编写和阅读为什么导出MarkdownElementExtractor?提取Markdown元素是独立功能不依赖完整解析器用户可单独调用提取标题、列表等为什么支持9种格式?实际业务文档类型多样多格式支持提升适用性覆盖常见文档类型1.2 解析器工厂架构图.pdf.pdf纯文本.docx.xlsx.pptx.html.json.md.txt文档输入各种格式文件格式判断文件扩展名PdfParserOCR+布局+表格PlainParser文本提取DocxParser结构化提取ExcelParser表格识别PptParser幻灯片提取HtmlParser网页解析JsonParser数据解析MarkdownParser格式解析TxtParser纯文本OCR引擎文本识别布局识别器标题/段落/表格表格识别器结构识别文本块列表统一输出格式文本+位置+结构传递给RAG Pipeline分块和向量化1.3 解析器输出格式详解所有解析器统一输出格式(标准化处理):# 解析器输出格式示例(JSON结构){"document_id":"doc_123abc",# 文档唯一ID"pages":[# 页面列表(PDF多页,其他单页){"page_num":1,# 页码(从1开始)"blocks":[# 文本块列表{"type":"text",# 块类型:text/title/table/figure"text":"这是标题文本",# 文本内容"bbox":[100,200,500,250],# 坐标:[x0,y0,x1,y1]"page":1,# 所在页码"confidence":0.95,# OCR置信度(0-1)"layout_type":"Title",# 布局类型:Title/Text/Table等"font_size":18,# 字体大小(推断)"is_bold":True,# 是否粗体(推断)},{"type":"table",# 表格块"text":"表头1 | 表头2 | 表头3\n数据1 | 数据2 | 数据3","bbox":[100,300,600,500],"page":1,"html":"tabletrth表头1/th.../table",# 表格HTML"rows":5,# 行数"cols":3,# 列数},{"type":"text","text":"这是段落文本...","bbox":[100,520,600,700],"page":1,"layout_type":"Text",},],},{"page_num":2,# 第二页"blocks":[...],},],"total_pages":10,# 总页数"parse_time":12.5,# 解析耗时(秒)"parser_type":"PdfParser",# 使用的解析器类型}【输出格式设计】:统一结构:所有解析器输出相同格式,便于后续处理位置信息:bbox坐标支持文本定位和引用标注类型分类:type和layout_type区分标题、段落、表格等置信度:OCR置信度帮助判断识别准确性表格HTML:表格输出HTML格式,便于展示和引用二、PDF解析器核心源码详解PDF解析器是RAGFlow最复杂的解析器,包含OCR识别、布局分析、表格识别等多个核心模块。2.1 导入和全局变量详解(行17-53)importasyncio# 异步IO支持,并发处理多页importlogging# 日志记录,调试和监控importmath# 数学计算,坐标变换importos# 环境变量和路径操作importrandom# 随机数生成,可能用于采样importre# 正则表达式,文本清洗importsys# 系统操作,模块管理importthreading# 多线程支持,并发控制fromcollectionsimportCounter,defaultdict# 计数和分组工具fromcopyimportdeepcopy# 深拷贝,避免修改原始数据fromioimportBytesIO# 字节流处理,内存操作fromtimeitimportdefault_timerastimer# 性能计时,耗时分析/