三、字词模型(Subword Model)

Word-Level Model

前面学习的 word2vec 和 glove 基本上都是基于word单词作为基本单位的模型,这种方式虽然能够很好的对词 库中每一个词进行向量表示。

但是也有很多不足,比如:

  1. OOV 问题
  • 问题描述:容易出现单词不存在于词汇库中的情况;
  • 解决方法:最佳语料规模,使系统能够获得更多的词汇量;
  1. 误拼障碍
  • 问题描述:如果遇到了不正式的拼写, 系统很难进行处理;
  • 解决方法:矫正或加规则约束;
  1. 做翻译问题时, 音译姓名比较难做到

Character-Level Model

研究表面,当训练大规模数据集的时候,深度卷积神经网络并不需要单词层面的意义(包括语言的语法和语义),可以将字符级的文本当做原始信号,并且使用一维的卷积神经网络来处理它。
这就是基于 字符(Character) 作为基本单位的模型,这种方式能够很好的对字库中每一个 Char 进行向量表示。

优点是:

  • 能够解决 Word-level 所存在的 OOV 问题;
  • 拼写类似的单词 具有类似的 embedding;

然而问题也有很多,比如:

  • 序列变长
    相比于 word-level , Character-level 的输入句子变长,使得数据变得稀疏,而且对于远距离的依赖难以学到,训练速度降低;

Subword Model

一种介于 word- level Model 和 Character-level 之间的 Model,
Subword Model 可以被分为 Byte Pair Encoding(BPE) 和 SentencePiece。

Byte Pair Encoding
  • 基本思路
    BPE 属于 压缩算法中一种,其主要思想就是将经常出现的byte pair用一个新的byte来代替,例如假设 ('A', ’B‘)经常顺序出现,则用一个新的标志'AB'来代替它们。

  • 具体操作
    给定了文本库,我们的初始词汇库仅包含所有的单个的字符,然后不断的将出现频率最高的 n-gram pair 作为新的n-gram加入到词汇库中,直到词汇库的大小达到我们所设定的某个目标为止。

  • 举例说明
    假设我们的文本库中出现的单词及其出现次数为:

{'l o w': 5, 'l o w e r': 2, 'n e w e s t': 6, 'w i d e s t': 3}

初始词汇库为:

{ 'l', 'o', 'w', 'e', 'r', 'n', 'w', 's', 't', 'i', 'd'}

出现频率最高的ngram pair是('e','s') 9次,所以我们将'es'作为新的词汇加入到词汇库中,由于'es'作为 一个整体出现在词汇库中,
此时,文本库可表示为

{'l o w': 5, 'l o w e r': 2, 'n e w es t': 6, 'w i d es t': 3}

这时出现频率最高的ngram pair是('es','t') 9次,将'est'加入到词汇库中,文本库更新为

{'l o w': 5, 'l o w e r': 2, 'n e w est': 6, 'w i d est': 3}

新的出现频率最高的ngram pair是('l','o')7次,将'lo'加入到词汇库中,文本库更新为

{'lo w': 5, 'lo w e r': 2, 'n e w est': 6, 'w i d est': 3}

以此类推,直到词汇库大小达到我们所设定的目标。这个例子中词汇量较小,对于词汇量很大的实际情 况,我们就可以通过BPE逐步建造一个较小的基于subword unit的词汇库来表示所有的词汇。
BPE 衍生物 wordpiece model
谷歌的NMT模型用了BPE的变种,称作wordpiece model,BPE中利用了n-gram count来更新词汇库, 而wordpiece model中则用了一种贪心算法来最大化语言模型概率,即选取新的n-gram时都是选择使 得perplexity减少最多的ngram。

sentencepiece model
  • 基本思路
    sentencepiece model 将词间的空白也当成一种标记,可以直接处理sentence,而不需要将其pre- tokenize成单词。

Hybrid Model

在大多数情况下我们还是采用word level模型,而只在遇到OOV的情况才采用character level模型。 其结构如下图所示,


对于句子中的 "cute",其属于 OOV 词汇,为了解决该问题,我们需要构建一个 Character-level 表示, 但在 decode 过程中遇到 OOV 的特殊符号表示 时,需要采用 character-level 的 decode 进行 解码。
该训练过程是end2end的,不过损失函数是word部分与character level部分损失函数的加权叠加。

FastText

FastText就是利用subword将word2vec扩充,有效的构建embedding。
基本思想
将每个 word 表示成 bag of character n-gram 以及单词本身的集合,例如对于where这个单词和n=3的 情况,它可以表示为 <wh,whe,her,ere,re>, ,其中"<",">"为代表单词开始与结束的特殊标记。
假设对于word w ,其n-gram集合用 G_w 表示,每个n-gram的矢量表示为 ,则每个单词可以 表示成其所有n-gram的矢量和的形式,而center word w 与context word c 的分数就可表示成


之后就可以按照经典的word2vec算法训练得到这些特征向量。 这种方式既保持了word2vec计算速度快的优点,又解决了遇到training data中没见过的oov word的表
示问题,可谓一举两得。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容