赞
踩
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值。
我们可以看到通过这种方式构造的词义空间中,相似词义的单词间的距离也会很近。
构建词向量的基本思路:
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。