每天5分钟搞懂大模型的分词器tokenizer(一):word level,char level,subword level

Token和Tokenizer

你应该知道大模型的输入输出的单位是token,不是单词,也不是字母【在中文语境,不是词,不是字】,那么,token是什么呢?

虽然我们经常直接用token,但有的文献会翻译为标记。下文中看到标记,代表token。

Token是使用Tokenizer(翻译为分词器)分词后的结果,Tokenizer是什么呢?Tokenizer是将文本分割成token的工具。

在大模型中,Tokenizer有三种常见的分词方式:word level,char level,subword level。我们会用几篇小短文来讲解这三种分词方式。同时,我会从英文(拉丁语系)和中文(汉语系)两个语言的角度来讲解。

请添加图片描述

1. word level

英文:

word level是最简单的分词方式,就是将文本按照空格或者标点分割成单词。

比如,下面的句子:

Let’s do some NLP tasks.

按照空格分词后,得到的token是:

Let’s, do, some, NLP, tasks.

按照标点分词后,得到的token是:

Let, ', s, do, some, NLP, tasks, .

中文:

在中文中,分词是一个比较复杂的问题。中文没有空格,所以分词的难度要比英文大很多。下面举个例子:

我们来做一个自然语言处理任务。

一个可能的分词结果是:

我们,来,做,一个,自然语言处理,任务。

这种分词方式的优点是简单易懂,缺点是无法处理未登录词(Out-of-Vocabulary,简称OOV)。我们熟悉的jieba分词就是基于这种分词方式的。

jieba分词基于统计和规则的方法,结合了TF-IDF算法、TextRank算法等多种技术,通过构建词图(基于前缀词典)并使用动态规划查找最大概率路径来确定分词结果。此外,对于未登录词,jieba分词使用了基于汉字成词能力的HMM(隐马尔科夫模型)和Viterbi算法来进行识别和分词.

2. Character level

英文:

Character level是将文本按照字母级别分割成token。这样的好处是

  • 词汇量要小得多;
  • OOV要少得多,因为每个单词都可以从字符构建。

比如,下面的句子:

Let’s do some NLP tasks.

按照字母分词后,得到的token是:

L, e, t, ', s, d, o, s, o, m, e, N, L, P, t, a, s, k, s, .

中文:

在中文中,Character level是将文本按照字级别分割成token。

比如,下面的句子:

我们来做一个自然语言处理任务。

按照字分词后,得到的token是:

我,们,来,做,一,个,自,然,语,言,处,理,任,务,。

这种方法也不是完美的。基于字符而不是单词,从直觉上讲意义不大:在英文中每个字母本身并没有多大意义,单词才有意义。然而在中文中,每个字比拉丁语言中的字母包含更多的信息。

另外,我们的模型最终会处理大量的token:使用基于单词(word)的标记器(tokenizer),单词只会是单个标记,但当转换为字母/字(character)时,它很容易变成 10 个或更多的标记(token)。

3. Sub-word level

在实际应用中,Character level和Word level都有一些缺陷。Sub-word level是一种介于Character level和Word level之间的分词方式。

Sub-word 一般翻译成子词

子词分词算法依赖于这样一个原则,即不应将常用词拆分为更小的子词,而应将稀有词分解为有意义的子词。

英文

我们来看下面的例子:

Let’s do Sub-word level tokenizer.

分词结果为:

let’s</ w>, do</ w>, Sub, -word</ w>, level</ w>, token, izer</ w>, .</ w>,

</ w>通常表示一个单词word的结尾。使用 “w” 是因为它是 “word” 的首字母,这是一种常见的命名约定。然而,具体的标记可能会根据不同的实现或者不同的分词方法有所不同。

中文

在中文中,似乎没有子词的概念,最小单元好像就是字了,那该如何使用子词分词?难道是偏旁部首吗?别着急,后面我们一起讨论。

请添加图片描述

4. 更多sub-word level的分词器

现在看来,要卷也是在子词分词器上卷,于是业界逐渐开发了一系列分词算法,包括:

  • Byte-Pair Encoding(BPE)
  • WordPiece
  • Unigram
  • SetencePiece
  • BBPE

后续这个系列会继续分享这些常用的子词分词器。

参考

[1] 标记器(Tokenizer)

[2] word_vs_character_level_tokenization

[3] tokenization-in-natural-language-processing

欢迎关注我的GitHub和微信公众号,来不及解释了,快上船!

GitHub: LLMForEverybody

仓库上有原始的Markdown文件,完全开源,欢迎大家Star和Fork!

### 中文分词器的使用方法和实现 #### 分词器简介 分词器Tokenizer)是自然语言处理中的重要组件之,用于将文本数据转换为机器可读的形式。具体而言,分词器负责将输入字符串分解成系列有意义的单元——即tokens[^1]。 对于中文环境下的应用开发人员来说,选择合适的分词策略至关重要。不同于英语等西方文字体系可以直接基于空格进行简单的单词划分,在汉字组成的连续字符流中找到合理的边界是项更具挑战性的任务。因此,针对汉语特点设计专门化的分词算法显得尤为必要[^3]。 #### 常见类型的中文分词方式 - **Word-Level (词语级别)** 这种模式下,整个词汇作为个整体被识别出来并作为单个token返回给下游应用程序。例如,“中华人民共和国”会被视为单实体而不是单独的字符序列。 - **Char-Level (字符级别)** 将每个独立的汉字当作最小单位来进行切割操作。“中国”的两个组成部分“中”、“国”,分别成为各自独立的输出项。 除了上述两种基本形式外,还有其他更为复杂的混合型方案可供选用,它们试图平衡精度与效率之间的关系,以适应不同应用场景的需求。 #### SentencePiece库的应用实例 SentencePiece是种广泛应用于多语言场景下的高效分词解决方案,尤其适合处理像中文这样的表意文字系统。它不仅支持传统的基于规则的方法,还引入了统计学原理来优化性能表现。下面给出段Python代码片段展示如何利用该工具完成基础配置以及实际调用过程: ```python import sentencepiece as spm # 训练新的SP模型 spm.SentencePieceTrainer.Train('--input=corpus.txt --model_prefix=m --vocab_size=8000') # 加载已训练好的模型文件 sp = spm.SentencePieceProcessor(model_file='m.model') text = "你好世界" encoded_text = sp.encode(text, out_type=str) print(encoded_text) ``` 此段脚本首先创建了个自定义的语言模型`m.model`,接着加载这个预构建的对象,并对其传入的句话进行了编码变换。最终得到的结果是以列表形式呈现出来的离散化表达向量[^2]。 #### 提升分词效果的小技巧 为了让分词结果更加贴近真实语境,有时还需要考虑加入额外的信息辅助判断。比如通过上下文感知机制增强对歧义情况的理解能力;或是借助外部资源如领域特定术语表帮助定位专有名词位置等等。另外值得注意的是,某些情况下适当放宽匹配条件反而有助于提升召回率,但这往往伴随着误报风险增加的问题,所以在实践中需权衡利弊做出合理抉择[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值