使用Document AI逐行提取文本遇阻,求有效解决方案
问题整理
我需要从医疗报告类文档中逐行提取完整文本(而非拆分的词汇或表格),尝试三种方法均遇到问题:
- 直接使用Document AI:服务将整行文本拆分为单个词汇,以
\n分割,示例输出:Eritrocitos\n5,33 \n4,50 a 5,50 \nHemoglobina\n17,2 g \n13
- 基于多边形(
lines对象)提取(Ruby实现):返回空内容,且访问page对象时触发UTF-8编码错误:#<ArgumentError: invalid byte sequence in UTF-8> rescued during inspection
执行代码:page.lines.first.layout.text_anchor.content - 考虑训练自定义模型,但不确定是否有必要
补充:Python版本官方代码调整后,Paragraph和Line仍仅返回单个词汇(如Ferritina\n、379,1 ng/mL\n),GCP平台测试也显示Document AI仅识别单独词汇而非整行。
解决方案
1. 选择适配的Document AI处理器
优先使用Form Parser处理器(针对结构化表单/报告),而非通用OCR处理器:
- Form Parser会自动识别键值对和视觉行结构,更适配医疗报告的排版逻辑;
- 如果是扫描生成的PDF,关闭原生PDF解析(设置
enable_native_pdf_parsing: false),强制OCR按视觉布局识别行。
2. 后处理拼接整行文本
Document AI返回的Line对象包含该行的所有Word,需手动拼接(部分SDK不会自动合并):
Python示例
from google.cloud import documentai_v1 as documentai def get_full_lines(document): full_lines = [] for page in document.pages: for line in page.lines: # 拼接该行所有词汇为完整文本 line_content = "".join([word.text for word in line.words]) full_lines.append(line_content) return full_lines
Ruby示例
先解决UTF-8编码问题,再拼接词汇:
def get_full_lines(document) full_lines = [] document.pages.each do |page| page.lines.each do |line| # 修复编码错误 line_text = line.words.map do |word| word.text.force_encoding('ASCII-8BIT').encode('UTF-8', invalid: :replace, undef: :replace) end.join full_lines << line_text end end full_lines end
3. 调整OCR识别参数
在请求Document AI时,配置page_segmentation_config强制按行划分:
# Python请求配置示例 request = documentai.ProcessRequest( name=processor_name, raw_document=raw_document, process_options=documentai.ProcessOptions( ocr_config=documentai.OcrConfig( page_segmentation_config=documentai.PageSegmentationConfig( mode=documentai.PageSegmentationConfig.Mode.FORCE_DOCUMENT_PAGE_SEGMENTATION ) ) ) )
4. 是否需要自定义模型?
如果上述方法仍无法满足需求(如报告排版极不规整),再考虑使用Custom Document Parser训练自定义模型,标注整行作为实体。但医疗报告排版通常规整,Form Parser+后处理即可解决问题。
内容的提问来源于stack exchange,提问作者novac
相关产品推荐
相关产品推荐

