在介绍之前,我们先了解一下tokenizer及分词粒度。
什么是tokenizer?
Tokenizer是NLP中的一个关键组件,其主要作用是将自然语言文本转化为计算机可以处理的数字表示。在NLP任务中,文本通常以单词、子词或字符的形式存在,而计算机处理的是数字。Tokenizer的任务就是将文本分割成一系列标记(tokens),并将这些标记映射到唯一的数字ID,以便语言模型能够理解和处理它们。
tokenizer分词粒度:
主要包括三种粒度:字符级分词、单词级分词和子词级分词。
1. 字符级分词:
- 字符级分词是将文本分割成最小的单元,即字符。
- 每个字符都被视为一个标记,并分配一个唯一的数字ID。
- 这种分词粒度通常用于处理语言中的字符级别任务,如中文分词、拼写检查等。
- 优点:能够处理多种语言,不受词汇表大小限制。
- 缺点:对于长文本,生成的标记数量较多,可能需要更大的计算和存储资源。而且严重丢失了词汇的语义信息和边界信息,这对 NER 等关注词汇边界的任务来说会有一定的影响。
2. 单词级分词:
- 单词级分词是将文本分割成单词作为标记。
- 每个单词通常映射到一个数字ID,这些ID根据语言模型的词汇表来确定。
- 这种分词粒度通常用于传统的NLP任务,如情感分析、文本分类等。
- 优点:文本表示更加语义明确,适用于大多数文本处理任务。
- 缺点:需要维护大型词汇表,对于某些语言和特殊术语可能不适用(OOV问题)。
3. 子词级分词:
- 子词级分词是将文本分割成子词或更小的单元,如WordPieces或字母的组合。
- 每个子词映射到一个数字ID,这些ID也根据语言模型的词汇表来确定。
- 这种分词粒度常用于现代预训练语言模型,如BERT、GPT等。
- 优点:能够处理未登录词、多语言、语言中的复杂变形等,适用于各种任务。
- 缺点:增加了标记的数量,可能需要更大的存储和计算资源。
常用tokenizer算法:
常用的tokenizer算法主要包括:BPE(Byte-Pair Encoding),WordPiece和SentencePiece,他们都是用于将文本分割成子词或更小单元的算法,通常用于构建现代NLP模型的输入。以下是对这些算法的简要介绍:
BPE(Byte-Pair Encoding):
- BPE是一种基于统计信息的分词算法,最早用于压缩数据。它后来被引入到自然语言处理中,用于生成子词级别的标记。
- BPE的基本思想是从字符级别开始,逐步合并最频繁出现在文本中的字符序列,以创建更大的子词。
- BPE算法的步骤包括: a. 初始化:将文本分割成单个字符。 b. 统计:统计字符序列对的频率,然后合并最频繁的字符序列,生成更大的子词。 c. 重复:重复步骤b,直到达到所需的词汇表大小或者合并次数。
- BPE生成的子词通常是可重构的,可以还原成原始文本。
例子:
假设我们有一个语料库包含以下单词:
- "subword"
- "subwoofer"
- "submarine"
- "subtle"
步骤1:初始化
开始时,我们将每个字符视为一个独立的标记:
s u b w o r d
s u b w o o f e r
s u b m a r i n e
s u b t l e
步骤2:统计字符对的频率
我们统计字符对的频率,例如 "s u" 出现4次, "u b" 出现4次,等等。
步骤3:合并最频繁的字符对
合并出现频率最高的字符对,例如 "s u" 出现最频繁,我们将它合并成一个新的子词 "su".
字符序列更新为:
su b w o r d
su b w o o f e r
su b m a r i n e
su b t l e
步骤4:重复
重复步骤2和步骤3,继续合并最频繁的字符对,直到满足停止条件。在这个示例中,我们只进行了一次合并。
采用BPE的语言模型:
使用BPE算法的语言模型主要有:BERT、GPT2、RoBERTa