NLP之word2vec:word2vec简介、安装、使用方法之详细攻略

NLP之word2vec:word2vec简介、安装、使用方法之详细攻略


word2vec简介

word distributed embedding最早是Bengio 03年的论文"A Neural Probabilistic Language Model"提出来,rnn lm 在10年被mikolov提出。      
      word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量(word vector)的工具包,它简单、高效。word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量Dense Vector。所谓的word vector,就是指将单词向量化,将某个单词用特定的向量来表示。将单词转化成对应的向量以后,就可以将其应用于各种机器学习的算法中去。一般来讲,词向量主要有两种形式,分别是稀疏向量和密集向量。
     word2vec的思想类似于antodecoder,但是并不是将自身作为训练目标,也不是用RBM来训练。 word2vec将 context和word5:别作为训练目标,Wskip-gram和CBOW。

word2vec其实就是two layer shallow neural network,减少了深度神经网络的复杂性,快速的生成word embedding.    
Skip-gram: works well with small amount of the training data, represents well even rare words or phrases. 
CBOW: several times faster to train than the skip-gram, slightly better accuracy for the frequent words  
     This can get even a bit more complicated if you consider that there are two different ways how to train the models: the normalized hierarchical softmax, and the un-normalized negative sampling. Both work quite differently.

1、稀疏向量One-Hot Encoder

在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。就是用一个很长的向量来表示一个词,向量的长度为词典的大小N,向量的分量只有一个1,其他全为0,1的位置对应该词在词典中的索引[1]。
      举例来说,如果有一个词典[“比特币”,”区块链”,”机器学习”],那么“比特币”对应的词向量就是[1,0,0],“区块链”对应的词向量就是[0,1,0]。这种表示方法不需要繁琐的计算,简单易得,但是缺点也不少,比如长度过长(这会引发维数灾难),以及无法体现出近义词之间的关系,比如“比特币”和“区块链”显然有非常紧密的关系,但转化成向量[1,0,0]和[0,1,0]以后,就看不出两者有什么关系了,因为这两个向量相互正交。

但是使用One-Hot Encoder有以下问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。以及无法体现出近义词之间的关系。

使用Vector Representations可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。

2、密集向量distributed representation

又称distributed representation,即分布式表示。最早由Hinton提出,可以克服one-hot representation的上述缺点,基本思路是通过训练将每个词映射成一个固定长度的短向量,所有这些向量就构成一个词向量空间,每一个向量可视为该空间上的一个点[1]。此时向量长度可以自由选择,与词典规模无关。这是非常大的优势。
      还是用之前的例子[“比特币”,”区块链”,”机器学习”],经过训练后,“比特币”对应的向量可能是[1,0,1,1,0],而“区块链”对应的可能是[1,0,1,0,0],而“机器学习”对应的可能是[0,1,0,0,1]。这样“比特币”向量乘“区块链”=2,而“比特币”向量乘“机器学习”=0 。这样就体现出比特币与区块链之间的关系更加紧密,而与机器学习就没什么关系了。这种表示方式更精准的表现出近义词之间的关系,比之稀疏向量优势很明显。

word2vec模型其实就是简单化的神经网络。word2vec做的事情很简单,大致来说,就是构建了一个多层神经网络,然后在给定文本中获取对应的输入和输出,在训练过程中不断修正神经网络中的参数,最后得到词向量。

3、word2vec的两大语言模型

所谓的语言模型,就是指对自然语言进行假设和建模,使得能够用计算机能够理解的方式来表达自然语言。word2vec采用的是n元语法模型(n-gram model),即假设一个词只与周围n个词有关,而与文本中的其他词无关。这种模型构建简单直接,当然也有后续的各种平滑方法。

CBOW模型和skip-gram模型
     word2vec主要分为CBOW(Continuous Bag of Words)和Skip-Gram两种模式。CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
其实这两个模型非常相似,核心部分代码甚至是可以共用的。CBOW模型能够根据输入周围n-1个词来预测出这个词本身,而skip-gram模型能够根据词本身来预测周围有哪些词。也就是说,CBOW模型的输入是某个词A周围的n个单词的词向量之和,输出是词A本身的词向量;而skip-gram模型的输入是词A本身,输出是词A周围的n个单词的词向量(对的,要循环n遍)。

word2vec安装

pip install word2vec

word2vec使用方法

(1) 分词 / 词干提取和词形还原。 
(2) 构造词典,统计词频。
(3) 构造树形结构。
(4)生成节点所在的二进制码。
(5) 初始化各非叶节点的中间向量和叶节点中的词向量。
(6) 训练中间向量和词向量。

1、examples

import word2vec

model = word2vec.load('/Users/drodriguez/Downloads/vectors.bin')

model.vectors.shape

model['_*1']

indexes, metrics = model.cosine('_*1')

model.generate_response(indexes, metrics).tolist()
(0)

相关推荐