You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:26:01