3个子词算法有助于提高你的NLP模型性能
子字简介 [](https://res.cloudinary.com/practicaldev/image/fetch/s--yx3riG2Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AOzrGnF_f8bj3nqAf) 照片由Edward M
子字简介
[](https://res.cloudinary.com/practicaldev/image/fetch/s--yx3riG2Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AOzrGnF_f8bj3nqAf)
照片由Edward Ma 拍摄onUnsplash
经典词表示不能很好地处理看不见的词或稀有词。字符嵌入是克服词汇外 (OOV) 的解决方案之一。但是,它可能过于细化而遗漏了一些重要信息。子词介于单词和字符之间。它不是太细粒度,同时能够处理看不见的单词和罕见的单词。
例如,我们可以将“subword”拆分为“sub”和“word”。换句话说,我们使用两个向量(即“sub”和“word”)来表示“subword”。您可能会争辩说它使用更多的资源来计算它,但事实是我们可以通过与单词表示相比使用更少的足迹。
这个故事将讨论SentencePiece: A simple and language Independent subword tokenizer and detokenizer for Neural Text Processing(Kudo et al., 2018),并进一步讨论不同的子词算法。将涵盖以下内容:
-
字节对编码 (BPE)
-
字片
-
Unigram 语言模型
-
句子片段
字节对编码(BPE)
森里奇等人。 (2016)提出使用字节对编码(BPE)来构建子词词典。 Radfor等人在2019年采用BPE构建子词向量构建GPT-2。
算法
1.准备足够大的训练数据(即语料库)
-
定义所需的子词词汇量
-
将单词拆分为字符序列,并以词频在词尾添加后缀“</w>”。所以这个阶段的基本单位是性格。例如,“low”的频率是5,那么我们将其改写为“l o w </w>”:5
4.根据高频出现产生一个新的子词。
- 重复步骤 4,直到达到步骤 2 中定义的子词词汇量或下一个最高频率对为 1。
[](https://res.cloudinary.com/practicaldev/image/fetch/s---hwO-9A7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images -1.medium.com/max/485/1%2A_bpIUb6YZr6DOMLAeSU2WA.png)
BPE 算法 (Sennrich et al., 2015)
示例
以“low: 5”、“lower: 2”、“newest: 6”和“widest: 3”为例,频率最高的子词对是e和s。这是因为我们从最新得到 6 个计数,从最宽得到 3 个计数。然后形成新的子词(es),它将成为下一次迭代的候选者。
在第二次迭代中,下一个高频子词对是 es(从前一次迭代生成)和 t。这是因为我们从最新获得 6 个计数,从最宽获得 3 个计数。
保持迭代,直到建立所需的词汇量大小或下一个最高频率对为 1。
字片
WordPiece 是另一种分词算法,与 BPE 类似。 Schuster 和 Nakajima 在 2012 年通过解决日韩语音问题引入了 WordPiece。基本上,WordPiece 与 BPE 相似,不同之处在于按可能性形成一个新的子词,但不是下一个最高频率对。
算法
1.准备足够大的训练数据(即语料库)
-
定义所需的子词词汇量
-
将单词拆分为字符序列
-
根据第 3 步数据构建语言模型
-
从所有可能的词单元中选择新词单元,当添加到模型中时,这些词单元增加训练数据的可能性最大。
-
重复步骤 5,直到达到步骤 2 中定义的子词词汇量或似然增加低于某个阈值。
Unigram 语言模型
工藤。引入了一元语言模型作为子词分割的另一种算法。其中一个假设是所有子词的出现都是独立的,并且子词序列是由子词出现概率的乘积产生的。 WordPiece 和 Unigram 语言模型都利用语言模型来构建子词词汇表。
算法
1.准备足够大的训练数据(即语料库)
- 定义所需的子词词汇量
3.通过给出一个词序列来优化词出现的概率。
4.计算每个子词的损失
-
按损失对符号进行排序并保留前 X % 的单词(例如 X 可以是 80)。为避免超出词汇量,建议将字符级别作为子词的子集包含在内。
-
重复步骤 3-5,直到达到步骤 2 中定义的子词词汇量大小或步骤 5 中没有变化。
句子片段
那么,我们可以利用它进行文本处理的任何现有库吗? Kudo 和 Richardson 实现了SentencePiece库。您必须根据您的数据训练您的标记器,以便您可以为下游任务对数据进行编码和解码。
首先,准备包含您的数据的纯文本,然后触发以下 API 来训练模型
import sentencepiece as spm
spm.SentencePieceTrainer.Train('--input=test/botchan.txt --model\_prefix=m --vocab\_size=1000')
它非常快,您可以通过以下方式加载模型
sp = spm.SentencePieceProcessor()
sp.Load("m.model")
要对文本进行编码,您只需要
sp.EncodeAsIds("This is a test")
有关更多示例和用法,您可以访问此repo。
带走
-
子词平衡词汇量和占用空间。极端情况是我们只能使用 26 个标记(即字符)来呈现所有英文单词。建议使用 16k 或 32k 子词以获得良好的结果。
-
许多亚洲语言单词不能用空格分隔。因此,初始词汇量要比英语大很多。您可能需要准备超过 10k 个初始单词来开始分词。根据 Schuster 和 Nakajima 的研究,他们建议日语和韩语分别使用 22k 词和 11k 词。
想学?
我是湾区的数据科学家。专注于数据科学、人工智能领域的最新技术,尤其是在 NLP 和平台相关领域。请随时在LinkedIn上与me联系或在Medium或Github上关注我。
扩展读数
-
经典词表示
-
字符嵌入
-
过于强大的 NLP 模型(GPT-2)
-
SentencePiece GIT 回购
参考
-
T. Kudo 和 J. Richardson。SentencePiece:用于神经文本处理的简单且与语言无关的子词标记器和去标记器。 2018
-
R. Sennrich、B. Haddow 和 A. Birch。带有子词单元的稀有词的神经机器翻译。 2015
-
M. Schuster 和 K. Nakajima。日韩语音搜索. 2012
-
工藤拓。子词正则化:改进具有多个候选子词的神经网络翻译模型。 2018
更多推荐
所有评论(0)