如何理解Tokenization

NLP技术中
【Tokenization】也可以被称作是
“word segmentation”,直译为
中文是指【分词】。
具体来讲,
分词是NLP的基础任务,按照特定需求能把文本中的句子、段落切分成一个字符串序列方便后续的处理分析工作。
按照下面的流程图来理解【分词】的任务内容,就是将文本句子切成一个个子单元,然后将子单元数值化,接着将这些向量输入到模型进行编码,最后输出到下游的任务中进一步得到最终的结果。
“
为什么要分词
分词的目的是将复杂问题转化为数字问题,即指
将文本的非结构化数据转化为【结构化的数据】,这样就可以将数据转化为数学问题。
其中
【分词】就是整个转化过程中的第一步。这是因为机器学习中绝大多数模型是不支持字符串的,想要模型能够进行顺利有效地学习,必须对字符串数据先数值化。
另外,
并不是直接对输入句子或者单词进行数值化,我们需要
先将其切分成一个个有限的子单元,然后将这些子单元数值化。
简单来说,
将原始文本切分成子单元的过程就叫做 Tokenization。但大多数人会误认为【分词】只是对中文进行词语的分割,
尽管这是Tokenization 的任务之一,但并不局限于此,它还要做的还有更多。
Tokenization的难点
【分词】的难点在于将原文本切分成子单元的过程中,
如何获得一种理想的切分效果,使文本中所有的token都
具有正确的语义,并且
不会存在遗漏的问题。
从上述Tokenization的任务内容可知,其是为数值化作准备,数值化的过程必然需要映射,而映射又需要一个目标集合或者说映射表。
这一步会产生一个问题:如果我们切分出来的子单元种类是非常多甚至无限多的,那么我们就需要一个非常庞大的映射表了,这就会
导致巨大的内存消耗以及过多的计算量,这显然是不理想的。
为解决这一问题,有一种做法是
将大量的“低频子单元”使用几个特定的符号来代替,缩小了映射表,但这样会导致原始文本的信息有部分损失。另外,对于切分出来的子单元到底如何定义,如何让它们有一定的含义。
举例来说:当
【unhappy】切分成了
【un;happ;ily】显然会比【unh;ap;pily】更合理,因为
【un;happy;ily】中的每一个子单元都有一定的含义,但后者不然。
三种Tokenization方法
按照切分的粒度可以将Tokenization分为三类,
一是按词粒度来分,二是按字符粒度来分,三是按 subword。
1、词粒度Tokenization
词粒度是一种自然而然的方法,因为人类对于自然语言文本的理解就是按照这种方式进行切分的。
通常可以用一些工具来完成,例如英文NLTK、SpaCy,中文的 jieba、HanLP 等。
举例来看【词粒度】进行Tokenization的过程:
明显可以看到,这种切分方式是和人类阅读时自然划分一致的。这种方法的优点就在于能够很好地保留词的语义和边界信息。
但需要注意的是,对于
英文或拉丁语系的词粒度Tokenization很简单,
可以直接按照英文中天然的空格作为分隔符进行切分,
但中日韩类的文字没有自然空格,所以切分很容易导致出现歧义。针对这类语言的文字可以使用一些分词方法。
在分词方法中有一类是在一个词表中根据各种算法进行词表匹配来进行分词。
基于词表和规则的分词方法可以分为3种,即
1、 前向最大匹配法;2、最短路径分词法;3、基于 N-Gram LM 的统计词频分词法。
介绍3种不同的分词方法前,先提出一个共有的基础问题——
【假设给定一个词典V,如何对一个句子S进行分词】,基于这同一假设,如下展开介绍三种不同的分词方法:
前向最大匹配法
前向最大匹配法很简单,
只需要知道向前匹配,那么后向匹配自然也就理解了。
举例一个前向最大匹配法进行讲解:
预设条件——
① 设定最大匹配长度 2;
②从左往右扫描句子。
对应给定的假设词典v 可以看到最终的输出结果为:
这种规则虽然简单,但还是无法解决歧义的问题。

