Google Cloud Document AI OCR词语与Token数量不一致的处理方法咨询
问题:Document AI OCR中如何让词语数量与Token数量保持一致?
我按照Google Cloud Document AI官方指南使用OCR提取图像文本,测试图像内容为包含"Hello World. Using Tesseract's OCR. From srcmake."的图片。实现代码如下:
from google.cloud import documentai_v1 as documentai from google.api_core.client_options import ClientOptions from typing import Optional, Sequence def process_document(project_id: str, location: str, processor_id: str, file_path: str, mime_type: str) -> documentai.Document: documentai_client = documentai.DocumentProcessorServiceClient( client_options=ClientOptions( api_endpoint=f"{location}-documentai.googleapis.com" ) ) resource_name = documentai_client.processor_path( project_id, location, processor_id) with open(file_path, "rb") as image: image_content = image.read() raw_document = documentai.RawDocument( content=image_content, mime_type=mime_type) request = documentai.ProcessRequest( name=resource_name, raw_document=raw_document) result = documentai_client.process_document(request=request) return result.document def main(): project_id = 'abc' location = 'eu' processor_id = 'abc' file_path = 'orig.png' mime_type = 'image/png' document = process_document(project_id=project_id, location=location, processor_id=processor_id, file_path=file_path, mime_type=mime_type) print("Tokens:", len(document.pages[0].tokens)) print("Words:", len(document.text.split())) print("Words:", document.text.split())
运行结果如下:
Tokens: 10 Words: 7 Words: ['Hello', 'World.', 'Using', "Tesseract's", 'OCR.', 'From', 'srcmake.']
可以看到Token数量多于词语数量,原因是Document AI会将标点符号视为独立Token,而直接按空格分割文本得到的是附带标点的词语。
解决方案
方法1:直接使用Document AI返回的Token数据(推荐)
最可靠的方式是直接遍历官方返回的Token对象提取文本,这样得到的列表长度会和Token数量完全一致,且拆分逻辑和OCR引擎保持统一:
修改main函数中的输出部分:
def main(): # ... 原有代码不变 ... document = process_document(...) # 提取所有Token的文本 token_texts = [token.text for token in document.pages[0].tokens] print("Token文本列表:", token_texts) print("Token数量:", len(token_texts))
运行后会得到和Token数量匹配的文本列表,例如:
Token文本列表: ['Hello', 'World', '.', 'Using', "Tesseract's", 'OCR', '.', 'From', 'srcmake', '.'] Token数量: 10
方法2:正则表达式分割文本(模拟Token逻辑)
如果一定要通过处理document.text来实现,可使用正则表达式模拟Document AI的Token拆分规则,将附着在词语上的标点分离出来:
import re def split_text_like_tokens(text: str) -> list[str]: # 匹配词语、单独的撇号、以及其他标点符号 pattern = r"(\b\w+\b|['’]|[^\w\s])" tokens = re.findall(pattern, text) # 过滤空字符串并去除多余空格 return [token.strip() for token in tokens if token.strip()] # 在main函数中使用 document = process_document(...) split_tokens = split_text_like_tokens(document.text) print("处理后的拆分结果:", split_tokens) print("数量:", len(split_tokens))
不过这种方法存在局限性:不同语言、特殊字符场景下,正则表达式可能需要调整,无法完全匹配官方OCR的Token拆分逻辑,因此优先推荐方法1。
内容的提问来源于stack exchange,提问作者galex
相关产品推荐
相关产品推荐

