大模型基础--分词和词表

举报
剑指南天 发表于 2026/04/15 22:10:57 2026/04/15
【摘要】 在模型训练或预测过程中,模型会首先对输入文本进行分词,分词集合组成词表,再为每一个分词映射对应的唯一ID。接着,这些 ID 会被输入语言模型进行训练和预测。

1.1概述

文本表示是将自然语言转化为计算机能够理解的数值形式,是绝大多数自然语言处理(NLP)任务的基础步骤。而文本表示的第一步通常是分词和词表构建。在模型训练或预测过程中,模型会首先对输入文本进行分词,分词集合组成词表,再为每一个分词映射对应的唯一ID。接着,这些 ID 会被输入语言模型进行训练和预测,如下图所示:

1.2 定义

分词(Tokenization)是将原始文本切分为若干具有独立语义的词元(token)的过程。

词表(Vocabulary)是由语料库构建出的、包含模型可识别 token 的集合。词表中每个token都分配有唯一的 ID,token 与 ID 之间具有双向的一对一映射。

OOV(Out Of Vocabulary)是指在模型使用阶段,输入文本中出现了不在预先构建词表中的词语,常见的包括网络热词、专有名词、复合词及拼写变体等

1.3 分词

按照分词粒度的大小,可分为词级(Word-Level)分词、字符级(CharacterLevel)分词和子词级(Subword‑Level)分词。

1.3.1 词级分词

在英文中,词级分词往往将空格和标点作为天然的分隔符。词级分词虽便于理解和实现,但在实际应用中容易出现 OOV(Out Of Vocabulary)问题。由于模型无法识别这些词,通常会将其统一替换为特殊标记(如 <UNK>),从而导致语义信息的丢失,影响模型的理解与预测能力。常使用NLTK分词工具。

分词结果:  ['You', 'need', 'enough', 'memory', 'to', 'hold', 'two', 'copies', 'of', 'the', 'model', 'weights', '(', 'random', 'and', 'pretrained', ')', 'which', 'may', 'not', 'be', 'possible', 'depending', 'on', 'your', 'hardware.', 'In', 'distributed', 'training', 'environments', ',', 'this', 'is', 'even', 'more', 'challenging', 'because', 'each', 'process', 'loads', 'a', 'pretrained', 'model', '.']
恢复分词前语句:  You need enough memory to hold two copies of the model weights (random and pretrained) which may not be possible depending on your hardware. In distributed training environments, this is even more challenging because each process loads a pretrained model.

词级分词是将中文文本按照完整词语进行切分的传统方法,切分结果更贴近人类阅读习惯。由于中文没有空格等天然词边界,词级分词通常依赖词典、规则或模型来识别词语边界,代表工具jieba。

jieba分词器有三种模式:精确模式(默认),全模式,搜索引擎模式。中文文本分词使用的是精确模式。

分词结果:  ['小明', '今天', '去', '郊游', ',', '明天', '去', '上班']
恢复分词前语句: 小明今天去郊游,明天去上班

jieba支持用户自定义词典,用于增强 jieba词库。可使用jieba.load_userdict(file_name)加载词典文件,也可以使用jieba.add_word(word, freq=None, tag=None)与jieba.del_word(word)动态修改词典。

自定义词典的格式为:一个词占一行,每一行分三部分:词语、词频(可省略,词频决定某个词在分词时的优先级。词频越高被优先切分出来的概率越大)、词性标签(可省略,不影响分词结果),用空格隔开,顺序不可颠倒。

将语料的所有分词结果去重后,添加预设的分词,再为每一个分词映射对应的唯一ID,就可以生成一个模型需要词表. 训练和预测的时候就可以使用分词器和词表进行下一步模型的输入.

1.3.2 字符级分词

在英文中,字符级分词是以单个字符为最小单位进行分词的方法,文本中的每一个字母、数字、标点甚至空格,都会被视作一个独立的词元。在这种分词方式下,词表仅由所有可能出现的字符组成,因此词表规模非常小,覆盖率极高,几乎不存在 OOV问题。无论输入中出现什么样的新词或拼写变体,只要字符在词表中,都能被表示出来。然而,由于单个字符本身语义信息极弱,模型必须依赖更长的上下文来推断词义和结构,这显著增加了建模难度和训练成本。此外,输入序列也会变得更长,影响模型效率。

在中文中,汉字本身通常具有独立语义,因此字符级分词在中文中具备天然的可行性。

1.3.3 子词级分词

子词级分词是一种介于词级分词与字符级分词之间的分词方法。在英文中,它将字符组成子词(subword),例如词根、前缀、后缀或常见词片段。与词级分词相比,子词分词可以显著缓解OOV问题;与字符级分词相比,它能更好地保留一定的语义结构。子词分词算法的思想也可应用于中文。它们以汉字为基本单位,通过学习语料中高频的字组合(如“自然”、“语言”、“处理”),自动构建子词词表。这种方式无需人工词典,具有较强的适应能力。常见的子词分词算法包括 BPE(Byte Pair Encoding)、WordPiece 和 Unigram Language Model。

其中,BPE是最早被广泛应用的子词分词方法。基本思想是:

在训练前期,首先将语料中的词汇拆分为单个字符的子词单元,并以此构建初始词表。然后统计语料中出现频率最高的两个相邻子词单元(pair),将其合并为新的子词单元,并加入词表。这个过程持续进行,直到词表大小达到预设上限。示例如下:

