当前位置: 首页 > backend >正文

理解 Token 索引 vs 字符位置

以下是对“理解 Token 索引与字符位置的区别”的内容整理,条理清晰,结构完整,保持技术细节,方便阅读,无多余解释:


🔍 理解 Token 索引 vs 字符位置

文本分块方法中返回的索引是 token 索引,而不是原始文本中的字符位置。理解这一点对正确使用和调试文本处理流程至关重要。


📄 原始文本与 Tokenization 的区别

示例文本

"人工智能正在改变世界。"

字符位置(原始文本)

字符
位置012345678910

Token 位置(tokenizer 处理后)

Tokens = ["人", "工", "智", "能", "正", "在", "改", "变", "世", "界", "。"]
索引 =   [0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10]

🔢 各分块方法的返回值示例


1️⃣ 语义分块(chunk_semantically)

text = "人工智能正在改变世界。它使得许多任务自动化。"

Tokenizer 分词结果:

Tokens = ["人", "工", "智", "能", "正", "在", "改", "变", "世", "界", "。","它", "使", "得", "许", "多", "任", "务", "自", "动", "化", "。"]
索引 =    [0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21]

假设返回值为:

[(0, 11), (11, 22)]

表示:

  • 第1块:token索引 0-10,“人工智能正在改变世界。”
  • 第2块:token索引 11-21,“它使得许多任务自动化。”

2️⃣ 固定大小分块(chunk_by_tokens)

text = "人工智能正在改变世界。它使得许多任务自动化。"
chunk_size = 5

返回值示例:

[(0, 5), (5, 10), (10, 15), (15, 20), (20, 22)]

表示:

  • 第1块:token索引 0-4,“人工智能正在”
  • 第2块:token索引 5-9,“改变世界。”
  • 第3块:token索引 10-14,“它使得许多”
  • 第4块:token索引 15-19,“任务自动化”
  • 第5块:token索引 20-21,“。”

3️⃣ 按句子分块(chunk_by_sentences)

text = "人工智能正在改变世界。它使得许多任务自动化。我们需要适应这些变化。"

Tokenizer 分词结果假设为:

句子1"人工智能正在改变世界。" → token索引 0~10  
句子2"它使得许多任务自动化。" → token索引 11~21  
句子3"我们需要适应这些变化。" → token索引 22~33

设置每个块 1 个句子,返回值:

[(0, 11), (11, 22), (22, 34)]

❓ 为什么返回 token 索引?

原因说明
✅ NLP 模型处理的是 token模型输入必须是 token 序列,不能直接处理原始字符
✅ 精确控制长度Token 数量直接决定能否通过模型输入限制(如 BERT 的 512 token)
✅ 对齐后续处理流程向量化、分块拼接、交叉注意力等操作都基于 token 索引进行

🔁 实际代码中的字符位置 → Token 索引映射

部分关键转换流程如下:

# 从 splitter 获取字符级位置
nodes = [(node.start_char_idx, node.end_char_idx)for node in self.splitter.get_nodes_from_documents(...)
]# token_offsets 是 tokenizer 返回的每个 token 的字符起止位置
start_chunk_index = bisect.bisect_left([offset[0] for offset in token_offsets], char_start
)
end_chunk_index = bisect.bisect_right([offset[1] for offset in token_offsets], char_end
)

最终输出的 (start_chunk_index, end_chunk_index) 就是基于 tokenizer 的 token 索引范围

http://www.xdnf.cn/news/5381.html

相关文章:

  • C++23 新特性:深入解析 std::views::join_with(P2441R2)
  • 深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用
  • 效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验
  • NHANES稀有指标推荐:MedHi
  • M. Moving Both Hands(反向图+Dijkstra)
  • 视频编解码学习10之成像技术原理
  • 华为配置篇-RSTP/MSTP实验
  • 股指期货的保证金交易和资金门槛是多少?
  • 《Go小技巧易错点100例》第三十三篇
  • Redis--常见数据类型List列表
  • 思维链框架:LLMChain,OpenAI,PromptTemplate
  • 游戏引擎学习第274天:基于弹簧的动态动画
  • 【MySQL】表空间结构 - 从何为表空间到段页详解
  • 【质量管理】什么是过程?
  • Qt 窗口部件(2)输入部件详解
  • 深入解析STM32中断机制:从原理到外部中断实战
  • 力扣70题解
  • 二叉搜索树讲解
  • [思维模式-25]:《本质思考力》-6- 马克思主义哲学的五对基本哲学范畴,以及在计算机领域的体现
  • 用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能
  • 理性地倾听与表达:检索算法的语言学改进
  • 《P1226 【模板】快速幂》
  • 开疆智能Profinet转canopen网关连接易福门(IFM)传感器配置案例
  • QB/T 1649-2024 聚苯乙烯泡沫塑料包装材料检测
  • 大模型MCP更高效的通信:StreamableHTTP协议
  • 欧拉计划 Project Euler 69(欧拉总计函数与最大值)题解
  • 炫酷粒子系统动画实战:Matplotlib实现银河漩涡效果
  • SierraNet M1288网络损伤功能显著助力GPU互联网络的测试验证,包含包喷洒,LLR等复杂特性的验证测试
  • GMS 与非 GMS:有何区别?
  • Java基础:代理