Word2Vec简明教程:入门、原理及代码实现(上)

简介: Word2Vec简明教程:入门、原理及代码实现

1. 特征向量


近年来,研究者通过词汇学方法,发现约有五种特质可以涵盖人格描述的所有方面,提出了人格的大五模式(Big Five),俗称人格的海洋(OCEAN),包括以下五个维度:


开放性(Openness):具有想象、审美、情感丰富、求异、创造、智能等特质。责任心(Conscientiousness):显示胜任、公正、条理、尽职、成就、自律、谨慎、克制等特点。

外倾性(Extroversion):表现出热情、社交、果断、活跃、冒险、乐观等特质。

宜人性(Agreeableness):具有信任、利他、直率、依从、谦虚、移情等特质。

神经质性(Neuroticism):难以平衡焦虑、敌对、压抑、自我意识、冲动、脆弱等情绪的特质,即不具有保持情绪稳定的能力。

通过NEO-PI-R测试可以得出每个维度的打分(1-100),然后将其缩放到[ − 1 , 1 ]之间:


20200813214056620.png


利用余弦相似度可以计算两个人的性格相似度,如图,向量image.png

20200813214135344.png

image.png


对于n 维向量image.png

image.png

余弦相似度的取值范围在-1到1之间。余弦值越接近1,也就是两个向量越相似,完全相同时数值为1;相反反向时为-1;正交或不相关是为0。

np.linalg.norm 操作是求向量的范式,默认是L2范式,等同于求向量的欧式距离。


import numpy as np
jay = np.array([-0.4,0.8,0.5,-0.2,0.3])
p1  = np.array([-0.3,0.2,0.3,-0.4,0.9])
p2  = np.array([-0.5,0.4,-0.2,0.7,-0.1])
def cos_sim(a, b):
    a_norm = np.linalg.norm(a)
    b_norm = np.linalg.norm(b)
    cos = np.dot(a,b)/(a_norm * b_norm)
    return cos
print(cos_sim(jay,p1),cos_sim(jay,p2))


输出如下:


0.6582337075311759 0.23612240736068565


可见前两者较为相似。


余弦相似度也常用在文本相似度、图片相似度等应用中,比如金融类新以下词出现的频率高:“股票、债券、黄金、期货、基金、上涨、下跌”,而先这些词出现相对较少:“宇宙、太空、星系、恒星、大气层”。每一篇文章也都有相应的特征,由其主题决定,最简单的可以用其TF-IDF值来表示。


2. 词向量


对于每个人可以抽取特征形成一组向量,对于每个词汇同样可以将其转换为一组向量,并计算相互之间的关系。1986年,Hinton在《Learning Distribution Representation of Concepts》中最早提出使用向量来表示词。


对于词典D 中的任意词w ,通过一个固定长度的向量v ( w ) ∈ R m 来表示,则v ( w )就称为w的词向量。


2.1 例1:King- Man + Woman = Queen


如,单词King的词向量(通过维基百科语料训练的Glove向量)如下:


[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 ,

-0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 ,

0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344

, -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]


根据值对单元格进行颜色编码(接近2则为红色,接近0则为白色,接近-2则为蓝色):



20200813214420247.jpg

将“king”与其它单词进行比较:


2020081321443031.jpg


可以看出:


所有这些单词都有一条直的红色列,它们在这个维度上是相似的(名词属性)

“woman”和“girl”在很多地方是相似的,“man”和“boy”也是一样(Gender)

“boy”和“girl”也有彼此相似的地方,但这些地方却与“woman”或“man”不同。(Age)

“king”和“queen”彼此之间相似,但它们与其它单词都不同。(Royalty)

除了最后一个单词“water”,所有单词都是代表人,可以看到蓝色列一直向下并在 “water”的词嵌入之前停下了,显示出类别之间的差异。


词嵌入最经典的例子就是 image.png

20200813214445765.png


2.2 例2:跨语言同义词共现


以下为谷歌Mikolov等人在《Exploiting Similarities among Languages for Machine Translation》提及的一个著名的跨语言同义词共现的案例。该例子通过语义映射技术,实现了机器翻译。通过为两种语言构建不同的语言空间,并在两个空间上建立映射关系。


在向量空间内,不同的语言享有许多共性,只要实现一个向量空间向另一个向量空间的映射和转换,即可实现语言翻译。该技术对英语和西班牙语间的翻译准确率高达90 %


20200815102417603.png


如对于英语和西班牙语,训练得到对应的词向量空间E(nglish)和S(panish)。


从英语中抽取五个词“one,two,three,four,five”,通过PCA降维,得到对应的二维向量

image.png

从西班牙语中抽取对应的五个词“uno,dos,tres,cuatro,cinoco”,通过PCA降维,得到对应的二维向量

