网站ip地址向谁购买,苏州网站推广软件,潍坊做网站优化,深圳市宝安区区长什么是分词器#xff1f;简单点说就是将字符序列转化为数字序列#xff0c;对应模型的输入。
通常情况下#xff0c;Tokenizer有三种粒度#xff1a;word/char/subword
word: 按照词进行分词#xff0c;如: Today is sunday. 则根据空格或标点进行分割[today, is, sunda…什么是分词器简单点说就是将字符序列转化为数字序列对应模型的输入。
通常情况下Tokenizer有三种粒度word/char/subword
word: 按照词进行分词如: Today is sunday. 则根据空格或标点进行分割[today, is, sunday, .]character按照单字符进行分词就是以char为最小粒度。 如Today is sunday. 则会分割成[t o day .... sunday .]subword按照词的subword进行分词。如Today is sunday. 则会分割成[to dayis sunday .]
可以看到这三种粒度分词截然不同各有利弊。
对于word粒度分词
优点词的边界和含义得到保留缺点1词表大稀有词学不好2OOV可能超出词表外的词3无法处理单词形态关系和词缀关系会将两个本身意思一致的词分成两个毫不相同的ID在英文中尤为明显如cat cats。
对于character粒度分词
优点词表极小比如26个英文字母几乎可以组合出所有词5000多个中文常用字基本也能组合出足够的词汇缺点1无法承载丰富的语义英文中尤为明显但中文却是较为合理中文中用此种方式较多。2序列长度大幅增长
最后为了平衡以上两种方法 又提出了基于 subword 进行分词它可以较好的平衡词表大小与语义表达能力这种方法的目的是通过一个有限的词表 来解决所有单词的分词问题同时尽可能将结果中 token 的数目降到最低。例如可以用更小的词片段来组成更大的词例如
“unfortunately ” “un ” “for ” “tun ” “ate ” “ly ”。
可以看到有点类似英语中的词根词缀拼词法其中的这些小片段又可以用来构造其他词。可见这样做既可以降低词表的大小同时对相近词也能更好地处理。
Subword 与传统分词方法的比较
传统词表示方法无法很好的处理未知或罕见的词汇OOV 问题。传统词 tokenization 方法不利于模型学习词缀之间的关系例如模型学到的“old”, “older”, and “oldest”之间的关系无法泛化到“smart”, “smarter”, and “smartest”。Character embedding 作为 OOV 的解决方法粒度太细。Subword 粒度在词与字符之间能够较好的平衡 OOV 问题。
常见的子词算法有Byte-Pair Encoding (BPE) / Byte-level BPEBBPE、Unigram LM、WordPiece、SentencePiece等。
BPE, Byte Pair Encoding 字节对编码BPE, Byte Pair Encoder又称 digram coding 双字母组合编码是一种数据压缩 算法用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效因而目前它是最流行的方法。
BPE 首先将词分成单个字符然后依次用另一个字符替换频率最高的一对字符 直到循环次数结束。
准备语料库确定期望的 subword 词表大小等参数通常在每个单词末尾添加后缀 /w统计每个单词出现的频率例如low 的频率为 5那么我们将其改写为 l o w / w”5注停止符 /w 的意义在于标明 subword 是词后缀。举例来说st 不加 /w 可以出现在词首如 st ar加了 /w 表明该子词位于词尾如 we st/w二者意义截然不同将语料库中所有单词拆分为单个字符用所有单个字符建立最初的词典并统计每个字符的频率本阶段的 subword 的粒度是字符挑出频次最高的符号对 比如说 t 和 h 组成的 th将新字符加入词表然后将语料中所有该字符对融合merge即所有 t 和 h 都变为 th。注新字符依然可以参与后续的 merge有点类似哈夫曼树BPE 实际上就是一种贪心算法 。重复遍历 2 和 3 操作直到词表中单词数达到设定量 或下一个最高频数为 1 如果已经打到设定量其余的词汇直接丢弃注看似我们要维护两张表一个词表一个字符表实际上只有一张词表只是为了我们方便理解。
一个完整的例子 我们举一个完整的例子来直观地看一下这个过程
获取语料库这样一段话为例“ FloydHub is the fastest way to build, train and deploy deep learning models. Build deep learning models in the cloud. Train deep learning models. ” 拆分加后缀统计词频 建立词表统计字符频率顺便排个序 以第一次迭代为例将字符频率最高的 d 和 e 替换为 de后面依次迭代 更新词表 继续迭代直到达到预设的 subwords 词表大小或下一个最高频的字节对出现频率为 1。 如果将词表大小设置为 10最终的结果为 d er nrn irni nrnin g/wo deode lm odell ol e 这样我们就得到了更加合适的词表这个词表可能会出现一些不是单词的组合但是其本身有意义的一种形式
BPE 的优点
上面例子中的语料库很小知识为了方便我们理解 BPE 的过程但实际中语料库往往非常非常大无法给每个词(token)都放在词表中。BPE 的优点就在于可以很有效地平衡词典大小和编码步骤数将语料编码所需要的 token 数量。随着合并的次数增加词表大小通常先增加后减小。迭代次数太小大部分还是字母没什么意义迭代次数多又重新变回了原来那几个词。所以词表大小要取一个中间值。
BPE 的缺点
对于同一个句子, 例如 Hello world如图所示可能会有不同的 Subword 序列。不同的 Subword 序列会产生完全不同的 id 序列表示这种歧义可能在解码阶段无法解决。在翻译任务中不同的 id 序列可能翻译出不同的句子这显然是错误的。在训练任务中如果能对不同的 Subword 进行训练的话将增加模型的健壮性能够容忍更多的噪声而 BPE 的贪心算法无法对随机分布进行学习。 BPE 的适用范围 BPE 一般适用在欧美语言拉丁语系中因为欧美语言大多是字符形式涉及前缀、后缀的单词比较多。而中文的汉字一般不用 BPE 进行编码因为中文是字无法进行拆分。对中文的处理通常只有分词和分字两种。理论上分词效果更好更好的区别语义。分字效率高、简洁因为常用的字不过 3000 字词表更加简短。
BBPE
对于英文、拉美体系的语言来说使用BPE分词足以在可接受的词表大小下解决OOV的问题但面对中文、日文等语言时其稀有的字符可能会不必要的占用词汇表因此考虑使用字节级别byte-level解决不同语言进行分词时OOV的问题。具体的BBPE考虑将一段文本的UTF-8编码(UTF-8保证任何语言都可以通用)中的一个字节256位不同的编码作为词表的初始化基础Subword。
最主要区别是BPE基于char粒度去执行合并的过程生成词表而BBPE是基于4个字节、总共256个不同的字节编码Byte) 去执行合并过程生成词表。
BPE解决一个问题是能比较好支持语料是多种语言的分词一方面正如上面所说如果只考虑英文、法语、西班牙语等拉丁美系的语言BEP足以支持能够以较小词表大小Vocabulary Size解决OOV的问题。但中文、日本如果使用BEP对字符characters进行构造词表的话其具有的生僻词会占据浪费比较大词表空间。
WordPiece 算法
WordPieceWordPiece算法可以看作是BPE的变种。不同的是WordPiece基于概率生成新的subword而不是下一最高频字节对。WordPiece算法也是每次从词表中选出两个子词合并成新的子词。BPE选择频数最高的相邻子词合并而WordPiece选择使得语言模型概率最大的相邻子词加入词表。
Unigram
它和 BPE 以及 WordPiece 从表面上看一个大的不同是前两者都是初始化一个小词表然后一个个增加到限定的词汇量而 Unigram Language Model 却是先初始一个大词表接着通过语言模型评估不断减少词表直到限定词汇量。
SentencePiece
SentencePiece它是谷歌推出的子词开源工具包它是把一个句子看作一个整体再拆成片段而没有保留天然的词语的概念。一般地它把空格也当作一种特殊字符来处理再用BPE或者Unigram算法来构造词汇表。SentencePiece除了集成了BPE、ULM子词算法之外SentencePiece还能支持字符和词级别的分词。
SentencePiece 是一种无监督的文本 tokenizer 和 detokenizer主要用于基于神经网络的文本生成系统其中词汇量在神经网络模型训练之前就已经预先确定了。 SentencePiece 实现了subword单元例如字节对编码 (BPE)和 unigram 语言模型并可以直接从原始句子训练字词模型(subword model)。 这使得我们可以制作一个不依赖于特定语言的预处理和后处理的纯粹的端到端系统。
SentencePiece可以从原始句子中直接训练分词和去分词模型不需要依赖于特定语言的预处理或后处理。BPE的训练通常需要预分词步骤例如使用空格或标点符号作为初始的分词依据。