Unigram分词算法详解:定义、原理与应用场景

作者:公子世无双2026.11.03 19:25浏览量:0

简介:Unigram分词算法是一种基于统计概率模型的子词切分方法,被广泛用于预训练语言模型的分词器构建。本文从定义出发,系统讲解该算法解决的核心问题、自顶向下的词表裁剪训练流程、基于维特比算法的解码方式,以及与BPE、WordPiece等算法的区别与联系,并梳理典型应用场景与实践注意事项,帮助读者快速建立完整而准确的认知。

一、概念定义:Unigram分词算法是什么

Unigram分词算法是一种基于统计语言模型的子词切分方法。它的核心思想是:先准备一个规模较大的候选子词集合,为其中每个子词学习一个出现概率,并假设各子词的出现相互独立,于是“一种切分方案的好坏”可以用“该方案下各子词概率的连乘积”来衡量;训练过程通过反复估计子词概率、裁剪对语料似然贡献最小的子词,最终收敛到一个规模适中、表达能力强的子词词表。

可以从三个视角来理解这个概念:

  • 技术视角:它是“一元统计模型 + 期望最大化参数估计 + 维特比动态规划解码 + 迭代词表裁剪”的组合体。所谓“一元”,即假设子词之间相互独立,整句概率等于各子词概率的乘积,这也是其名称的由来。
  • 使用视角:对开发者而言,它是一个分词器组件:输入原始文本,经过规范化与切分,输出token序列,供下游模型直接消费。
  • 价值视角:它在“词级切分”与“字符级切分”之间取得折中,既控制了序列长度,又从机制上消除了未登录词问题,同时词表大小可以精确控制。

二、背景与价值:它为什么出现,解决了什么问题

任何文本在送入模型前都要切分成最小处理单元,传统方案各有短板:

  • 词级切分:词表庞大导致embedding矩阵占用大量参数;低频词训练不充分;对形态丰富的语言(如屈折语)几乎无法穷举所有词形;更致命的是未登录词问题——推理时遇到训练集中没见过的词只能报错或丢弃。
  • 字符级切分:虽然彻底消除了未登录词,但序列长度成倍增长,计算开销大,且单个字符携带的语义太稀薄,模型需要更多层数和更多数据才能学到词义。

子词切分是业界公认的折中方案:高频词保持完整不被拆散,低频词与生僻词则被拆解为更小的、可复用的单元,任何新词最终都能回退到字符层面表示。Unigram在这一家族中的独特价值在于:

  1. 自顶向下的构建思路。与BPE、WordPiece从字符出发不断“做加法”相反,Unigram先假设一个大词表再逐步“做减法”,裁剪依据有明确的概率解释——删除某个子词后语料整体似然的下降量。
  2. 概率化带来多候选切分能力。它不仅能输出唯一的最优切分,还可以按概率采样出多种合理切分。这一性质使它天然支持子词正则化,即在训练时随机采用不同切分方式,相当于一种数据增强手段,可提升模型的鲁棒性。
  3. 词表更精炼。由于裁剪直接以似然损失为准,保留下来的子词都是“性价比”高的单元,同等词表规模下往往获得更好的压缩率。

三、核心组成:拆解算法的关键模块

一个完整的Unigram分词系统通常由以下模块构成:

  • 初始候选词表:一个远大于目标规模的候选集。常见做法是先用BPE等方法生成一个较大的中间词表,或采用“全部单字符 + 高频子串”的方式构造,作为后续裁剪的起点。
  • 子词概率表:记录每个子词的概率,初始可设为均匀分布,之后依据语料统计不断重新估计。
  • 目标函数:语料在一元模型下的对数似然。给定一种切分方案,其概率为各子词概率的连乘,工程实现中统一转为对数求和,避免数值下溢。
  • 解码器:维特比算法。在句子所有可能的切分方式中,高效地找出概率最大的那一条路径,而不是逐个枚举。
  • 裁剪策略:每一轮评估“删除某子词后语料总似然会下降多少”,按影响从小到大批量删除。
  • 特殊符号与预处理规则:包括未知词符号、词边界标记(常见做法是把空格映射为特殊元符号,使空格信息成为token的一部分)、Unicode规范化、大小写归一等规则。

四、工作原理:训练与切分如何进行

训练流程是一个“估计—裁剪”的迭代过程:

  1. 准备初始大词表,规模显著大于最终目标。
  2. E步/M步参数估计:用当前概率对语料中每条文本执行最优切分(维特比),据此统计各子词的出现情况,再重新估计每个子词的概率。
  3. 评估裁剪损失:对每个候选子词,计算将其从词表中移除后,整个语料对数似然的下降量。注意,移除一个子词后,受影响的句子会退而选择次优切分路径,因此该损失并不等于子词自身的概率贡献,需要重新解码受影响文本后计算。
  4. 排序并裁剪:按损失从小到大删除一批影响最小的子词,典型策略是每轮保留当前词表的80%左右;单字符子词通常强制保留,以保证任何文本都能被切分。
  5. 重复步骤2至4,直到词表规模达到预设目标。

推理/切分流程:对输入词构建有向无环图,节点是字符位置,边是词表中存在的子串,边的权重为对数概率,然后用维特比求最大概率路径并回溯得到子词序列;词表外的字符走未知符号兜底。

