从NLP中的标记算法(tokenization)到bert中的WordPiece
作者:互联网
文章目录
- 词级标记 (Word level tokenization)
- 字符级标记 (Character level tokenization)
- 子字级标记 (Subword level tokenization)
- WordPiece 子字级标记算法
- BPE
所谓 tokenization ,就是如何提取或者说是记录文本中词语,常用的tokenization有 词级标记 (Word level tokenization)、字符级标记 (Character level tokenization)、子字级标记 (Subword level tokenization)
词级标记 (Word level tokenization)
词级标记就是用空格和标点符号讲一段文本分割成许多词语,词级标记标记的最小维度是词语;
虽然词级标记是一种符合常识的标记方法,但是他也存在着诸多问题,这里拿英文词级标记来举例说明
- New York 本是一个词语,但是如果通过常规的词级标记处理方法New York 便会被拆分成两个词,就会丧失其本意,在英文中这样的组合词还有很多并且这种词每时每刻都在产生
- can’t 也会被分割成 can 和 t 这明显也是不符合逻辑的
- 单词 burger 和 birger 只差一个字母,但却有这完全不同的意思, 如果文章的作者将 burger 错写成了 birger ,那么会对NLP任务造成巨大的困难
- 在英文中同一个词一般包含多种事态,如果将所有时态都进行标记,那么不仅会造成资源浪费还回给模型训练增加压力
字符级标记 (Character level tokenization)
Karpathy于2015年首次引入该方法 ,字符级标记不是将文本拆分为单词,而是将其拆分为字符,例如:happy 标记为 h a p p y。 词汇量大大减少到该语言中的字符数,英语是字母数26再加上特殊字符。 拼写错误或稀有单词可以更好地处理,因为它们被分解为字符,并且这些字符在词汇表中已经为人所知。
减少词汇量需要权衡序列长度。 现在,每个单词都被分解成所有字符,标记化序列比初始文本长得多。 happy 一词将转换为5个不同的token。 此外没有实现标记化的主要目的,因为至少在英语中字符没有语义。 只有将字符连接在一起才能获得意义。 作为单词和字符标记化之间的中间人,子词标记化产生子词单位 ,该子词单位小于单词,但大于字符。
这里着重说明一下,字符级标记不需要 embedding 而词级标记需要embedding 因为字符级标记等价于已经通过字符UI==对没个词进行编码了
子字级标记 (Subword level tokenization)
子词级标记化不会转换最常见的词,并以有意义的子词为单位分解稀有词。 如果将“unfriendly”标记为稀有单词,它将分解为“ un-friend-ly”,它们都是有意义的单位,“ un”的含义相反,“ friend”是名词,“ ly”将其转换为副词。 这里的挑战是如何进行细分,如何使我们将‘unfriendly’分解成 ‘un-friend-ly’ 而不是 ‘unfr-ien-dly’。
截至2020年,基于Transformers的最先进的深度学习架构使用子词级标记。 BERT针对此示例进行以下标记化:
原始文本: I have a new GPU.
标记文本:[‘i’,‘have’,‘a’,‘new’,‘gp’,’## u’,’。’]
词汇表中存在的单词本身被标记为单词,但是在词汇表中找不到“ GPU”,因此将其视为稀有单词。 根据算法,决定将其分段为“ gp-u”。 “ u”之前的##表示此子字与上一个子字属于同一字。 BPE,Unigram LM,WordPiece和SentencePiece是最常见的子词标记化算法,笔者猜测这几种子词标记化算法应该是在字词的划分策略上有所不同,
WordPiece 子字级标记算法
而现在大火的bert框架就是使用的WordPiece算法。WordPiece( Schuster和Nakajima,2012年 )最初用于解决日文和韩文语音问题,目前因在BERT中使用而闻名;它在许多方面与BPE相似,不同之处在于它基于似然而不是下一个最高频率对形成一个新的子字。WordPiece底层算法和代码尚未公开,这里简单叙述以下实现步骤。
- 获得足够大的语料库。
- 定义所需的子词词汇量。
- 将单词拆分为字符序列。
- 用文本中的所有字符初始化词汇表。
- 根据词汇建立语言模型。
- 通过将当前词汇表中的两个单元组合以将词汇表增加一个来生成新的子词单元。 从所有可能性中选择新的子词单位,这会在添加到模型时最大程度地增加训练数据的可能性。
- 重复第5步,直到达到子词词汇量(在第2步中定义),或者似然性增加降至某个阈值以下。
BPE
由Sennrich等人介绍。 在2015年 ,它迭代地合并最频繁出现的字符或字符序列。 该算法大致是这样工作的:
- 获得足够大的语料库。
- 定义所需的子词词汇量。
- 将单词拆分为字符序列,并附加一个特殊的标记,分别显示单词的开头或单词的结尾词缀/后缀。
- 计算文本中的序列对及其频率。 例如,(‘t’,‘h’)具有频率X,(‘h’,‘e’)具有频率Y。
- 根据最频繁出现的序列对生成一个新的子词。 例如,如果(‘t’,‘h’)在该对对中具有最高的频率,则新的子字单元将变为’th’。
- 从第3步开始重复,直到达到子词词汇量(在第2步中定义)或下一个最高频率对为1。在示例中,语料库中的“ t”,“ h”将替换为“ th”,再次计算,最频繁的对再次获得,并再次合并。
BPE是一种贪婪的确定性算法,不能提供多个细分。 也就是说,对于给定的文本标记化文本始终是相同的。
参考文献:
- Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation
- https://towardsdatascience.com/overview-of-nlp-tokenization-algorithms-c41a7d5ec4f9
标签:NLP,词级,标记,level,单词,tokenization,字符,bert 来源: https://blog.csdn.net/lch551218/article/details/114501211