首页/新闻资讯/正文详情

PaddleNLP LayoutXLMTokenizer 深度解析:基于 SentencePiece 的多模态文档理解分词器

发布时间:2026/9/24 14:21:36 来源:云帆数科 栏目:资讯中心
PaddleNLP LayoutXLMTokenizer 深度解析:基于 SentencePiece 的多模态文档理解分词器
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文以 PaddleNLP 仓库中paddlenlp.transformers.layoutxlm.tokenizer模块为核心系统讲解 LayoutXLM 模型面向多语言文档视觉理解任务的 Transformer 模型所使用的分词器设计与实现。通过本文你将掌握LayoutXLMTokenizer的 SentencePiece 子词切分机制、特殊 token 管理、id 与 token 双向转换、文本还原等核心能力并理解它如何与LayoutXLMModel的 bbox 空间位置嵌入协同工作从而具备在实际文档信息抽取任务中正确使用与二次开发该分词器的能力。一、文档定位从 API 文档到源码实现本仓库的docs/zh/source/paddlenlp.transformers.layoutxlm.tokenizer.rst采用 Sphinxautomodule指令自动生成 API 文档其完整内容为tokenizer .. automodule:: paddlenlp.transformers.layoutxlm.tokenizer :members: :no-undoc-members: :show-inheritance:该 RST 文件是 LayoutXLM 模块文档树的三个子页之一其余为 modeling 与 visual_backbone总览见 paddlenlp.transformers.layoutxlm.rst。它本身不包含直接文字说明而是声明从paddlenlp.transformers.layoutxlm.tokenizer模块自动提取所有公开成员含继承关系生成 API 文档。因此文档的实际技术主体完全由模块源码决定——即 tokenizer.py 中的LayoutXLMTokenizer类。下面的讲解将以该源码为骨架逐层展开其设计细节。二、LayoutXLMTokenizer 的总体设计与继承关系LayoutXLMTokenizer定义在 paddlenlp/transformers/layoutxlm/tokenizer.py 第 45 行继承自paddlenlp.transformers.PretrainedTokenizer即 PaddleNLP 统一的预训练分词器基类位于 paddlenlp/transformers/tokenizer_utils.py因此天然获得from_pretrained、save_pretrained、__call__、encode、decode、batch_encode等通用能力同时按自身需求覆写了分词相关的核心方法。从类属性可以看出它的几个关键配置类属性值含义resource_files_names{vocab_file: sentencepiece.bpe.model}预训练资源中词表文件名pretrained_resource_files_maplayoutxlm-base-uncased→ 远程sentencepiece.bpe.model各预训练权重对应的词表下载地址pretrained_init_configuration{layoutxlm-base-uncased: {do_lower_case: False}}预训练模型的初始化参数max_model_input_sizes{layoutxlm-base-uncased: 514}模型最大输入长度514 512 2 个特殊 tokenmodel_input_names[input_ids, attention_mask]模型标准输入名值得注意pretrained_init_configuration中do_lower_caseFalse表明该分词器默认不做大小写归一化与 BERT 的 uncased 处理不同这有利于保留文档 OCR 文本中的原始字符信息。三、基于 SentencePiece 的子词切分实现3.1 底层引擎与词表加载LayoutXLM 与 XLNet 一脉相承采用SentencePieceUnigram/BPE 子词模型作为底层切分引擎。构造函数中完成词表加载self.sp_model spm.SentencePieceProcessor() self.sp_model.Load(vocab_file)其中vocab_file即预训练发布的sentencepiece.bpe.model。切分入口_tokenize直接委托给 SentencePiecedef _tokenize(self, text): return self.sp_model.EncodeAsPieces(text)EncodeAsPieces返回的是子词piece列表例如对 unwanted 可能切分为[▁un, want, ed]这类以▁SPIECE_UNDERLINE标记词首的子词序列。3.2 特殊 token 与词汇表偏移offset机制构造函数的默认特殊 token 与 XLNet 保持一致参数默认值语义bos_tokens序列起始eos_token/sep_token/s序列结束 / 句子分隔cls_tokens分类起始unk_tokenunk未知词pad_tokenpad填充mask_tokenmask掩码源码中维护了一个显式的tokens_to_ids映射self.tokens_to_ids {s: 0, pad: 1, /s: 2, unk: 3} # The first real token , has position 4 in the original fairseq vocab and position 3 in the spm vocab self.offset 1 self.tokens_to_ids[mask] len(self.sp_model) self.offset这段代码揭示了 LayoutXLM 词表的特殊布局SentencePiece 词表自身把s、pad、/s、unk排在 id 03但布局 XLM 沿用了 fairseq 的词表排列习惯将,映射到 id 4即 spm 中的 id 3因此引入offset 1所有 SentencePiece 子词的真实 id 需要加上这个偏移mask被追加在词表末尾id 为len(self.sp_model) 1。相应地vocab_size的定义为property def vocab_size(self): return len(self.sp_model) self.offset 1 # Add the mask token即SentencePiece 词表大小 1offset 1mask token。3.3 token ↔ id 双向转换_convert_token_to_id与_convert_id_to_token实现双向映射均需要考虑 offsetdef _convert_token_to_id(self, token): if token in self.tokens_to_ids: return self.tokens_to_ids[token] spm_id self.sp_model.PieceToId(token) # Need to return unknown token if the SP model returned 0 return spm_id self.offset if spm_id else self.unk_token_id def _convert_id_to_token(self, index): if index in self.ids_to_tokens: return self.ids_to_tokens[index] return self.sp_model.IdToPiece(index - self.offset)其中有一个容易忽略的细节如果PieceToId返回 0SentencePiece 中 id 0 是unk占位则映射为self.unk_token_id即 3而不是直接使用0 offset从而保证未知子词正确落到unk。3.4 子词序列还原为字符串convert_tokens_to_string把子词列表拼接回可读文本核心是把 SentencePiece 的词首标记▁还原为空格def convert_tokens_to_string(self, tokens): out_string .join(tokens).replace(SPIECE_UNDERLINE, ).strip() return out_string例如子词序列[▁a, ▁weirdly, ▁test]会被还原为a weirdly test该行为由测试用例 test_tokenizer.py 中的test_internal_consistency显式断言。四、序列组装与特殊 token 处理4.1 单句与双句拼接规则build_inputs_with_special_tokens定义了 LayoutXLM 的序列格式单序列[CLS] tokens [SEP]即[cls_token_id] token_ids_0 [sep_token_id]双序列[CLS] tokens_0 [SEP] [SEP] tokens_1 [SEP]即cls token_ids_0 sep sep token_ids_1 sep。双序列场景下连续出现两个/s这与 XLNet 风格一致适合问题 文档或实体对这类文档关系抽取的输入组织方式。4.2 token type ids 与特殊 token 掩码create_token_type_ids_from_sequences对任意拼接结果统一返回全 0 的 token type idsLayoutXLM 不使用分段 id 区分句子而是通过 bbox 空间位置信息区分文本区域。get_special_tokens_mask支持两种模式输入already_has_special_tokensTrue时直接从现有 id 序列中标记sep_token_id/cls_token_id位置为 1否则按拼接规则生成掩码例如单序列为[1] [0]*len(tokens) [1]双序列为[1] [0]*n0 [1, 1] [0]*n1 [1]。4.3 需要添加的特殊 token 数量num_special_tokens_to_add(pairFalse)通过构造空序列调用build_inputs_with_special_tokens计算需要添加的特殊 token 数单序列为 2CLS SEP双序列为 5CLS 2×SEP SEP供下游训练逻辑在计算长度或 padding 时参考。五、与 LayoutXLMModel 的协作分词结果如何进入多模态模型LayoutXLMTokenizer负责产出input_ids而模型 LayoutXLMModel第 598 行起还额外接收bbox检测框坐标输入。文本侧嵌入由_calc_text_embeddings完成words_embeddings self.embeddings.word_embeddings(input_ids) position_embeddings self.embeddings.position_embeddings(position_ids) spatial_position_embeddings self.embeddings._cal_spatial_position_embeddings(bbox) token_type_embeddings self.embeddings.token_type_embeddings(token_type_ids) embeddings words_embeddings position_embeddings spatial_position_embeddings token_type_embeddings可见模型语义由词嵌入 位置嵌入 空间位置嵌入bbox 分段嵌入四部分叠加而成。因此实际使用中用户需要把 OCR 得到的每个 token 的边界框形如[x0, y0, x1, y1]的四元组列表与分词结果按 token 一一对齐后一起喂给模型——这正是测试用例 test_tokenizer.py 中get_words_and_boxes所构造的数据形态。此外当启用use_visual_backbone时模型还会融合VisualBackbone提取的图像特征_calc_img_embeddings形成文本 空间 视觉三模态表示。六、实践指南加载、调用与验证6.1 从预训练模型加载layoutxlm-base-uncased是仓库中唯一登记了词表资源的预训练模型加载方式与 PaddleNLP 其他预训练模型一致from paddlenlp.transformers import LayoutXLMTokenizer tokenizer LayoutXLMTokenizer.from_pretrained(layoutxlm-base-uncased)加载时会自动下载sentencepiece.bpe.model词表并应用max_model_input_sizes 514的长度限制输入 token 数建议不超过 512加上 CLS/SEP 后正好 514。6.2 保存与重新加载LayoutXLMTokenizer通过基类的save_pretrained将sentencepiece.bpe.model与 tokenizer 配置写入本地目录之后可用from_pretrained重新加载。测试用例test_save_sentencepiece_tokenizer见 test_tokenizer.py验证了原始词表文件被删除后仍可仅凭保存目录恢复并得到完全一致的编码结果这得益于save_pretrained会在保存时序列化底层 SentencePiece 模型。6.3 分词基本操作示例# 子词切分 pieces tokenizer.tokenize(a weirdly test) # 子词 - id ids tokenizer.convert_tokens_to_ids(pieces) # id - 子词 tokens tokenizer.convert_ids_to_tokens(ids) # 还原为字符串 text tokenizer.decode(ids) # 期望得到 a weirdly test对应的行为约束可见于 test_tokenizer.py 的test_internal_consistency分词→转 id→转 token→decode 的完整回路必须得到可读字符串。6.4 与模型串联的完整流程一个典型的文档理解推理流程为使用 OCR 工具抽取文档中的单词words与对应边界框boxes四元组坐标对每个 word 调用tokenizer.tokenize(word)获取子词并据此将 bbox 展开对齐到每个子词调用tokenizer(words, boxesboxes, ...)或自行构造input_ids、attention_mask、bbox得到模型输入将输入送入LayoutXLMForTokenClassification/LayoutXLMForRelationExtraction等下游头完成实体识别或关系抽取相关模型类见 modeling.py 第 839 行与第 1265 行。七、源码研读路线图如果你想进一步研究推荐按以下路径阅读仓库源码分词器实现paddlenlp/transformers/layoutxlm/tokenizer.py本文主体模型主体paddlenlp/transformers/layoutxlm/modeling.pyLayoutXLMModel、LayoutXLMForTokenClassification、LayoutXLMForRelationExtraction视觉骨干paddlenlp/transformers/layoutxlm/visual_backbone.py 及其配置 visual_backbone.yaml单元测试tests/transformers/layoutxml/test_tokenizer.py分词器行为契约与 tests/fixtures/test_sentencepiece.model测试用 SentencePiece 词表。八、总结LayoutXLMTokenizer是 LayoutXLM 多模态文档理解模型链路上的文本入口它以 SentencePiece 为切分引擎通过offset偏移机制兼容 fairseq 词表布局用▁标记还原文本并提供了与 XLNet 风格一致的序列组装规则。理解它的设计是正确使用bbox对齐、完成 OCR 文本到模型输入转换的前提也是深入 LayoutXLM 系列模型文本嵌入、空间位置嵌入、视觉嵌入三者融合的起点。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP UnifiedTransformerTokenizer 源码级解析基于 SentencePiece 的对话式分词器PaddleNLP UnifiedTransformerTokenizer 源码级解析基于 SentencePiece 的对话式分词器 本文围绕 Paddle人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP T5Tokenizer 深度解析基于 SentencePiece 的 T5 分词器架构、参数与实战用法PaddleNLP T5Tokenizer 深度解析基于 SentencePiece 的 T5 分词器架构、参数与实战用法 T5Text to Text T人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP FNetTokenizer 解析基于 SentencePiece 的 FNet 分词器完整使用指南PaddleNLP FNetTokenizer 解析基于 SentencePiece 的 FNet 分词器完整使用指南 导读 FNet 是 Google 提出人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇Protocol Buffers Objective-CiOS/macOS原生开发效率提升指南下一篇VeryNginx性能监控终极指南使用Prometheus和Grafana的可视化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

