最新的nlp生成算法,NLP系列之词向量-共现矩阵
最新的nlp生成算法,NLP系列之词向量-共现矩阵【中国】:【1,0,0,0,0,0,0】 【爱】: 【0,1,1,0,0,1,0】来来来,我们举个栗子: 【我,爱,中国,也,喜欢,地球】,经过训练后,词向量表示为: 【我】: 【1,0,1,0,1,1,0】
在上一期中,我们了解到词向量的第一种表示方式——独热表示( one-hot ),其表示简单清晰,如同生物界中的单细胞生物一样单纯,这么单纯的表示方式也有它不足的地方的:
- 每个词典之间无任何关联,无法表示出在语义层面上词语之间的联系。
- 词汇表一般比较大,上百万千万,甚至上亿,这样每个词都有用至少百万维的向量来表示,向量太稀疏,内存空间占用太大。
本期将用新的表示方法来解决上述问题——密集向量 distributed representation。
密集向量 distributed representation:
即分布式表示,可以克服独热表示( one-hot )的上述缺点,基本思路是通过训练将每个词映射成一个固定长度的短向量,所有这些向量就构成一个词向量空间,每一个向量可视为该空间上的一个点。此时向量长度可以自由选择,与词典规模无关。
来来来,我们举个栗子:
【我,爱,中国,也,喜欢,地球】,经过训练后,词向量表示为:
【我】: 【1,0,1,0,1,1,0】
【爱】: 【0,1,1,0,0,1,0】
【中国】:【1,0,0,0,0,0,0】
【也】: 【0,0,1,0,0,0,0】
【喜欢】: 【1,1,1,0,0,1,0】
【地球】: 【0,0,0,0,1,1,0】
通过上面向量值的比较,发现【爱】和【喜欢】的向量值很接近,说明他们直接的关系更加紧密,其他词之间的向量值相差却很大。
这种表示方式能更精准的体现词与词之间的语义关系,比独热表示( one-hot )的稀疏向量更有优势。
如何能训练出能体现词与词之间的语义关系的词向量呢?
咱们可以考虑词与词之间的共现问题来统计——基于共现矩阵模型:
通过统计一个事先指定大小的窗口内单词的共现次数,来解决维度变化问题。这种方法以单词周边的共现词的次数做为当前的词向量。
来来来,咱们再举个栗子:
- 我\喜欢\爬山
- 我\爱\NLP
- 我\喜欢\运动
- 我\爱\游戏
考虑的窗口大小为1 则共现矩阵如下:
我 |
喜欢 |
爱 |
爬山 |
NLP |
运动 |
游戏 | |
我 |
0 |
2 |
2 |
0 |
0 |
0 |
0 |
喜欢 |
2 |
0 |
0 |
1 |
0 |
1 |
0 |
爱 |
2 |
0 |
0 |
0 |
1 |
0 |
1 |
爬山 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
NLP |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
运动 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
游戏 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
共现矩阵的行(或列)可表示为对应的词向量。如"我"的词向量为[0 2 2 0 0 0 0]。同时可以知道"爱","喜欢"的词向量相似度较高,他们具有相近的意思。
上面的矩阵只是一个7*7的矩阵,如果预料很多上百万怎么办?
有人会说可以用奇异值分解SVD、PCA将矩阵维度降低,but,but,but,即使降低维度后,依然存在一些问题:
- 矩阵X的维度经常改变
- 由于大部分词并不共现而导致的稀疏性
- 矩阵维度过高带来的高计算复杂度
这些问题怎么办呢?不急,我们将在下一期中一一介绍。