文中仅代表个人观点,如有异议,欢迎探讨。
在机器学习的研究中,从我们的处理对象上来看可以分为:图像、语音、文本。
本文重点讨论对文本的处理。也就是说,我们处理的对象是文本,但是机器不像人啊!没办法像人类一样对文档进行阅读。
所以!!我们要做的就是把文本进行表示,而我们的这种表示方法可以让机器读懂文档的内容。
于是,出现了one-hot编码。
one-hot编码就是把我们处理的文本用二进制进行表示,每个字的维度是字典的大小。
拿个例子来说吧:
我们的字典是:自然语言处理
由于该字典有6个字,所以字典的维度为6.
自:[1 0 0 0 0 0]
然:[0 1 0 0 0 0]
语:[0 0 1 0 0 0]
言:[0 0 0 1 0 0]
处:[0 0 0 0 1 0]
理:[0 0 0 0 0 1]
从以上例子可以看出,表示每个字的矩阵中,只有一个1,其余都是0.
以上的例子的字典仅仅包含6个字,但是现实生活中字典的大小要远大于这个数字,维度要远大于6维。维度大带来的是计算的问题。
为了解决这个问题,word2vec就诞生了。
和one-hot的功能相同,Word2vec也是对词向量进行表示,但是word2vec的表示方法不再是稀疏表示。并且Word2vec的表示方法可以使语义相近的词的距离也较近。
例如:上海、北京、广州等这些城市的距离较近,这是one-hot表示远远做不到的,也是Word2vec表示的强大优点所在。
Word2vec模型有两种模式:CBOW和Skip-gram。
CBOW是根据上下文预测目标词,Skip-gram是根据目标词预测上下文。
Word2vec也是神经网络,该神经网络的输入为one-hot编码,输出为预测的上下文或者中心词。刚才说到,我们的Word2vec是用来对词进行表示啊,我们词向量的表示就是隐层输出或者出入到隐层的权重。