最短路径分词法
最短路径分词法是指,首先将句子中
所有字都切分开来,根据
词表将组成词的字连接起来,构成“词图”,然后
求解“词图”的最短路径就是分词结果。
本文中的例子构造出的“词图”,如上图所示。路径上的数字“1”代表权重,这里我们全部取为 1,代表每种分词的重要性。然后利用 N-最短路径或者 Dijkstra 算法便可以求解出最短路径。然后最短路径上的词汇就是我们最终需要的结果。
上述结果中,最终的分词结果是:
基于 N-Gram LM 的统计词频分词法
上述的方法2实际上是做了简化边的权重都为1,但现实中并非如此,常见的词出现频率高,我们可以用求解“词图”最短路径的方法转为求解概率最大路径。
利用2-Gram语言模型,可以计算出词语的共现概率,结合词典 V,我们可以得到下面的“词图”。
P 的含义是,“他”作为句子开头对于训练好的语言模型来说其概率是多少,
同理 P 表示“说”字在“他”字后面出现的概率是多少。
由于该方法考虑了不同词语之间先后出现的概率,所以这是一种更合理的方法。
词粒度的优缺点:
优点——词粒度的切分非常贴合人类的阅读习惯,
一方面能够很好地保留词的边界信息,
另一方面也能很好地保留词的含义。这对于后续的模型来讲十分有利,例如NER任务中,通常标签偏移是由于词边界没有约束好导致的,所以词语的边界信息对于某些下游任务来讲是很重要的。在MRC任务中,词语含义能否被模型捕获也显得很重要,一旦最初的输入模型丢失了某些关键词的含义信息,最终结果可能会受到一定的影响。
缺点——词粒度的方法,
需要构造的词典太过庞大,严重影响计算效率和消耗内存;即使使用较大的词典不影响效率,也会造成OOV问题,因为人类语言是不断发展的,词汇也会不断的增加,总会加大词典量;词表中的
低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的语义;一个单词因为不同的形态会产生不同的词,如由“look”衍生出的“looks”, “looking”, 但是意义相近,对他们都进行训练是不必要的。
2、字符粒度Tokenization
字符粒度是按
某一种语言最小符号来进行切分的。简单说就是英文
以字母为单位,中文日文韩文等则是
以字为单位进行切分。
字符粒度是一种极简的方法,基本不需要什么技巧,但其存在较多的弊端。
优点——
这种方法的
优点在于词表会大大减小,26个字母基本就能够覆盖所有词,5000多个中文基本也能组合覆盖的词汇。
缺点——
其有严重的缺陷,主要在于
会严重丢失词汇的语义信息和边界信息,对NER等词汇边界的任务来说会有一定的影响。如果把单词切分的过细,会使得输入太长而增加输入计算的压力,减小词表的代价就是输入长度大大增加,从而输入计算变得更耗时,训练时更占内存空间,在现实应用中较少。
3、子词粒度Tokenization
subword粒度切分是一种折中的方法,
但
只适用于英文等拉丁语系的语言,对于中文来讲,由于不能将某一个字拆分为偏旁部首和字根,没有意义。subwords的 Tokenization切分过程具体如下图所示:
通常构造出subwords词典主要有4种方法:
BPE
全称
Byte Pair Encoding,字节对编码,是一种数据压缩方法,BPE 迭代地合并最频繁出现的字符或字符序列,具体步骤如下:
由此可以看到,每次尝试合并相邻的两个字符,如果合并后出现概率是目前最大的,则会将合并后的字符串加入到词汇表中。
WordPiece
WordPiece主要应用于解决日语和韩语语音问题。它与 BPE 相同点:每次从统计语料中选取出两个新的子词进行合并。它与 BPE 最大区别在于选择两个子词进行合并的原则:BPE 按频率,WordPiece 按能够使得 LM 概率最大的相邻子词加入词表。
WordPiece 的算法步骤如下:
UniLM
Unigram方法与 WordPiece 相同点是:
同样使用语言模型来挑选子词。
与 WordPiece 最大区别:WordPiece 算法的词表大小都是从小到大变化。UniLM 的词库则是从大到小变化,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM 算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
UniLM 构造词典的算法步骤如下:
可以看出,
UniLM会保留那些以较高频率出现在很多句子的分词结果中的子词,因为这些子词如果被丢弃,其损失会很大。
SentencePiece
以上三种方法都存在着两个问题就是:
1)无法逆转;2)训练的时候需要提前切分。
【无法逆转】是指对句子 s 进行切分后得到的结果无法准确复原回 s。更直白地说就是空格不能被保留,如下:
而
SentencePiece的解决方法是:
1、首先将所有输入转换为unicode字符,这意味着它不必担心不同的语言、字符或符号,可以以相同方式处理所有输入;
2、空白也被当做普通符号来处理,Sentencepiece显式地将空白作为基本标记来处理,用一个元符号 “▁”转义空白,这样就可以实现简单的decoding;
3、Sentencepiece 可以直接从 raw text 进行训练
4、支持 BPE 和 UniLM 训练方法。

参考来源:
file/tupian/20220729/p


