Tokenizer总结

Introduciton

        transformer类型的预训练模型层出不穷,其中的tokenizer方法作为一个非常重要的模块也出现了一些方法。本文对tokenizer方法做一些总结。参考来自hunggingface

        tokenizer在中文中叫做分词器,就是将句子分成一个个小的词块(token),生成一个词表,并通过模型学习到更好的表示。其中词表的大小和token的长短是很关键的因素,两者需要进行权衡,token太长,则它的表示也能更容易学习到,相应的词表也会变小;token短了,词表就会变大,相应词矩阵变大,参数也会线性变多。所以token的粒度通常分为word和char,中文则对应为词级别和字级别;目前比较流行的是subword-子词级别,将词进一步分为有意义的子词,这在英文中比较常见(词根,词缀),其中在transformers模型中常用的subword tokenizer有三种:BPE、WordPiece、SentencePiece。

Byte-Pair-Encoding

        BPE(byte-pair-encoding)基于pre-tokenization对训练数据进行切分。Pre-tokenization可以使用简单的空格分割,比如GPT2、RoBERTa;可以使用规则分词方法,如XLM、FlauBERT,GPT;进行完pre-tokenization之后,需要对词进行频率统计,之后会将一批symbol作为基础vocabulary,根据之前的词频统计结果或者别的规则方法作为合并方法symbol进行合并,并扩充入vocabulary。如此循环直至词表大小达到预先设置值或者合并结束。

Byte-Level BPE

        代表模型:GPT。如果将所有unicode字符视为基本字符,则包含所有可能的基本字符的基本词汇表可能相当大。为了获得更好的基础词汇表,GPT-2使用字节作为基础词汇表,这是一个巧妙的技巧,可以强制基础词汇表的大小为256,同时确保每个基础字符都包含在词汇表中。使用一些额外的规则来处理标点符号,GPT2的标记器可以标记每个文本,而不需要<unk>符号。

WordPiece

        WordPiece代表模型:BERT、DistilBERT和Electra,与BPE非常相似。WordPiece首先初始化词汇表以包含训练数据中的每个字符,并逐步学习给定数量的合并规则。与BPE相反,WordPiece并没有选择最频繁的符号对,而是选择一个一旦将训练数据添加到词汇表中,就可以最大化训练数据可能性的符号对。下图为词表的生成流程:

Unigram

        Unigram也是一种子词的tokenization,虽然在transformer模型中没有直接使用,但是在SentencePiece中会有用到,所以学习一下。unigram方法和上面两种分词器方法相反,先初始化一个包含大量的symbol的基础vocabulary,其中包含预分词生成的word和高频的子词,然后通过修剪方法缩小词表大小。unigram的修剪方法是训练一个语言模型来计算word修剪前后的loss变化,选择去除loss增加最少的词。为了防止out-of-vocabylary,词表会始终保留单个字符。具体流程如下图:

        由于unigram没有合并规则,所以在对句子进行tokenizer时会有很多可能的情况。unigram方法会在生成词表时记录每个词的概率,所以可以在tokenizer时会可能出现的情况计算其概率选择概率最大的情况作为最终tokenizer方案。

SentencePiece

        SentencePiece代表模型:XLNet、marian、T5、ALBERT。前面描述的tokenizer算法都有相同的问题:假设输入文本使用空格分隔单词。然而,并非所有语言都使用空格分隔单词。一种可能的解决方案是使用特定于语言的预标记器,例如,XLM使用特定的中文、日文和泰文预标记器。为了更普遍地解决这一问题,SentencePiece将输入视为原始输入流,从而包括要使用的字符集中的空间。它一般使用BPE或unigram算法来构造适当的词汇表。

        

  • 13
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tokenizer.word_index是一个字典,它将单词映射到它们在训练数据中出现的索引位置。例如,如果训练数据中出现了单词"apple",它的索引位置可能是1,那么tokenizer.word_index["apple"]的值就是1。这个字典可以用来将文本数据转换为数字序列,以便进行机器学习模型的训练。 ### 回答2: tokenizer.word_index是一个字典,它将单词映射到它们在训练文本中的索引。索引从1开始,因为0被保留为填充标记。 例如,如果tokenizer.word_index中包含{"apple": 1, "banana": 2, "orange": 3},则在训练过程中,"apple"将映射到索引1,"banana"映射到索引2,"orange"映射到索引3。 在进行文本处理时,我们通常会使用tokenizer.word_index来将每个单词转换为对应的索引,从而在训练数据中建立单词到数字的映射关系。这对于构建词袋模型、进行序列分析或者任何需要将文本表示为数字的任务非常有用。 此外,tokenizer.word_index还提供了可以反向检索的功能,可以通过索引查找对应的单词。例如,如果我们想找到索引为2的单词,我们可以使用tokenizer.word_index.get(2)来获取它对应的单词。 总结起来,tokenizer.word_index是一个将训练文本中的单词映射到索引的字典,可以用于将文本数据转化为数字表示,同时可以通过索引反向查找对应的单词。 ### 回答3: tokenizer.word_index是一个字典,其中包含了训练过程中出现的所有单词,并且按照它们在训练数据中出现的频率进行排序。该字典的键是单词,值是对应的唯一索引。 在训练模型时,我们通常需要将文本数据转换为数字表示,以便于模型理解和处理。tokenizer.word_index可以帮助我们将单词转换为数字索引。 使用tokenizer.word_index,我们可以将一个单词转换为它在训练数据中的索引。例如,如果tokenizer.word_index['apple']返回值为10,那么表示在训练数据中,单词"apple"对应的索引为10。 tokenizer.word_index还可以用于反转操作,将数字索引转换为对应的单词。我们可以使用tokenizer.index_word来实现这个功能。例如,如果tokenizer.index_word[10]返回值为"apple",那么表示索引为10的单词是"apple"。 通过tokenizer.word_index,我们可以方便地将训练数据中的单词映射为数字索引,并进行模型训练。这个字典的构建过程是基于训练数据的,因此它在不同的训练集上可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值