OOV与BPE简述
自然语言处理(NLP)的许多相关任务如实体关系抽取、问答,机器翻译、阅读理解、文本摘要、实体链接等都需要对语言建模。近几年常用的语言模型有词向量,如Word2vec,Glove等。面向不同的领域和不同的任务,研究人员根据实际需要训练出来了各种各样的语言模型,如对实体链接训练了实体嵌入,对知识图谱的表示训练了知识图谱嵌入(实际上是一个三元组的向量化表示)。这些语言建模促使不同的NLP任务取得不同程度的进步。然而,词向量是一个词的有限集合的向量化表示,这些词都是常见词。故而由此而建成的语言模型(Language Mode,LM)总会存在不能满足实际应用的需求,即:目标任务中可能出现一些罕见词或是派生词,词的复数或者其他的一些组合词的规则而产生的词无法用现有词向量模型表示。所以这个问题就称之为OOV(Out-Of-Vocabulary)问题。为了解决这个问题,Rico Sennrich等人提出了BPE(Byte Pair Encoder)算法, 也叫做digram coding双字母组合编码,主要目的是为了数据压缩。算法描述为字符串里频率最常见的一对字符被一个没有在这个字符中出现的字符代替的层层迭代过程。利用BPE算法旨在发现各种介于word和character之间的词根,从而尽可能的覆盖各种各样的OOV。
BPE算法示例
1 | 比如我们想编码: |
BPE算法代码
1 | import re, collections |
输出为:1
2
3
4
5
6
7
8
9
10('e', 's')
('es', 't')
('est', '</w>')
('l', 'o')
('lo', 'w')
('n', 'e')
('ne', 'w')
('new', 'est</w>')
('low', '</w>')
('w', 'i')