GitHub Actions CI/CD 速查手册:Workflow 语法、事件触发与自动化实战(Reference 项目指南)
GitHub Actions CI/CD 速查手册:Workflow 语法、事件触发与自动化实战(Reference 项目指南)

GitHub Actions CI/CD 速查手册:Workflow 语法、事件触发与自动化实战(Reference 项目指南) 【免费下载链接】reference ⭕ Share quick reference cheat sheet for developers. 项目地址: https://gitcode.com/gh_mirrors/re/reference … · 2026/9/24 14:21:36

PyOD 实战入门:kNN 异常检测、模型组合与自适应阈值化的完整示例指南
PyOD 实战入门:kNN 异常检测、模型组合与自适应阈值化的完整示例指南

PyOD 实战入门:kNN 异常检测、模型组合与自适应阈值化的完整示例指南 【免费下载链接】pyod A Python library for anomaly detection across tabular, time series, graph, text, image, and audio data. 60 detectors, benchmark-backed ADEngine orchestration, … · 2026/9/24 14:21:17

PaddleHub 预训练模型仓库全景指南:基于 PaddlePaddle 的五大类 376 个模型模块解析
PaddleHub 预训练模型仓库全景指南:基于 PaddlePaddle 的五大类 376 个模型模块解析

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 Padd… · 2026/9/24 14:21:11

