自然语言处理Word2Vec

前言

Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它被大量地用在自然语言处理(NLP)中,通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去。
Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从直观上理解,Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。二者的示意图如下所示:
在这里插入图片描述

独热表示

在介绍word2vec模型前,我们需要先引入一个概念:独热表示。因为神经网络的输入不可能是一串字符,必须是可计算的数值,我们需要将对数值抽象的文本语料中的每个词转化为数值,这就用到了独热表示。
独热表示(一种表示词的离散方式):
1)利每一个词对应一个向量
2)该向量只有一个值为1其余值都为0
3)值为1的词对应的下标为该词在词典中的位置
例 S = {家乡, 秋天, 很, 美,浪漫 } S为词典
则五个对应词的表示为:
哈尔滨 = [1, 0, 0, 0, 0],冬天 = [0, 1, 0, 0, 0],很 = [0, 0, 1, 0, 0],美 = [0, 0, 0, 1, 0],浪漫 = [0, 0, 0, 0, 1]

**独热表示的优点:**解决了分类器不好处理离散数据的问题
**独热表示的缺点:**不考虑顺序,假设词间相互独立, 得到的特征是稀疏的

但是独热表示产生的数据十分稀疏,并且无法十分有效的表示词义的相似性,我们希望找到一个能够表示词义相似性的稠密表示方法,这里就需要引入分布式的思维。

分布式表示

在分布式思想中,我们并不使用词本身来表示一个词,而是利用他的上下文表示(一定的窗口大小),由此,每一个词向量的维度也由词典的整体大小转变为一个固定的大小(这个值可以自己设定,例如,300),由此产生的矩阵也会由稀疏变为稠密。(注:在分布式表达的词向量有时也被称为词嵌入(word embeddings))
如下图所示,我们用banking周围的单词来表示banking这个词(采用这种方法可以表达出词义和相似度信息)。
在这里插入图片描述

接下来我们看看分布式思维构建词向量的具体方法:
首先选择一个窗口来提取上下文的“相关词汇”窗口的要求为在input word左侧和右侧连续的m的词
设一个序列为 W1…Wc-m…Wc-1 Wc Wc+1… Wc+m…Wn (其中Wc表示central word也就是input word)设定窗口大小为m,那我们取到的词为{Wc-m…Wc-1 Wc+1… Wc+m}
如下图所示,“中”设为input word 窗口大小为2,那么取到的上下文词汇有{我,是,国,人} 得到的训练数据为(中,我)(中,是)(中,国)(中,人)
在这里插入图片描述
若此时,设定的词向量维度为五,每一维分别是:我、是、中、国、人 那么“中”作为中心词的向量表示为[1, 1, 0, 1, 1],在这里填充的也不一定是1,可以为TF-IDF值。

我们可以看到通过这种方式构造的词义空间中,相似词义的单词间的距离也会很近。
在这里插入图片描述

Word2vec

基本思路

构建词向量的基本思路:
1.一个很大的语料库
2.固定词汇表中的每个单词都用向量表示通过文本中的每个位置,
3.其中有一个中心词c和上下文(“外部”)词
4.使用c和o的向量相似度来计算P(o|c)
5.不断调整单词向量来最大化这个概率

给定一个中间词c 计算上下文词的概率(这个其实是skip-gram),并使其最大化
在这里插入图片描述
关注:如何改变词向量,使得目标值最大化

目标函数

对于一个序列的每个位置,在给定中心词的情况下,预测固定大小m窗口内的上下文词

似然值计算(将所有条件概率相乘):

在这里插入图片描述

为了学习这个模型,我们需要一个目标函数(损失函数) 对数(乘积->加法)

在这里插入图片描述

为了得到最小化(损失函数)在前面加入一个负号,通过最小化损失函数,来最大化预测的准确 性

那么如何去计算P(Wt+1|Wt)呢?
我们使用两种向量
1.Vw表示当w是中心词时的向量
1.Uw表示当w为上下文词时的向量
计算公式(c为中心词,o为上下文词 ):

在这里插入图片描述

1.利用点积计算相似度(点积越大,相似度越高)

2.分母为归一化因子,所有概率和为1

3.避免负概率,取exp()

注:这里用到的其实是softmax函数:在这里插入图片描述

max:最相似的单词同时出现的概率变得最大。

soft:概率并不为1,所有的可能性都有一定的概率,只不过是大小不同

注意:softmax是根据一组输入,进行缩放,返回的是一个分布(并非一个最大值)

训练模型

对每个词都有两个向量(作为中心词一次,作为上下文一次),每个向量的维度d确定,所以下图矩阵的大小为2dv

在这里插入图片描述

我们采用梯度下降法进行参数优化,通过不断的迭代最终达到最小值。
在这里插入图片描述

实战练习

import numpy as np

# Get the interactive Tools for Matplotlib
%matplotlib notebook
import matplotlib.pyplot as plt
plt.style.use('ggplot')

from sklearn.decomposition import PCA

from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec

glove_file = datapath('/Users/manning/Corpora/GloVe/glove.6B.100d.txt')
word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")
glove2word2vec(glove_file, word2vec_glove_file)
model = KeyedVectors.load_word2vec_format(word2vec_glove_file)
model.most_similar('obama')
model.most_similar('banana')
model.most_similar(negative='banana')
result = model.most_similar(positive=['woman', 'king'], negative=['man'])
print("{}: {:.4f}".format(*result[0]))
def analogy(x1, x2, y1):
    result = model.most_similar(positive=[y1, x2], negative=[x1])
    return result[0][0]
analogy('japan', 'japanese', 'australia')
analogy('australia', 'beer', 'france')
analogy('obama', 'clinton', 'reagan')
analogy('tall', 'tallest', 'long')
analogy('good', 'fantastic', 'bad')
print(model.doesnt_match("breakfast cereal dinner lunch".split()))
def display_pca_scatterplot(model, words=None, sample=0):
    if words == None:
        if sample > 0:
            words = np.random.choice(list(model.vocab.keys()), sample)
        else:
            words = [ word for word in model.vocab ]
        
    word_vectors = np.array([model[w] for w in words])

    twodim = PCA().fit_transform(word_vectors)[:,:2]
    
    plt.figure(figsize=(6,6))
    plt.scatter(twodim[:,0], twodim[:,1], edgecolors='k', c='r')
    for word, (x,y) in zip(words, twodim):
        plt.text(x+0.05, y+0.05, word)
display_pca_scatterplot(model, 
                        ['coffee', 'tea', 'beer', 'wine', 'brandy', 'rum', 'champagne', 'water',
                         'spaghetti', 'borscht', 'hamburger', 'pizza', 'falafel', 'sushi', 'meatballs',
                         'dog', 'horse', 'cat', 'monkey', 'parrot', 'koala', 'lizard',
                         'frog', 'toad', 'monkey', 'ape', 'kangaroo', 'wombat', 'wolf',
                         'france', 'germany', 'hungary', 'luxembourg', 'australia', 'fiji', 'china',
                         'homework', 'assignment', 'problem', 'exam', 'test', 'class',
                         'school', 'college', 'university', 'institute'])
display_pca_scatterplot(model, sample=300)

代码和数据下载地址

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值