1. 自然语言的表示
在word2vec出现之前,自然语言通常以词作为基本单位,进行one-hot encoding,这样做最大的弊端是完全不能Get到任意两个词的相似度,任意两个向量的内积都是0,且维度会根据单词数量增加,对于现在的语料来说,千万个单词的语料库都是很常见的。
2. 词嵌入
词嵌入(word embedding)其实是将高维(V)的词向量压缩到了低维(M),其中V>>M,最终的Embedding Matrix的尺寸就是V*M。这样我们就能很容易的计算任意两个词之间的相似性,例如余弦相似度。
举个例子
-
假设词表V的大小是10000,有一句话【我 爱 中国】,其中【我】在词表的第2个位置记作,【爱】在词表的第128个位置记作,【中国】在词表的第256个位置记作.我们需要将其嵌入到100维的矩阵中
我们要计算【我】的词向量,直接使用np.dot(E,)即可得到一个100维的词向量表示
word2vec
Word2vec是由Mikolov T在2013年提出的,查了下,Doc2vec,FastText都是他提出来的,牛人!
word2vec训练方式有两种
- cbow 本质就是完形填空,根据上下文预测中心词。
-
skip-gram 根据中心词预测上下文
训练时,会将随机初始化Embedding Matrix,分别将上下文每个词向量作为输入,如果上下文选择是4,词向量的维度是100,那么堆叠之后输入的维度就是4*100,经过一层Wx+b,对结果进行softmax,如果词库大小是10000,那么softmax的结果也是10000维,通过多轮迭代即可得到Embedding Matrix
训练trick
- 分层softmax
由于词汇表可能会很大导致计算很慢,所以使用霍夫曼树构造节点,将时间复杂度降到,这里就不展开讲,有兴趣可以看下刘建平老师的博客 基于Hierarchical Softmax的模型
分享
在我们实际的业务场景下使用覆盖率还不错,有兴趣的拿去。腾讯200维800万词向量
参考
- [1] 第二周 自然语言处理与词嵌入