在本章中由于篇幅较长,特意将6.2分为上下两部分。
PS: 找到一些资料https://www.zhihu.com/question/32275069
本节会实现用于学习word Embeddings 的模型,Word Embeddings很有力地表示NLP任务的单词。由于在大型的文本语料库上运行的时候,方法变得有效,所以word vector embeddings的话题近期受到欢迎。虽然暂时不使用RNN去完成这个任务,但是会将在后期的任务中依靠这部分。如果您熟悉word2vec这样的词向量和工具的概念,对自己实现它并不感兴趣,可以随时跳到下一节。
为什么要用向量表达单词呢?把单词送入学习系统的最直接的方法(straight-forward way to feed)就是使用one-hot编码(单编码)。也就是说,在一个大小和词汇量一样的向量里面,除了该单词的位置置为1以外,其他的所有元素都是0. 这种方法有两个问题:首先,在实际的应用中,由于自然语言中会有很多不同的单词,所以向量会非常的长。其次,one-hot的表示方法无法提供单词与单词之间的任何语义相关性。
长久以来,共同表达词汇的思想作为语义相关性的一种解决方案已经存在很长时间了。简单的说来就是:运行了大量的文本,对于每个单词计算出距离周围单词的距离,比如说是周围5个单词的距离,然后用附近的单词的标准化计数表示每个单词。然后用附近的单词的标准化计数表示每个单词。这种思想的背后的依据是在相似的上下文中使用的词汇,其语义也是相似的。随后,我们可以通过使用PCA或类似的方法来获得更密集的表示,将发生向量压缩到更少的维度。虽然这种方法表现的效果很好,但是需要跟踪所有的共现(这里),这是我们词汇量的一个方形矩阵。(这句话翻译的不是太准确,贴上原文:While this approach leads to quite good performance, it requires us to keep track of the whole cooccurrence that is a square matrix of the size of our vocabulary.)
在2013年,Mikolov等人相处了一种既切实可行又高效的方式去计算上下文中的单词表达。这篇文章是Mikolov, Tomas, et al. “Efficient estimation of word representations in vector space.” arXiv preprint arXiv:1301.3781 (2013)。文中使用的skip-game model 随机的初始化表达,该模型用一个简单的分类器去预测当前单词上下文单词。通过分类器权重和词表示来传播错误,并调整两者以减少预测误差。目前已经发现在大兴的语料库上训练该模型可以使得表示向量近似于压缩的共发向量。我们现在就来介绍如何在tensorflow上实现skip-gram 模型。