1 分词
1.1 什么是分词
分词是把自然语言语句进行数字化的过程。
1.2 为什么要分词
自然语言是字符串序列,机器没办法直接处理, 需要处理成数字的形式。
1.3 如何进行分词
以英文为例:
-
1 按空格划分
这应该是最简单也最直观的做法了。这样分词的结果基本上就是单词和标点符号。 这种分词方法的优点是简单, 缺点也很明显: 1)单词的表的数量会很大,2)容易出现新的单词不在词表中的情况, 3)相似单词之间没有联系(如一个单词的过去式, 未来式等等) -
2 按字符划分
按字符划分不会出现新的单词不在词表中的情况, 并且词表的数量也会比较小。但是缺点也非常明显, 那就是序列会变得特别长, 并且拆分成一个一个的字符, 几乎完全丢失了单词的语义信息。 -
3 按子词(subword)划分
这种方式可以看做是上面两种方式的折中, 可以有效避免上面2种方式的缺点。
下面将介绍几个流行的subword分词方法。
1.3.1 BPE
1.3.2 Wordpiece
经过分析后, 我们可以得到一个词表, 下面是一个词表的示例:
可以看到, 词表中既有完整的单词, 也有一些并不是完整的单词, 如es, ed, ou等等, 它们可以被看做subword。对词表中的每一个元素, 我们可以给他一个数字编号, 如词表中包含50000个元素, 我们就依次用0~49999给他们编号。
有了这个词表,对一个句子, 我们就可以逐个遍历词表, 把一个句子用词表中的元素顺序拼接起来, 如Hello word这个序列,可以分成Hell o world, 对应的数字序列就是13586, 137,255。
分词完成了语言序列的数字化, 使神经网络可以处理自然语言序列。
2 词嵌入
词嵌入就是为了把词表中的每个元素用向量表示。 上面分词得到的词表我们用数字对他们进行了编号, 虽然网络可以直接处理数字信息, 但上面的数字并没有什么语义信息, 数字编号只是我们随意赋予的一个数值, 本身没有什么意义。我们期望得到一个有意义的表征,常见的做法是把词表中的每个元素用一个向量表征, 比如每一个元素, 我们用1024维的向量表示, 那么对于一个长度50000的词表, 词嵌入之后的词汇表就是50000*1024的大小。
3 参考
1 深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解