当前位置:   article > 正文

BPE(Byte Pair Encoding)算法_bpe算法

bpe算法

BPE算法,最早应用于NLP任务出现于《Neural Machine Translation of Rare Words with Subword Units》这篇文章,是一种解决NMT任务中,出现OOV(out-of-vocabulary)的方法。在NMT任务中,如果出现OOV问题,最常见的就是back off to a dictionary。这篇文章使用了BPE算法后,不用退回到字典前就可以继续NMT任务。

BPE是一种压缩算法,是一种自下而上的算法。将单词作为单词片段处理(word pieces),以便于处理未出现单词。在NMT任务中,先将训练集单词划分成片段(利用BPE),然后将片段随机赋值后放到RNNs或CNNs中训练出片段的embedding,再将片段组合得出word的embedding后,进行NMT工作。这样如果在训练集或者其他情况中,遇到生僻词或者未登录词时,直接利用片段进行组合来进行NMT任务。

BPE算法基本过程如下:

(1)首先将统计text中单词,做成词汇表(单词-频率),然后按照unigram进行分解。

5 l o w
       2 l o w e r
       6 n e w e s t
       3 w i d e s t

词汇表:l, o, w, e, r, n, w, s, t, i, d, 

(2)寻找频率最大的片段(字符),进行组合,将组合片段加入词汇表。

5 l o w
       2 l o w e r
       6 n e w es t
       3 w i d es t

词汇表:l, o, w, e, r, n, w, s, t, i, d, es

(3)继续重复上述操作,直到达到设定的阈值(词汇数+操作数)->操作数是唯一的超参数

5 l o w
       2 l o w e r
       6 n e w est
       3 w i d est

词汇表:l, o, w, e, r, n, w, s, t, i, d, es,est

5 lo w
       2 lo w e r
       6 n e w est
       3 w i d est

词汇表:l, o, w, e, r, n, w, s, t, i, d, es,est,lo

在《Neural Machine Translation of Rare Words with Subword Units》中存在这个算法描述的一段代码:

  1. import re, collections
  2. def get_stats(vocab):
  3. pairs = collections.defaultdict(int)
  4. for word, freq in vocab.items():
  5. symbols = word.split()
  6. for i in range(len(symbols)-1):
  7. pairs[symbols[i],symbols[i+1]] += freq
  8. return pairs
  9. def merge_vocab(pair, v_in):
  10. v_out = {}
  11. bigram = re.escape(' '.join(pair))
  12. p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
  13. for word in v_in:
  14. w_out = p.sub(''.join(pair), word)
  15. v_out[w_out] = v_in[word]
  16. return v_out
  17. vocab = {'l o w </w>' : 5, 'l o w e r </w>' : 2,
  18. 'n e w e s t </w>':6, 'w i d e s t </w>':3}
  19. num_merges = 10
  20. for i in range(num_merges):
  21. pairs = get_stats(vocab)
  22. best = max(pairs, key=pairs.get)
  23. vocab = merge_vocab(best, vocab)
  24. print(best)
  25. output:
  26. ('e', 's')
  27. ('es', 't')
  28. ('est', '</w>')
  29. ('l', 'o')
  30. ('lo', 'w')
  31. ('n', 'e')
  32. ('ne', 'w')
  33. ('new', 'est</w>')
  34. ('low', '</w>')
  35. ('w', 'i')

其中</w>是作为结束符来使用的。

BPE仅使用一个字符频率来训练合并操作。频繁的子字符串将在早期连接,从而使常用单词作为唯一的符号保留下来(如the and 等)。由罕见字符组合组成的单词将被分割成更小的单元,例如,子字符串或字符。因此,只有在固定的词汇量很小的情况下(通常是16k到32k),对一个句子进行编码所需要的符号数量不会显著增加,这是高效解码的一个重要特征。来自《Subword Regularization Improving Neural Network Translation Models

例子来自:cs224(2019)_12

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号