以下为解码过程的示意伪代码:

  1. # 维特比解码示意(简化伪代码,对数空间计算避免连乘下溢)
  2. def best_segmentation(word, log_prob, max_sub_len):
  3. n = len(word)
  4. best = [float("-inf")] * (n + 1)
  5. back = [None] * (n + 1)
  6. best[0] = 0.0
  7. for i in range(1, n + 1):
  8. for j in range(max(0, i - max_sub_len), i):
  9. sub = word[j:i]
  10. if sub in log_prob:
  11. score = best[j] + log_prob[sub]
  12. if score > best[i]:
  13. best[i], back[i] = score, j
  14. # 从 back 数组回溯,即得到概率最大的子词切分序列

用一个数值示例直观感受解码逻辑。假设词表中存在:p(“un”)=0.05,p(“happi”)=0.01,p(“ness”)=0.02,p(“happiness”)=0.005。切分为 [“un”,”happi”,”ness”] 的概率是 0.05×0.01×0.02=1×10⁻⁵;切分为 [“un”,”happiness”] 的概率是 0.05×0.005=2.5×10⁻⁴。后者概率更大,维特比算法会选择后者。可见Unigram的切分是全局概率最优,而非简单的贪心最长匹配。

五、与相关概念的区别与联系

Unigram常与BPE、WordPiece并列讨论,三者的异同值得厘清:

  • BPE(字节对编码):从字符级词表出发,每轮合并语料中频次最高的相邻子词对,词表“由小到大”生长;推理时按学到的合并规则逐步执行,结果是确定性的,本身没有概率含义。
  • WordPiece:构建过程与BPE类似,但合并依据从“最高频”改为“合并后对语料似然增益最大”;推理时通常采用贪心的最长前缀匹配策略。
  • Unigram:构建方向相反,是“由大到小”的裁剪过程;拥有显式的概率模型;推理时用维特比求全局最优切分,而非贪心匹配;并且天然支持输出多个切分候选。

它们的联系在于:三者同属子词切分家族,目标一致——控制词表规模、消除未登录词、平衡序列长度与语义粒度;在实践中,Unigram的训练还常借助BPE来生成初始候选词表,二者是上下游协作关系。

六、典型应用场景

  • 预训练语言模型的分词器构建:不少主流预训练模型选择基于Unigram的概率分词方案作为文本进模型前的第一道工序。
  • 神经机器翻译:子词切分最初的重要应用场景,可有效缓解低资源语言词表受限、词形变化丰富的问题。
  • 子词正则化与数据增强:利用多候选切分能力,在训练时随机采样不同切分方式,提升模型对切分差异和文本噪声的鲁棒性。
  • 无空格语言处理:中文、日文等语言没有天然词边界,需要把整句作为处理单位、配合相应预处理框架使用,Unigram的概率切分机制适配良好。
  • 通用NLP流水线预处理:文本分类、信息检索、对话系统等任务的文本规范化环节均可采用。
  • 词表规模敏感的部署场景:当embedding矩阵大小直接影响显存占用或端侧部署成本时,概率化裁剪得到的精炼词表优势明显。在实际工程中,无论是基于开源生态自行训练分词器,还是调用百度智能云等云平台提供的自然语言处理能力,理解底层分词算法的原理都有助于更合理地配置词表参数、排查切分异常。

七、使用注意事项

  • 初始词表与裁剪节奏:初始候选集过小会限制最终词表质量;裁剪过猛可能损失表达能力,过缓则训练成本高。常用的经验做法是每轮保留约80%的子词,并结合压缩率曲线判断收敛时机。
  • 语料代表性:子词概率完全由训练语料估计而来,跨领域使用时切分质量可能明显下降,重要项目应使用目标领域语料重新训练并评估。
  • 未登录字符兜底:上线前务必确认未知符号与字节级回退策略是否完备,避免线上出现报错或信息丢失。
  • 预处理一致性:Unicode规范化、大小写、空格元符号等规则必须在训练与推理两端严格一致,否则会造成隐性效果衰减,这类问题往往难以排查。
  • 特殊token管理:掩码、分类、分隔等特殊符号需要额外注册进词表,且不参与概率训练流程。
  • 选型权衡:需要概率化多候选切分或做子词正则化时,Unigram是优先选择;若追求实现简单、生态兼容稳定,BPE与WordPiece依然是稳妥方案。
  • 评估维度:不要只看词表大小,应综合考察压缩率(平均每词token数)、未知率以及下游任务的真实效果。

八、总结

回到定义本身:Unigram分词算法是一种以一元统计模型为基础、以语料对数似然为目标函数、通过“参数估计—词表裁剪”迭代自顶向下精炼词表的子词切分方法。它把“文本如何切分”从规则问题转化为概率问题,从而获得了三方面的核心价值:切分结果概率可解释、词表精炼且规模可控、天然支持多候选切分与数据增强。它的适用边界同样清晰:效果强依赖训练语料的代表性与预处理规范的一致性;当任务只需要简单稳定的确定性切分时,BPE等方案可能更省事。理解Unigram,不仅有助于正确训练与配置分词器,也为理解现代预训练模型如何“阅读”文本提供了关键视角。