前面讲解了深度拆解RAGFlow分片引擎之切片实现 并没有深入的介绍deepdoc,我们今天来看下deepdoc。
综述

在deepdoc中主要有两个目录parser和vision。
parser是解析器,解析器是各种文档的解析实现,最复杂就是pdf的解析vision是视觉处理,主要包括OCR、布局识别、表结构识别
解析器在实现的过程中依赖视觉处理
pdf 文档解析器
在之前的切盼方法详解中。我们知道每个切片,只要涉及到pdf处理的,都有一段类似的代码
class Pdf(PdfParser):
def __init__(self):
def __call__(self, filename, binary=None, from_page=0,
to_page=100000, zoomin=3, callback=None, separate_tables_figures=False):
start = timer()
first_start = start
callback(msg="OCR started")
# ocr识别
self.__images__(
filename if not binary else binary,
zoomin,
from_page,
to_page,
callback
)
callback(msg="OCR finished ({:.2f}s)".format(timer() - start))
start = timer()
# 布局分析 识别标题/段落等层级
self._layouts_rec(zoomin)
callback(0.63, "Layout analysis ({:.2f}s)".format(timer() - start))
start = timer()
# 使用 transformer 进行表格检测与识别
self._table_transformer_job(zoomin)
callback(0.65, "Table analysis ({:.2f}s)".format(timer() - start))
start = timer()
self._text_merge()
callback(0.67, "Text merged ({:.2f}s)".format(timer() - start))
# 是否分离表格和图形
if separate_tables_figures:
tbls, figures = self._extract_table_figure(True, zoomin, True, True, True)
self._concat_downward()
logging.info("layouts cost: {}s".format(timer() - first_start))
# 返回文本块+表格+图形
return [(b["text"], self._line_tag(b, zoomin)) for b in self.boxes], tbls, figures
else:
tbls = self._extract_table_figure(True, zoomin, True, True)
# self._naive_vertical_merge()
self._concat_downward()
# self._filter_forpages()
logging.info("layouts cost: {}s".format(timer() - first_start))
return [(b["text"], self._line_tag(b, zoomin)) for b in self.boxes], tbls
PdfParser指向的就是pdf解析器。

在pdf_parser.py文件中,总共有1000多行代码,有3个类。
PlainParser是轻量级工具类,仅提供最基础的文本提取RAGFlowPdfParser是核心处理器,包含完整的文档理解流水线VisionParser是功能扩展,在核心功能上增加视觉模型能力
虽然三个类的实现不同,但通过统一的
__call__方法返回相同格式:
初始化方法__init__
在这里把所有的资源进行了初始化。
def __init__(self, **kwargs):
"""
If you have trouble downloading HuggingFace models, -_^ this might help!!
For Linux: export HF_ENDPOINT=https://hf-mirror.com
For Windows: Good luck ^_-
"""
# OCR引擎
self.ocr = OCR()
self.parallel_limiter = None
# 计算gpu的数量,来推测并行数量
if PARALLEL_DEVICES is not None and PARALLEL_DEVICES > 1:
# 每个GPU独占1个工作槽位
self.parallel_limiter = [trio.CapacityLimiter(1) for _ in range(PARALLEL_DEVICES)]
# 动态模型选择
if hasattr(self, "model_speciess"):
self.layouter = LayoutRecognizer("layout." + self.model_speciess)
else:
self.layouter = LayoutRecognizer("layout")
# 表格结构识别器
self.tbl_det = TableStructureRecognizer()
self.updown_cnt_mdl = xgb.Booster()
# GPU加速优化
if not settings.LIGHTEN:
try:
import torch.cuda
if torch.cuda.is_available():
self.updown_cnt_mdl.set_param({
"device": "cuda"})
except Exception:
logging.exception("RAGFlowPdfParser __init__")
# 双路径加载设计
try:
# 优先从本地加载
model_dir = os.path.join(
get_project_base_directory()
844




被折叠的 条评论
为什么被折叠?



