word2vec如何得到单词vector?
首先,理论概述:
1.向量这个词是什么?如果要把自然语言理解的问题转化为机器学习的问题,第一步必须要找到一种方法把这些符号数学化。NLP中最直观最常用的单词表示方法是一键表示法,将每个单词表示为一个长向量。这个向量的维数是词汇量,其中大部分元素都是0,只有一个维数的值是1,表示当前单词。
举个栗子:
“麦克风”是指[0001000000000...]
“迈克”是指[00000001000000...]
每个字都是0的汪洋大海中的一个1。如果以稀疏的方式存储这种独热表示,它将非常简洁:也就是说,为每个单词分配一个数字ID。比如刚才的例子,麦克风记为3,麦克风记为8(假设从0开始)。如果要用编程实现,用哈希表给每个字分配一个数字就够了。这样简洁的表示方法,结合最大熵、SVM、CRF等算法,成功完成了NLP领域的各种主流任务。当然,这种表征还有一个重要的问题,那就是“词汇鸿沟”现象:任意两个词都是孤立的。从这两个向量中,我们看不出这两个词是否有关联,即使是像麦克风和麦克这样的同义词也不能幸免。深度学习常用的向量这个词,不就是刚才说的用法吗?一键表示表示一个很长的单词向量,但是使用?分布式表示(这个不知道怎么翻译,因为还有一个低维的实向量用“分布式表示”来表示(类似于LDA中带topic的词向量的表示方法)。这个向量一般是这样的:【0.792,?0.177, ?0.107, 0.109, ?0.542, ...]。维度是什么?50?维度100比较常见。
2.词向量的由来是什么?分布式表征最早是由Hinton在1986的论文《学习概念的分布式表征》中提出的。这篇文章虽然没有说文字要分布式表征,但至少这种先进的思想在当时的人们心中种下了一把火,2000年以后才开始越来越被重视。
3.词向量的训练:要介绍词向量是如何训练的,就不得不提到语言模型。我目前学到的所有训练方法都是训练语言模型,顺便得到单词向量。这也很好理解。从一篇没有标记的自然文本中学习东西,无非就是统计词频,统计词的出现次数,统计词的搭配。从自然文本中统计并建立语言模型无疑是最准确的任务(不排除将来有人会创造出更好更有用的方法)。既然建立语言模型的任务如此艰巨,必然需要对语言进行更详细的统计和分析,以及更好的模型和更多的数据来支持。目前最好的词向量都来源于此,所以不难理解。在单词向量的训练中有三个经典的工作,C & ampW 2008、M & ampH 2008、米科洛夫2010 .当然,在说这些作品之前,我得介绍一下本吉奥在这个系列中的经典作品。
4.词向量的评价:一般来说,词向量的评价可以分为两种方式。第一种方式是将词向量整合到现有系统中,看系统性能的提升;二是直接从语言学角度分析词向量,如相似度、语义偏离度等。