会员运营系统怎么选?2026年5大维度评估标准
会员运营系统怎么选?2026年5大维度评估标准

很多品牌上会员运营系统,都是先被销售"种草",再被一堆功能列表绕晕。真正靠谱的选法,不是比谁功能多,而是先立一套评估标准,再拿产品去对。这篇给你5个可以直接抄的评估维度,每个维度说清"看… · 2026/9/24 14:46:14

全GaN 12kW AIDC电源方案:三电平架构与磁集成设计实战
全GaN 12kW AIDC电源方案:三电平架构与磁集成设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:46:14

在 RedwoodJS 博客中实现分页:从 GraphQL SDL、Prisma 解析器到翻页组件完整实战
在 RedwoodJS 博客中实现分页:从 GraphQL SDL、Prisma 解析器到翻页组件完整实战

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 本篇技术指南以 RedwoodJS 官方教程(Tutorial)的博客项目为背景,完整演示如何为博客… · 2026/9/24 14:46:14

Apache Pulsar 集群管理实战:使用 pulsar-admin、REST API 与 Java Admin API 管理 Clusters
Apache Pulsar 集群管理实战:使用 pulsar-admin、REST API 与 Java Admin API 管理 Clusters

消息队列后端流处理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar 点击查看 免费下载 本篇技术指南以 Apache Pulsar 官方文档 admin-api-clusters.md 为核心骨架&… · 2026/9/24 14:46:14

飞蛋H743飞控从零配置全攻略:固件烧写、传感器校准与避坑指南
飞蛋H743飞控从零配置全攻略:固件烧写、传感器校准与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:46:14

ParlAI BlenderBot 3x 对话数据集数据卡深度解读:从有机交互采集到可训练语料的完整技术图谱
ParlAI BlenderBot 3x 对话数据集数据卡深度解读:从有机交互采集到可训练语料的完整技术图谱

ParlAI BlenderBot 3x 对话数据集数据卡深度解读:从有机交互采集到可训练语料的完整技术图谱 【免费下载链接】ParlAI A framework for training and evaluating AI models on a variety of openly available dialogue datasets. 项目地址: https://gitcode.com/g… · 2026/9/24 14:46:08

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码