原创:王稳钺
资料来源:张春阳
词向量被应用在非常非常多的场景中,甚至可以说跟文字相关的互联网应用基本上都会跟词向量有关系。本文主要从应用、发展以及实战代码来介绍词向量。
1. 词向量的应用
搜索引擎是人们每天都在使用的产品,搜索引擎其实就是利用词向量技术来进行搜索的。搜索引擎是如何工作的呢?其实主要分为三步。第一步,搜索引擎需要爬取互联网上所有的文章,把这些文章全部都转化成词向量。第二步是要将搜索词也转化为词向量。最后一步就是用搜索词的词向量与文章转变成的词向量进行相似度的比较,再把与搜索词相似的文章返回给用户。
第二个应用也非常常见——头条新闻。今日头条之所以能做得像现在这么好,它背后最主要的商业逻辑就是它使用了推荐引擎,给不同的用户分发不同的内容。它是如何实现的呢?首先第一步就是把很多的新闻转换成向量。第二步就是根据用户的行为,比如点击、点赞、评论某个新闻,将用户也转化为向量。第三步与搜索引擎类似,就是将与用户向量相似的文章返回给用户。其实还有很多类似的应用,比如淘宝等电商平台。
2. 从文字到词向量
如何生成词向量呢?词向量是如何发展到现在的呢? 1946计算机诞生了。自从有了计算机之后,其实有很多伟大的先贤们一直在想着一个问题,就是怎么能够让计算机也能像人一样帮助人们去做一些事情,比如识别图像,比如”理解“文字。这里面最伟大的人物就是阿兰图灵,阿兰图灵发表了《计算机器与智能》这篇论文。这篇论文可能很多人都没听说过,但是图灵测试一定不陌生。图灵测试其实就是人工智能的最早的雏形,它的思想就是制作一个机器,让其他人分辨不出来这个机器人是一个真的机器还是一个人。阿兰图灵的很多理论成为了人工智能最早期的思想萌芽。
1950 年,在有了人工智能的想法之后,人们就在思考,人主要有几个功能——文字语言、视觉、思考与决策。这就诞生了所谓的人工智能的三大方向——自然语言处理(NLP)、机器视觉(CV)、商业分析(BI)。 自然语言处理其实就是把人类说的文字表示成计算机也可以理解。但计算机只能处理1、0这些数字信号,所以计算机看不懂人们所写的这些奇奇怪怪的文字,不管是英文、中文或其他文字的。那最早人类是怎么去表示文字的呢?其实人类就用了一种其实到今天为止依然很常用的一种方法——WordNet。这个词可能很多人没听说过,但是它的应用却非常实用——词典。WordNet的想法说能不能使用同义词或者反义词来去解释原单词。其实这个过程会非常的复杂,而且同时也存在一些问题。例如解释丈夫这个词,就需要用很多周边的词来解释,比如先生、老公、英语的话husband等等。但第一个问题是,人类的语言是在不断进化的,经常会出现新的词汇,比如网络上的一些新鲜词汇。那这些新鲜词汇怎么给它放到这个同义词的解释当中呢?这就需要人去做,就需要耗费很大的劳动力。因为并不知道新的网络文化或者网络用语,它会产生在哪里,那做起来就会无从下手。并且还有非常高的延迟性,因为可能需要很长时间理解新的词汇的意思,之后才能将它整理进词表中。另一个问题是这种方式其实就没有办法比较相似的程度是多少,但其实人们想要知道的其实不仅仅是相似不相似,而是到底有多相似或不相似。所以WordNet方法,它天生就有这样的局限性。
后来人们又想到Onehot方法。Onehot方法其实是非常常用的一种方法,就是在今天,深度学习横行,机器学习非常普及的情况下,其实Onehot方法也是依然在用的一种方法。Onehot方法其实就是假设有一个词典,词典里面包含了很多个单词,为了解释起来比较方便,下图中假设词典中只有5个词——小学、中学、大学、硕士和博士。如何去表示这五个单词呢?其实就用一种很简单的方式,小学给它编码为1000,中学为0100,大学0010……五个不同编码码,分别来代表不同的含义。Onehot的本质思想就是用不同的符号去表示不同的词,这种方法其实被称为离散型方法。其实Onehot也有它的问题。首先它无法表示相似词,比如之前提到的老公、丈夫其实都是一个意思,但是Onehot会将它编成两个不同的编码,其实也无法计算相似度。另一个问题是维度爆炸。如果词典中有1万个词,那么表示某一个词就要用长度1万的向量来表示,这对于计算机来说非常浪费存储空间。
为了解决问题,人们又探索了别的方法。首先人们提出了分布式假设,即如果两个词的上下文是相似的,那么这两个词也是相似的。
利用这种想法,表示方法又发生了改变——把一个单词划到一个向量的空间中,就是将它变成一个向量。词义是比较相似的词,就在向量空间中表示到很相近的位置上。下图分别表示了二维和三维空间的表达示例。这种表达方式叫做分布式表达。
那么如何将词投射到向量空间中呢?并且空间可以是任意维度的。第一种方法是NNLM,其实是利用一个神经网络。这个网络很简单,只有三层,输入层、隐藏层和输出层。输入层就是把文本用Onehot表示出来,然后给它塞到Embedding层里面去。第二层就是tanh函数,第三层是softmax层。其实这个网络的目的就是通过上文来预测下文。下面展示一下每一层的细节。
首先输入层就是全链接层,来实现降维的目的。后面会展示代码,只需一行就能实现这样的功能。
隐藏层就只是tanh函数,具体的函数公式以及图像可以见上图。这一层的目的在于增加非线性关系,让模型拥有更强的学习能力。
输出层也非常简单,就是softmax函数。softmax函数能把一个值转化成一个概率的分布,这样就可以得到下文可能出现的词的概率。下面用代码来具体实现。
3. 词向量实战
下图用代码展示了NNLM的实现。
下图的部分展示了如何把一些单词转化为Onehot形式。
词表是一个动态大小的词表,不同的数据就有不同的词表大小。窗口大小是指到底用多少上文去预测一个下文,窗口大小是可以自己决定的,所以这是一个动态的参数。图中就是用了第一个句子的长度减1。特征大小就是想得到的向量是多长的,可以是两维的、三维的、1000维的都是可以的。
这两部分展示了模型的训练和模型的预测。
欢迎大家通过复现代码实现具体的应用,来帮助理解词向量。
网友评论