通俗易懂理解Token分词(概念版)
通俗易懂理解Token分词(概念版)
Tokenization(分词)是自然语言处理(NLP)中的基础任务,它将文本转换为模型能够处理的数字形式。本文详细介绍了Tokenization的概念、流程、难点以及各种分词策略,包括按词切分、按字符切分、按子词切分等,并探讨了基于词表和规则的分词方法,以及BERT中的Token化技术。
一、Tokenization相关介绍
0. 引言
因为神经网络模型不能直接处理文本,我们需要先将文本转换为模型能够处理的数字,这个过程被称为编码 (Encoding):先使用分词器 (Tokenizers) 将文本按词、子词、符号切分为 tokens;然后将 tokens 映射到对应的 token 编号(token IDs)。
1. Tokenization概念
在NLP领域,Tokenization被称作是“word segmentation”,直译为分词。具体来说,分词是NLP的基础任务,按照特定需求把文本中的句子、段落切分成一个字符串序列(其中的元素通常称为token或词语),方便后续的处理分析工作。
分词的目的是将复杂问题转化为数字问题,即将文本的非结构化数据转化为结构化数据,这样就可以将数据转化为数学问题。其中,分词就是整个转化过程中的第一步。这是因为机器学习中绝大多数模型是不支持字符串的,想要模型能够进行有效学习,必须对字符串数据进行数值化。另外,并不是直接对输入句子或者单词进行数值化,我们需要先将其切分成一个个有限的子单元,然后对这些子单元数值化。简单来说,将原始文本切分成子单元的过程,称之为Tokenization。
2. 分词流程
分词的大致流程:首先将文本句子切成一个个子单元,然后将子单元数值化(映射为向量),接着将这些向量输入到模型进行编码,最后输出到下游的任务中,进一步得到最终的结果。
3. Tokenization的难点
从上述Tokenization的任务内容可知,Tokenization是为数值化作准备,数值化的过程必然需要映射,而映射又需要一个目标集合或映射表。如果切分的子单元种类非常多,就需要一个非常庞大的映射表,这会导致巨大的内存消耗以及过多的计算量,这显然是不理想的。
分词的难点在于将原文本切分成子单元的过程中,如何获得一种理想的切分效果,使文本中所有的token都具有正确的语义,并且不会存在遗漏的问题。
4. Tokenization分词策略
根据切分粒度的不同,分词策略大概可以分为三种:按词切分 (Word-based)、按字符切分 (Character-based)、按子词切分 (Subword)。
4.1 按词切分 (Word-based)
按词切分是一种自然而然的方法,因为人类对自然语言文本的理解就是按照这种方式进行切分的。按词切分通常用一些工具来完成,例如英文的NLTK、SpaCy,中文的jieba、HanLP等。
适应场景:英文或拉丁语系,直接按照英文中自然的空格作为分隔符进行切分。
不适合:中日韩类的文字没有自然空格,切分很容易导致出现歧义。
按词切分的优点
按词切分非常切合人类的阅读习惯,一方面能够很好地保留词的边界信息,另一方面也能很好地保留词的语义信息。这对于后续的模型来讲十分有利,例如NER任务中,通常标签偏移是由于词边界没有约束好导致的,所以词语的边界信息对于某些下游任务来讲是很重要的。在MRC任务中,词语含义能否被模型捕获也显得很重要,一旦最初的输入模型丢失了某些关键的含义信息,最终结果可能会受到一定的影响。
按词切分的缺点
按词切分需要构造的词典太过庞大,严重影响计算效率和消耗内存;即使使用较大的词典不影响效率,也会造成OOV问题,因为人类语言是不断发展的,词汇会不断的增加,总会加大词典量;词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的含义;按词切分策略会将文本中所有出现过的独立片段都作为不同的 token,从而产生巨大的词表。而实际上词表中很多词是相关的,例如 “dog” 和 “dogs”、“run” 和 “running”,如果给它们赋不同的编号就无法表示出这种关联性。
4.2 按字符切分(Character-based)
按字符切分是按某一种语言最小符号来进行切分的。简单说就是英文(拉丁语系)以字母为单位,中文日文韩文等则是以字为单位进行切分。
按字符切分的优点
按字符切分的优点在于词表会大大减小,26个字母基本就能够覆盖所有词,5000多个中文基本也能组合覆盖大部分的词汇。
按字符切分的缺点
按字符切分有严重的缺陷,主要在于会严重丢失词汇的语义信息和边界信息,对NER等词汇边界的任务来说会有一定的影响。如果把单词切分的过细,会使得输入太长而增加输入计算的压力,减小词表的代价就是输入长度大大增加,从而输入计算变得更耗时,训练时更占内存空间,在现实应用中较少使用。
4.3 按子词切分(subword)
按子词切分方式同时结合了按词切分和按字符切分,将高频词直接保留,低频词被切分为更有意义的子词。例如 “annoyingly” 就是一个低频词,可以切分为 “annoying” 和 “ly”,这两个子词不仅出现频率更高,而且词义也得以保留。
适应场景:英文或拉丁语系。
不适合:对于中文,由于不能将某一个字拆分为偏旁部首和字根,没有意义。
通常,构造subword词典有4种方法:BPE、WordPiece、UniLM以及SentencePiece。
4.3.1 BPE
字节对编码(Byte Pair Encoding,BPE)是一种数据压缩方法,BPE 迭代地合并最频繁出现的字符或字符序列,具体步骤如下:
由此可以看到,每次尝试合并相邻的两个字符,如果合并后出现概率是目前最大的,则会将合并后的字符串加入到词汇表中。
4.3.2 WordPiece
WordPiece主要应用于解决日语和韩语语音问题。它与 BPE 相同点:每次从统计语料中选取出两个新的子词进行合并。它与 BPE 最大区别在于选择两个子词进行合并的原则:BPE 按频率,WordPiece 按能够使得 LM 概率最大的相邻子词加入词表。
WordPiece 的算法步骤如下:
4.3.3 UniLM
UniLM方法与 WordPiece 相同点是:使用语言模型来挑选子词。
UniLM与 WordPiece 最大区别:WordPiece 算法的词表大小都是从小到大变化;UniLM 的词库则是从大到小变化,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM 算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
UniLM 构造词典的算法步骤如下:
可以看出,UniLM会保留那些以较高频率出现在很多句子的分词结果中的子词,因为这些子词如果被丢弃,其损失会很大。
4.3.4 SentencePiece
以上三种方法都存在着两个问题:
- 无法逆转;
- 训练的时候需要提前切分。
无法逆转是指对句子 s 进行切分后得到的结果无法准确复原回 s。更直白地说就是空格不能被保留,示例如下:
而 SentencePiece的解决方法是: - 首先将所有输入转换为unicode字符,这意味着它不必担心不同的语言、字符或符号,可以以相同方式处理所有输入;
- 空白也被当做普通符号来处理,Sentencepiece显式地将空白作为基本标记来处理,用一个元符号 “▁”( U+2581 )转义空白,这样就可以实现简单的decoding;
- Sentencepiece 可以直接从 raw text 进行训练;
- 支持 BPE 和 UniLM 训练方法。
5. 基于词表和规则的分词方法
在分词方法中,有一类是在一个词表中根据各种算法进行词表匹配来进行分词。基于词表和规则的分词方法可以分为三种,即:
- 前(后)向最大匹配法;
- 最短路径分词法;
- 基于N-Gram LM 的统计词频率分词法。
假设给定一个词典V,如何对一个句子S进行分词,基于这一假设,展开介绍三种不同的分词方法。
5.1 前(后)向最大匹配法
前(后)向最大匹配法很简单,只需要知道向前匹配,那么后向匹配自然也就理解了。举例描述一个前向最大匹配法的流程,预设条件:
- 设定最大匹配长度为2(当然可以是3,4,5或者更长);
- 从左往右扫描句子(也可以从右往左)。
对应给定的假设词典V,可以看到最终的输出结果为:
这种规则虽然简单,但还是无法解决歧义的问题。
5.2 最短路径分词法
最短路径分词法是指,首先将句子中所有字都切分开来,根据词表将组成词的字连接起来,构成“词图”,然后求解“词图”的最短路径就是分词结果。
本文中的例子构造出的“词图”,如上图所示。路径上的数字“1”代表权重,这里我们全部取为1,代表每种分词的重要性,然后利用N-最短路径或者Dijkstra算法便可以求解出最短路径,该最短路径上的词汇就是我们最终需要的结果。
上述结果中,最终的分词结果为:
5.3 基于N-Gram LM 的统计词频率分词法
实际上,最短路径分词法将简化边的权重都为1,但现实中并非如此,常见的词出现频率高,我们可以用求解“词图”最短路径的方法转为求解概率最大路径。
利用2-Gram语言模型,可以计算出词语的共现概率,结合词典V,可以得到下面的“词图”:
参数解释
- P(他|):表示“他”作为句子开头对于训练好的语言模型来说其概率是多少。
- P(说|他):表示“说”字在“他”字后面出现的概率是多少。
由于该方法考虑了不同词语之间先后出现的概率,所以这是一种更合理的方法。
6. 基于 BERT 的 Token 化
Bert会将不常用的词汇进行细分,比如fearless,经过分词输出 ‘fear’,‘##less’。使用双#号表示连续词汇的分词。
在 BERT 的 Token 化结果中,
[CLS]
和
[SEP]
是特殊的 Token,它们分别表示句子的开始和结束。
["今", "天", "天", "气", "候", "[CLS]", "很", "好", "[SEP]"]