【深度长文科普】非NLP数据处理――词向量Word Vector

【深度长文科普】非NLP数据处理――词向量Word Vector

大数据应用授权转载

原文作者:Conor McDonald

原文链接:https://medium.com/towards-data-science/word-vectors-for-non-nlp-data-and-research-people-8d689c692353

翻译:刘霄

词向量 (Word Vector) 代表了人们在理解词与词,句与句,文章与文章之间关系的能力上的一大进步。与之前使用传统的表达词的方式相比,这项技术的进步在于机器可以得到更多关于词的信息。有了词向量这项技术,演讲识别和机器翻译才变得可能。在这篇文章中我会尽量用数据来解释词向量的概念,让不太熟悉自然语言处理 (NLP) 的人也能理解词向量的概念。
词向量是什么?

简单来讲,词向量是一个用来表达一个词的意思的向量。这句话可能并不能清楚地表达词向量的概念,我们稍后再详细解释。首先让我们来看看为什么词向量被认为是词的表达技术上的一大进步。

传统的NLP方式,例如One-Hot Representation 和Bag-of-WordsModels (使用dummy variable来表达一个词在观察对象(例如一个句子)中的出现与否),虽然对于某些机器学习任务来说是有用的,但并没有捕获词的意思或语义环境。这就意味着词与词之间潜在的关系,例如内容上的相近,并不能被获知。

例如,One-Hot Representation方法不能获知cat和dog都是动物这种简单的,在很多家养宠物文章中都被提及的关系。这种encoding方式能满足一些NLP任务的基本需求(例如诈欺邮件分类),但是不足以应对更复杂的NLP任务,例如翻译或演讲识别。本质上,传统的NLP处理方式,不能获得词的句法和语义关系,只能用一种非常简单的方式来表示语言。

相对的,词向量使用多维连续浮点数来表示词汇,相近词汇在几何空间中也被映射到相近的位置。简单来讲,词向量是一行有实际值的数字(而不是dummy variable)其中每个点都捕获了词汇一个维度的意思,并且语义相似的词汇词向量也相似。这就意味着,wheel和engine有着和car相似的词向量(因为他们语义中有相似的部分),但是和banana就应该非常不同。换句话说,可用于同一语义的词汇应该被映射到相近的向量空间中(我们会在之后讲到这些向量是如何生成的)。

把单词用向量表示出来的惊人之处在于,我们可以把他们应用于数学运算中。例如我们可以加减向量——下面这个例子表示了我们可以用向量来定义:

king – man + woman = queen

换句话说,我们可以从king这个词的向量中,减去一个意思(maleness),加上另一个意思(femaleness),然后得到一个新的词向量(king – man + woman)映射到最近的词向量queen上。

词向量中的数字表示了这个词在各个维度的权重。简单来讲,每个维度都代表了一个意思,这个维度上的数字权重代表了这个词汇与这个意思的接近程度。这就是词汇的语义被编码成多维的向量的方式。

 
一个词向量的简单示例

在这个图片中,我们假象每个维度都代表了一个清晰定义的意思。例如,你可以想象第一个维度代表animal,每个词汇在这个维度的权重代表了与这个意思或概念的相近度。

这是一个非常简化的词向量版本,因为实际上维度并没有这么清晰定义的语义意思。但这是一个有效且直观的方式来让你明白词向量维度的概念。

我们可以使用Python NLP包spaCy 来快速使用已经训练好的300个维度的词向量。我们创建一串词汇,然后使用spaCy解析,提取每个词汇的向量,把他们放在一起,为了作图展示,我们从向量提取出两个主要维度。

程序GitHub连接:https://gist.github.com/conormm/ca0cdf78fa7a91fdacf500ff4dff0645

在这个程序中,我们简单的提取了一些动物和描述其中某些动物相关的词汇的向量。就像之前提到的,词向量非常的强大,因为他可以通过在多维连续空间中表示词汇让我们识别不同词汇之间的相似程度。下图中,你可以看到“lion”, “tiger”, “cheetah”和“elephant”之间距离非常接近。这大概是因为他们经常被在相似语义环境中提起,例如这些动物都很大,野生,有潜在危险——确实,描述词汇中”wild”和这些动物之间的映射也非常接近。

