词向量简介

简介

自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在 NLP 领域中,如何量化词的表达也是关键问题之一。用某个固定维度的向量(vector)去表示词是一个很经典很基本的任务,我们称这个向量为「词向量」,通常也被认为是词的特征向量。我们之所以要把单词变成向量是因为我们需要把自然语言抽象成数学中的某个概念(这里是向量)。换一种更具体直白的说法,之所以要把单词变成固定维度的向量,是因为绝大多数的机器学习(Machine Learning)模型需要固定维度的向量作为输入。近年来,「词向量」已逐渐成为自然语言处理的基础知识,一份高质量的「词向量」是很多任务取得更好表现的关键。常见的方式有以下两种:

  1. 独热编码(One-Hot Encoding)
  2. 词嵌入(Word Embedding)

独热编码(One-Hot Encoding)

独热编码即 One-Hot 编码,又称一位有效编码,直观来说就是使用 N 位状态寄存器对 N 个状态进行编码,每个状态都有其独立的寄存器位,并且在任意时候有且只有一位有效,即只有一个值为 1,其他值全为 0 的一种码制。在机器学习的任务中,对于离散型的分类型的数据,需要对其进行数字化,比如说「性别」这一属性,只能有「男性」、「女性」或者「其他」这三种值,如何对这三个值进行数字化表达呢?一种简单的方式就是「男性」为 0,「女性」为 1,「其他」为 2。使用上面简单的方式对分类值进行数字化后,进行模型训练时可能会产生一个问题:特征因为数字值的不同影响模型的训练效果,在模型训练的过程中不同的值使得同一特征在样本中的权重可能发生变化。假如直接编码成 100,是不是比编码成 1 对模型的的影响更大?为了解决上述的问题,使训练过程中不受到因为分类值数字化的问题对模型产生的负面影响,引入独热码对分类型的特征进行独热码编码。

NLP 任务中,假设词典中不同词的数量为 N,每个词的 index 都与 0N-1 的连续整数一一对应。假设一个词的下标为 i,为了得到该词的 One-Hot 向量表示,我们创建一个全 0 的长为 N的向量,并将其第 i位置成 1One-Hot 编码使用了高维稀疏向量表示词,这样的特征可以反映词出现的频率,但这并不是最好的选择。一个主要的原因是,One-Hot 词向量无法表达不同词之间的关系,例如「相似度」这一度量关系。任何一对词的 One-Hot 向量的余弦相似度都为 0

那究竟用什么向量去表示词才是合理的呢?一个符合直觉的想法是,相似的词应该有相似的「词向量」,比如 dogcat 这两个词,他们的意思很相近,那么他们的「词向量」也应该很相似,或者说他们的「词向量」在空间中位置很接近,距离很短。再比如 dogrocket 这两个词,他们的「词向量」在空间中位置应该距离比较远。我们应该怎样做才能使得相似的词有相似的「词向量」呢?

词嵌入(Word Embedding)

目前大多数人所述的「词向量」,其实指的就是「词嵌入」。与 One-Hot 编码相比而言,「词嵌入」技术将词汇的上下文关系嵌入到一个低维空间。举一个简单的例子,在字典用我们会用几千个常用词去解释每个词的意思,而「词向量」中,我们用(比如) 100 维的实数向量去表示字典中的词。换一种说法,我们要把字典中每一个词映射到某个维度(比如 100 维)的空间当中去,所以我们也可以把「词向量」叫做「空间向量模型」(Vector Space Model)。「词嵌入」模型几乎都利用了语言学中这样的一个规律:相似的词有着相似的上下文。这个规律叫 Distributional Hypothesis。原理基本都是词的上下文的分布可以揭示这个词的语义,就好比“看看你跟什么样的人交往,就知道你是什么样的人”,所以「词向量」模型的核心就是对上下文的关系进行建模。还是以 dogcat 两个词为例,他们是比较相似的单词,他们在语料中的上下文也很相近。他们的上下文中一般都会出现关于动物、宠物的单词或短语。所以,目前主流的「词向量」模型表面上千差万别,但是本质都很相似,都是对词与其上下文的关系进行建模,从而得到高质量的「词向量」。目前比较有代表性的工具有 word2vecGloVefastText 等。

词类比(Word Analogy)

上面已经提到,「词向量」会把相似的词映射到空间中相近的位置中去。所以我们可以用「词向量」找到和某个词相近的词。除此之外,「词向量」还有另一个比较优美的性质,「词类比」(Word Analogy)。在词类比任务中,我们需要通过前三个单词,例如 AthensGreeceBaghdad,推导出第四个单词 Iraq。推导的过程就是「雅典」和「希腊」是首都的关系,「巴格达」和谁是首都的关系?答案是「伊拉克」。要做好这个任务,就要求我们还需要从「词向量」中得到词之间关系的信息,比如在上述例子中,这个关系就是「首都」。当年 word2vec 出现以后受到大家广泛关注,一个可能的原因就是大家惊讶于「词向量」能在 Word Analogy数据集上取得这么好的效果,原来「词向量」还有这样神奇的性质。

那「词向量」为何有能力做好 Word Analogy 这个任务呢?在 word2vec 中用 vec('wife') + vec('king') - vec('queen') 去寻找 husband 这个词,这种加加减减的操作看似没有什么道理,这里先给一个例子帮助大家直观的理解。我们以 kingqueen 这两个词为例。假设语料中 king 周围出现的词主要和「皇室」这个主题以及「男性」这个主题有关。queen 周围出现的词主要和「皇室」这个主题和「女性」这个主题有关。我们令 vec('皇室')为所有有关「皇室」主题的词的「词向量」的平均,vec('男性')vec('女性') 分别为所有有关「男性」和「女性」主题的词的「词向量」的平均。我们在上面内容中提到过,词的语义能通过它在语料中的上下文中的信息体现出来。我们这里就认为 vec('king') = 1/2(vec('皇室') + vec('男性'))vec('queen') = 1/2(vec('皇室') + vec('女性'))。所以 vec('king') - vec('queen') 就等于 1/2(vec('男性')-vec('女性'))。同理,对于 husbandwife 这两个词,husband 周围的词是关于「伴侣」和「男性」的主题,wife 周围的词是关于
「伴侣」和「女性」的主题。vec('husband') - vec('wife') 同样等于 1/2(vec('男性')- vec('女性'))。这样 vec('husband') - vec('wife') 就等于 vec('king') - vec('queen'),我们就能轻易的通过三个词,去推断出第四个词。而 vec('king') - vec('queen') 也很好的反映了「男性」与「女性」这样一个关系。

总结

在之后的「词向量」系列博文中,我会全面细致的解析包括 word2vecGloVefastText 等一系列「词向量」工具包。通过上面提到的工具包,我们可以得到高质量的「词向量」,也可以根据我们的需求,得到不同性质的「词向量」。

-------------本文结束感谢您的阅读-------------
坚持整理学习笔记,您的支持将鼓励我继续整理下去!