假设原始的语料的单词的统计频率:("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)

将语料中的单词按照单个字符拆分,一个字符就是一个子词,构建初始词表: ["b", "g", "h", "n", "p", "s", "u"]

原始语料库:("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5) 

统计相邻子词的频率: ("hu":15),("ug":20),("pu":17),("un":16),("bu":4),("gs":5)

"ug"的频率最高,将"ug"加入词表:["b", "g", "h", "n", "p", "s", "u","ug"]

语料库: ("h" "ug", 10), ("p" "ug", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "ug" "s", 5)

统计相邻子词的频率: ("hug":15),("pug":5),("pu":12),("un",16),("bu":4),("ugs":5)

"un"的频率最高,将"un"加入词表:["b", "g", "h", "n", "p", "s", "u","ug","un"]

语料库: ("h" "ug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("h" "ug" "s", 5)

统计相邻子词的频率: ("hug":15),("pug":5),("pun":12),("bun",4),("ugs":5)

"hug"的频率最高,将"hug"加入词表:["b", "g", "h", "n", "p", "s", "u","ug","un","hug"]

语料库: ("hug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("hug" "s", 5)

统计相邻子词的频率: ("pug":5),("pun":12),("bun",4),("hugs":5)

"pun"的频率最高,将"pun"加入词表:["b", "g", "h", "n", "p", "s", "u","ug","un","hug","pun"]

语料库: ("hug", 10), ("p" "ug", 5), ("pun", 12), ("b" "un", 4), ("hug" "s", 5)

统计相邻子词的频率: ("pug":5),("bun",4),("hugs":5)

"pug"和"hugs"的频率最高,将"pug"和"hugs"加入词表:["b", "g", "h", "n", "p", "s", "u","ug","un","hug","pun","pug","hugs"]

语料库: ("hug", 10), ("pug", 5), ("pun", 12), ("b" "un", 4), ("hugs", 5)

统计相邻子词的频率: ("bun",4)

"bun"的频率最高,将"bun"加入词表:["b", "g", "h", "n", "p", "s", "u","ug","un","hug","pun","pug","hugs","bun"]

语料库: ("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)

语料库中无相邻的子词或者达到指定的词汇数量,结束

BPE分词器会根据构建好的词表和合并规则对新输入的文本进行处理。具体做法是:将文本拆分为最小子词(字符),然后按顺序应用合并规则,逐步合并,直到无法继续。最终得到的就是由子词组成的分词结果。

待切分句子:"hug hug pug pun pun bun hugs hug bun uh"

单词统计频率:("hug", 3), ("pug", 1), ("pun", 2), ("bun", 2), ("hugs", 1),("uh",1)

句子按照单个字符拆分:"h" "u" "g" "h" "u" "g" "p" "u" "g" "p" "u" "n" "p" "u" "n" "b" "u" "n" "h" "u" "g" "s" "h" "u" "g" "b" "u" "n" "u" "h"

单词统计频率:("h" "u" "g", 3), ("p" "u" "g", 1), ("p" "u" "n", 2), ("b" "u" "n", 2), ("h" "u" "g" "s", 1) ,("u" "h",1)

统计相邻子词的频率: ("hu":4),("ug":5),("pu":3),("un":4),("bu":2),("gs":1),("uh",1)

"ug"在词表中,合并: "h" "ug" "h" "ug" "p" "ug" "p" "u" "n" "p" "u" "n" "b" "u" "n" "h" "ug" "s" "h" "ug" "b" "u" "n" "u" "h"

单词统计频率:("h" "ug", 3), ("p" "ug", 1), ("p" "u" "n", 2), ("b" "u" "n", 2), ("h" "ug" "s", 1), ("u" "h",1)

统计相邻子词的频率: ("hug":4),("pug":1),("pu":2),("un",4),("bu":2),("ugs":1),("uh",1)

"hug"和"un"在词表中,合并: "hug" "hug" "p" "ug" "p" "un" "p" "un" "b" "un" "hug" "s" "hug" "b" "un" "u" "h"

单词统计频率:("hug", 3), ("p" "ug", 1), ("p" "un", 2), ("b" "un", 2), ("hug" "s", 1),("u" "h",1)

统计相邻子词的频率: ("pug":1),("pun":2),("bun",2),("hugs":1),("uh",1)

"pun"和"bun"在语料库中,合并: "hug" "hug" "p" "ug" "pun" "pun" "bun" "hug" "s" "hug" "bun" "u" "h"

单词统计频率:("hug", 3), ("p" "ug", 1), ("pun", 2), ("bun", 2), ("hug" "s", 1),("u" "h",1)

统计相邻子词的频率: ("pug":2),("hugs":1),("uh",1)

"pug"在语料库中,合并: "hug" "hug" "pug" "pun" "pun" "bun" "hug" "s" "hug" "bun" "u" "h"

单词统计频率:("hug", 3), ("pug", 1), ("pun", 2), ("bun", 2), ("hug" "s", 1),("u" "h",1)

统计相邻子词的频率: ("hugs":1),("uh",1)

"hugs"在语料库中,合并,'uh'没有在词表中,不合并: "hug" "hug" "pug" "pun" "pun" "bun" "hugs" "hug" "bun" "u" "h"

所以句子的分词结果就是"hug" "hug" "pug" "pun" "pun" "bun" "hugs" "hug" "bun" "u" "h"

向词表中添加预设的分词,再为每一个分词映射对应的唯一ID,就可以生成一个模型需要的词表.训练和预测的时候就可以使用分词器和词表进行下一步模型的输入

上述过程只是BPE构建词表和分词的基本思想,算法是没有经过优化的.代表工具包括 Hugging Face Tokenizer、SentencePiece、tiktoken等,常用于大规模预训练语言模型中。

1.4 预训练模型中分词器

开源的预训练模型提供模型的同时也会提供分词器,这种分词器已经包含了分词和词表的功能,可以直接输出模型需要的编码后的数据。通过修改模型的名字既可以获得模型的分词器。






【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。