相似的词汇在向量空间中的映射位置接近。我们可以注意到dog和pet的距离多么接近,elephant, lion, 和tiger几个词多么集中,以及描述性词汇如何被划分才一起。

词向量从何而来?

这是一个非常好的问题,这些维度和权重都是从哪里得来的?有两种通常使用的方法来生成词向量:

1. 词汇的计数/ 同语境共同出现次数

2. 根据词汇预测语境(skip-gram 神经网络模型,例如:word2vec)

两种方法都基于Firth’s 的分布假设(DistributionalHypothesis),其中提到:

“You shall know a word by the company it keeps”

换句话说,出现在相似语义环境中的词倾向于具有语义上的相似性。一个词的语义环境实际上可以表示为它周围的词,词向量(通常)就是通过预测这个词的语义环境来生成的。再换句话说,组成词向量的权重是通过预测其他词语义上与这个词相近的概率得来的。这就像是在填满一个给定词汇周围的空位。例如,输入句子为“The fluffy dog barked as it chased a cat”,单词”dog”和”barked”两个词的Two-Window(焦点词汇之前和之后的两个词)语境会是如下这样的:

在这里我不会过于深入的讲解神经网络embedding词向量的数学细节,一些更有资质的人已经解释过许多了。以下这些文章对我的学习过程有很大帮助:

1.         Deep Learning, NLP, and Representations (http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/)

2.         The amazing power of word vectors (https://blog.acolyer.org/2016/04/21/the-amazing-power-of-word-vectors/)

3.         Word2Vec Tutorial — stop-depression-now.com (http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/)

然而,因为word2vec模型非常流行且用途广泛,讲解一些它的的工作原理会很有帮助。Word2Vec模型简单来讲就是一个有着一层hidden layer的神经网络,通过估算这个词与另一个词“接近”的概率来重新构建这个词的语义环境。

模型是由词库中每个词的词+语义配对训练得来的。

例如:

(dog, the)

(dog, fluffy)

(dog, barked)

(dog, as)

严格来讲这是一个监督学习过程,但是你不需要标记数据——labels来自于组成目标词汇语义环境的词。这样,使用上面提到过的window方法,模型可以学习到目标词汇所使用到的语义词汇。在上面的例子中,模型会学习到fluffy和barked被用于dog一词的语义中(根据window长度定义)。

其中一个吸引人的地方是,由word2vec创建的词向量只是预测过程中的副产物,而不是结果。换句话说,词向量不是预测的目标(语义概率才是被预测的),词向量是被学习到的输入数据的表达,之后被用于预测任务中,如预测给定单词的语义环境。词向量的生成是模型在试图通过学习一个好的对于这个词的数学表达来降低预测的误差的结果。在模型重复循环的过程中,它不断调整神经元的权重来降低预测的误差,进而逐步完善词的数字表达。这样,词的意思就转换成了hidden layer中每个神经元学习到的权重。

Word2vec模型,接受一个单词作为输入数据(用one-hot encoding方式来表达)然后模型试图预测一个从词库中随机选择的词是否在输入单词附近的概率。这就意味着对于每一个输入单词,都有n个输出概率结果,n等于词库中词的数量。巧妙地地方在于,训练过程只包括这个词的语义环境,而不是整个词库。用上面的例子来讲,给模型”dog”这个词作为输入,”barked”会比”cat”得到更高的概率结果,因为它距离”dog”更近。换句话说,模型在试图预测词库中的其它词属于输入单词的语义的概率。用上面的句子作为输入,模型会如下图所示运行:

 

通过这个流程示意图我们可以提取模型神经元学习到的权重。这些权重就是词向量的组成部分。如果你有300个神经元,你会得到词库中每个词的一个300维度的词向量。这个过程的输出结果,是n个输入单词 * n hidden layer中神经元的词向量的映射。

感谢阅读,希望你能从中学到一些新东西噢☺️