image.png

可以看出,5个词在两个向量空间中的相对位置差不多,说明两种不同语言对应向量空间的结构之间具有相似性,进一步说明了在词向量空间中利用距离刻画词与词之间相似度的合理性。

此外,对于句子、文档也可以用句子向量及文档向量来表示。


3. NNLM


为了得到每个词的词向量,需要根据大量语料进行训练。2003年,Bengio等人在《A neural probabilistic language model》提出了用神经网络建立统计语言模型的框架(NNLM,Neural Network Language Model),并首次提出了word embedding的概念(虽然没有叫这个名字),奠定了包括word2vec等后续研究word representation learning的基础。


NNLM模型的基本思想可以概括如下:


  • 假定词表中的每一个word都对应着一个连续的特征向量;
  • 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
  • 同时学习词向量的权重和概率模型里的参数。
    值得注意的一点是,这里的词向量也是要学习的参数。


该论文采用前向反馈神经网络来拟合一个词序列的条件概率image.png如下图所示:


20200813214602486.png


该模型分成两部:


线性的Embedding层:输入为N − 1个one-hot词向量,通过一个共享的D × V 的矩阵C ,映射为N − 1 个分布式的词向量(distributed vector)。其中,V 是词典的大小,D 是Embedding向量的维度(一个先验参数)。C 矩阵里存储了要学习的word vector。


前向反馈神经网络:由一个tanh隐层和一个softmax输出层组成。通过将Embedding层输出的N − 1个词向量映射为一个长度为V 的概率分布向量,从而对词典中的word在输入context下的条件概率做出预估:


image.png

通过最小化cross-entropy的正则化损失函数来调整模型参数:


image.png

模型参数θ包括了Embedding层矩阵C的元素和前向反馈神经网络模型的权重Wt , Wt-1 , . . . , Wt-n+1


该模型同时解决了两个问题:


统计语言模型里关注的条件概率p ( w t ∣ c o n t e x t )的计算

向量空间模型里关注的词向量的表达


这两个问题本质上并不独立。通过引入连续的词向量和平滑的概率模型,可以在一个连续空间里对序列概率进行建模,从根本上缓解数据稀疏性和维度灾难的问题;而且以条件概率p(wt|context)为学习目标去更新词向量的权重,具有更强的导向性,同时也与VSM里的Distributional Hypothesis不谋而合。


缺点:


只能处理定长的序列

训练速度太慢


4. Word2Vec


2013年,Google团队发表了word2vec工具(参见Mikolov等人发表的《Distributed Representations of Sentences and Documents》、《Efficient estimation of word representations in vector space》等论文),通过将所有的词向量化,来定量的度量词与词之间的关系,挖掘词之间的联系。


主要包含


  • 两个模型:skip-gram(跳字模型)和CBow,Continuous Bag of Words(连续词袋模型)
  • 两种高效训练的方法:Negative Sampling(负采样)和Hierarchical Softmax(层次Softmax)
相关文章
|
14天前
|
存储 C语言 C++
【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现
【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现
|
2月前
|
Web App开发 机器学习/深度学习 自然语言处理
Word2Vec简明教程:入门、原理及代码实现
Word2Vec简明教程:入门、原理及代码实现
|
7月前
|
存储 算法 C++
C++初阶之一篇文章让你掌握vector(模拟实现)(上)
模拟实现vector是为了深入理解和学习C++标准库中vector容器的工作原理和实现细节。 vector是C++标准库中最常用的容器之一,它提供了动态数组的功能,并且具有自动扩容和内存管理的特性,使得在使用时非常方便。 模拟实现vector有以下几个优点:
|
11月前
|
Python
Python实现word的基本操作
Python实现word的基本操作
71 0
|
12月前
|
机器学习/深度学习 自然语言处理 算法
Word2Vec原理以及实战详解
Word2Vec原理以及实战详解
|
机器学习/深度学习 算法 搜索推荐
深入浅出理解word2vec模型 (理论与源码分析)
深入浅出理解word2vec模型 (理论与源码分析)
深入浅出理解word2vec模型 (理论与源码分析)
|
自然语言处理 数据可视化 数据处理
基于gensim实现word2vec模型(附案例实战)
基于gensim实现word2vec模型(附案例实战)
611 0
基于gensim实现word2vec模型(附案例实战)
|
机器学习/深度学习 算法框架/工具
5分钟入门GANS:原理解释和keras代码实现
5分钟入门GANS:原理解释和keras代码实现
171 0
5分钟入门GANS:原理解释和keras代码实现
|
机器学习/深度学习 自然语言处理 算法
Word2Vec简明教程:入门、原理及代码实现(下)
Word2Vec简明教程:入门、原理及代码实现
Word2Vec简明教程:入门、原理及代码实现(下)