精华内容
下载资源
问答
  • 什么是词向量?(NPL入门)

    万次阅读 多人点赞 2018-06-14 21:09:47
    什么是词向量? 我们组实训选择的主题是与自然语言识别相关的,那么就不得不学习和了解一下自然语言识别中非常重要和基础的。于是我对于自己对向量的学习进行了以下的总结。 简而言之,向量技术是将转化...

    什么是词向量?

    我们组实训选择的主题是与自然语言识别相关的,那么就不得不学习和了解一下自然语言识别中非常重要和基础的。于是我对于自己对词向量的学习进行了以下的总结。

    简而言之,词向量技术是将词转化成为稠密向量,并且对于相似的词,其对应的词向量也相近。

    一、词的表示

    在自然语言处理任务中,首先需要考虑词如何在计算机中表示。通常,有两种表示方式:one-hot representation和distribution representation。

    1.1离散表示(one-hot representation)

    传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号
    被称作one-hot representation。one-hot representation把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词。
    例如:
    苹果 [0,0,0,1,0,0,0,0,0,……]
    one-hot representation相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。另外,one-hot representation将会导致特征空间非常大,但也带来一个好处,就是在高维空间中,很多应用任务线性可分。

    1.2分布式表示(distribution representation)

    word embedding指的是将词转化成一种分布式表示,又称词向量。分布
    式表示将词表示成一个定长的连续的稠密向量。

    分布式表示优点:
    (1)词之间存在相似关系:
    是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助。
    (2)包含更多信息:
    词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能。

    二、如何生成词向量

    本小节来简单介绍词向量的生成技术。生成词向量的方法有很多,这些方法都依照一个思想:任一词的含义可以用它的周边词来表示。生成词向量的方式可分为:基于统计的方法和基于语言模型(language model)的方法。

    2.1 基于统计方法

    2.1.1 共现矩阵

    通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前word的vector。具体来说,我们通过从大量的语料文本中构建一个共现矩阵来定义word representation。
    例如,有语料如下:
    I like deep learning.
    I like NLP.
    I enjoy flying.
    则其共现矩阵如下:

    这里写图片描述

    矩阵定义的词向量在一定程度上缓解了one-hot向量相似度为0的问题,但没有解决数据稀疏性和维度灾难的问题。

    2.1.2 SVD(奇异值分解)

    既然基于co-occurrence矩阵得到的离散词向量存在着高维和稀疏性的问
    题,一个自然而然的解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。
    对2.1.1中矩阵,进行SVD分解,得到矩阵正交矩阵U,对U进行归一化得到矩阵如下:

    这里写图片描述

    SVD得到了word的稠密(dense)矩阵,该矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映word间的线性关系。这里写图片描述

    2.2语言模型(language model)

    语言模型生成词向量是通过训练神经网络语言模型NNLM(neural network language model),词向量做为语言模型的附带产出。NNLM背后的基本思想是对出现在上下文环境里的词进行预测,这种对上下文环境的预测本质上也是一种对共现统计特征的学习。
    较著名的采用neural network language model生成词向量的方法有:Skip-gram、CBOW、LBL、NNLM、C&W、GloVe等。接下来,以目前使用最广泛CBOW模型为例,来介绍如何采用语言模型生成词向量。

    2.2.1 CBOW(Continuous Bag-of-Word)

    生成word的distribution representation的模型有很多,生成的向量效
    果差距不大(生成向量的效果更取决于良好的训练数据)。本节以CBOW模型中的层次化的softmax为例,介绍如何采用神经网络生成词向量。
    CBOW模型是预测上下文已知的情况下,当前词出现的概率。上下文的选取采用窗口方式,即只将当前词窗口范围内的词作为上下文。中心词概率公式如下:
    P(wt|wt-k,wt-(k-1)…,wt-1,wt+1,wt+2…,wt+k)= P(wt|context) 这里写图片描述

    CBOW模型去掉了最耗时的隐层,从输入层到隐层的操作是对上下文词向量进行求和(word2vec代码对以上下文词向量的加权平均来表示context)。
    从隐层到输出层则利用上下文词向量和做为输入,输出的是窗口中心位置所有词出现的概率。利用softmax求中心词概率,公式表示如下:
    p(w_t│context)=e^(-g(w_t,context))/(∑_(v∈V)▒e^(-g(v,context)) )
    其中,context表示上下文词向量和,V表示词表,wt表示中心词,g表示能量函数。由上式可看出,分母计算比较密集,时间复杂度O|V|。由上式可以看出,分母的计算复杂度与词表规模相关,当语料较大时,计算变的非常耗时。解决这一问题是对词进行多分类/聚类,例如,5000词的语料,聚成100类,则时间复杂度由5000缩减至50。

    CBOW采用了一种Hierarchical softmax技术,利用哈夫曼树对词表进行分类,用一连串的二分类来近似多分类。这里写图片描述

    加入哈夫曼树后,中心词的概率可表示入下:
    p(w_t│context)=∏(i=1)^k▒〖p(d_i |q_i,context)〗=∏(i=1)^k▒〖σ(v_context^T*q_i)〗
    其中,v_context^T为窗口内词的词向量的加权平均,q_i为结点i的结点向量,σ(*)为神经网络激活函数。从公式中可以看出,中心词的概率是从根节点到词所在的叶节点所走过路径概率的乘积。
    对中心词概率做极大似然估计,可得到模型的损失函数。损失函数如下:
    Loss=-Likelihood=-(1-code[j])log σ(v_context^T*q_i )-code[j]log⁡(1- σ(v_context^T*q_i ))
    code[j]为结点j的哈夫曼编码。有了损失函数,就可以通过梯度下降法求得词向量。注意,损失函数中有2个带求参数,分别为〖词向量(v〗_context^T)和结点向量〖(q〗_i)。
    可以看出,CBOW模型是一个语言模型。在训练好后,语言模型的参数v_context^T作为副产出,得到词向量。

    三.词向量的训练

    本节将分享我使用词向量的一些经验。

    3.1词向量效果的影响因素

    (1)增加词向量的维度能够增加词向量效果。
    (2)在同一领域语料下,语料越多越好,增加不相关领域语料将会降低词向量效果。
    (3)大的上下文窗口学到的词向量更反映主题信息,而小的上下文窗口学到的词向量更反映词的功能和上下文语义信息。
    (4)语料的纯度越高(杂质少),词向量效果越好。因此,在利用语料训练词向量时,进行预处理能够提高词向量的效果。

    3.2词向量的歧义问题

    例如,词”苹果”可以指代水果也可以指代苹果手机。在对“苹果”
    进行训练时,将会对其对应的词向量向两个方向拉伸,进而造成词向量歧义。
    词向量的歧义将会对词向量的应用效果产生影响。例如,对苹果进行序列标注,指代手机的苹果应打上品牌词标签,而指代水果的苹果对应打上产品词标签。对同一个词打上多种不同的标签而采用同一个词向量,将降低词性标注的效果。
    通常解决这一问题是对词向量进行聚类,以多个向量来表示同一个词。
    例如,在RNNs分词项目时,发现字向量的歧义问题将影响分词效果。因此,我按品类对字进行了聚类,得到的聚类效果如下: 这里写图片描述

    左边是颜色中红色的红,可以看出它与其它颜色的距离较近。右边是手
    机品类红米手机的“红”,可以看到它最相似的词是“小”字,因为在京东的商品title里,手机品类中红米手机和小米手机出现的次数较多,进而使得“红”字和“小”字的语境相似。

    3.3 词向量其它

    还可以利用NNLM方法,将我们感兴趣的其它实体生成向量。例如,我曾利用word2vec将每个sku(商品id)embedding成向量。我们将每个用户某个月购买的母婴类商品按序进行排列做为一条训练样本,例如:

    其中,第一列user_id +’#’+用户婴儿年龄。其余列为用户购买的sku集合,并且购买的sku按购买时间顺序排列。
    我们将训练样本输入到word2vec中进行训练,得到每个sku的向量表示。通过这种训练样本的构建方式,使用户在相同年龄段(婴儿)购买的商品相似。例如,在我们的向量中,如下两个商品相似:

    我们利用sku向量做为特征,训练模型预测用户年龄,准确率达90%。

    四.总结

    深度学习模型具有比传统模型更强的特征抽取能力。在自然语言处理中,传统统计特征包含的信息量过少,这也一直限制着深度学习在自然语言处理中的应用。词向量由于包含了更丰富的信息,使得深度学习能够处理绝大多数自然语言处理应用。
    词向量虽然为深度学习在自然语言处理领域带来了希望,但目前词向量仍有许多不完善的地方,例如:
    虽然知道词向量比统计特征包含更多信息,但并不知道词向量包含了哪些
    信息(如每维特征代表的意义)。
    词向量的训练采用无监督方式,不能很好的利用先验信息。
    词向量是神经网络语言模型的副产物,其损失函数不是由具体应用构建。
    因此,不是词向量训练的越好,应用效果就越好。

    随着词向量研究的深入,这些问题都将会得到解决。深度学习在自然语言
    处理领域的前景将会更加光明。

    展开全文
  • word2vec是如何得到词向量的

    千次阅读 2018-02-09 15:40:44
    转载知乎上分析挺好的一篇文章:https://www.zhihu.com/question/44832436作者:crystalajj链接:...word2vec是如何得到词向量的?这个问题比较大。从头开始讲的话,首...

    转载知乎上分析挺好的一篇文章:https://www.zhihu.com/question/44832436


    作者:crystalajj
    链接:https://www.zhihu.com/question/44832436/answer/266068967
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    word2vec是如何得到词向量的?这个问题比较大。从头开始讲的话,首先有了文本语料库,你需要对语料库进行预处理,这个处理流程与你的语料库种类以及个人目的有关,比如,如果是英文语料库你可能需要大小写转换检查拼写错误等操作,如果是中文日语语料库你需要增加分词处理。这个过程其他的答案已经梳理过了不再赘述。得到你想要的processed corpus之后,将他们的one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)就ok了。不得不说word2vec是个很棒的工具,目前有两种训练模型(CBOW和Skip-gram),两种加速算法(Negative Sample与Hierarchical Softmax)。本答旨在阐述word2vec如何将corpus的one-hot向量(模型的输入)转换成低维词向量(模型的中间产物,更具体来说是输入权重矩阵),真真切切感受到向量的变化,不涉及加速算法。如果读者有要求有空再补上。

    1 Word2Vec两种模型的大致印象

    刚才也提到了,Word2Vec包含了两种词训练模型:CBOW模型和Skip-gram模型。

    CBOW模型根据 中心词W(t)周围的词来预测中心词
    Skip-gram模型则根据 中心词W(t)来预测周围词

    抛开两个模型的优缺点不说,它们的结构仅仅是输入层和输出层不同。请看:

    <img src="https://pic2.zhimg.com/50/v2-2a319bac1bb7fcae2f4395d2c38674ea_hd.jpg" data-size="normal" data-rawwidth="421" data-rawheight="414" class="origin_image zh-lightbox-thumb" width="421" data-original="https://pic2.zhimg.com/v2-2a319bac1bb7fcae2f4395d2c38674ea_r.jpg"> CBOW模型<img src="https://pic3.zhimg.com/50/v2-a54db7c984e6eaf9f06cf21178238fc6_hd.jpg" data-size="normal" data-rawwidth="462" data-rawheight="427" class="origin_image zh-lightbox-thumb" width="462" data-original="https://pic3.zhimg.com/v2-a54db7c984e6eaf9f06cf21178238fc6_r.jpg"> Skip-gram模型

    这两张结构图其实是被简化了的,读者只需要对两个模型的区别有个大致的判断和认知就ok了。接下来我们具体分析一下CBOW模型的构造,以及词向量是如何产生的。理解了CBOW模型,Skip-gram模型也就不在话下啦。

    2 CBOW模型的理解

    其实数学基础及英文好的同学可以参照斯坦福大学Deep Learning for NLP课堂笔记

    当然,懒省事儿的童鞋们就跟随我的脚步慢慢来吧。

    先来看着这个结构图,用自然语言描述一下CBOW模型的流程:

    <img src="https://pic2.zhimg.com/50/v2-0f439e1bb44c71c8e694cc65cb509263_hd.jpg" data-size="normal" data-rawwidth="313" data-rawheight="471" class="content_image" width="313"> CBOW模型结构图

    NOTE:花括号内{}为解释内容.

    1. 输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
    2. 所有onehot分别乘以共享的输入权重矩阵W. {V*N矩阵,N为自己设定的数,初始化权重矩阵W}
    3. 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1*N.
    4. 乘以输出权重矩阵W' {N*V}
    5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
    6. 与true label的onehot做比较,误差越小越好
    所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是 矩阵W自身),也就是说, 任何一个单词的onehot乘以这个矩阵都将得到自己的词向量(1*N维)。有了look up table就可以免去训练过程直接查表得到单词的词向量了。
    其实看到这里就基本清楚了。

    这回就能解释题主的疑问了!如果还是觉得我木有说明白,别着急!跟我来随着栗子走一趟CBOW模型的流程!

    3 CBOW模型流程举例

    假设我们现在的Corpus是这一个简单的只有四个单词的document:
    {I drink coffee everyday}
    我们选coffee作为中心词,window size设为2
    也就是说,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是coffee。
    <img src="https://pic4.zhimg.com/50/v2-3e75211b3b675f17a232f29fae0982bc_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1429" data-rawheight="736" class="origin_image zh-lightbox-thumb" width="1429" data-original="https://pic4.zhimg.com/v2-3e75211b3b675f17a232f29fae0982bc_r.jpg"> <img src="https://pic4.zhimg.com/50/v2-abd3c7d6bc76c01266e8ddd32acfe31a_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1514" data-rawheight="844" class="origin_image zh-lightbox-thumb" width="1514" data-original="https://pic4.zhimg.com/v2-abd3c7d6bc76c01266e8ddd32acfe31a_r.jpg"> <img src="https://pic1.zhimg.com/50/v2-66655880a87789eaba5dd6f5c5033e94_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1305" data-rawheight="755" class="origin_image zh-lightbox-thumb" width="1305" data-original="https://pic1.zhimg.com/v2-66655880a87789eaba5dd6f5c5033e94_r.jpg"> <img src="https://pic2.zhimg.com/50/v2-5325f4a5d1fbacefd93ccb138b706a69_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1304" data-rawheight="798" class="origin_image zh-lightbox-thumb" width="1304" data-original="https://pic2.zhimg.com/v2-5325f4a5d1fbacefd93ccb138b706a69_r.jpg"> <img src="https://pic4.zhimg.com/50/v2-1713450fa2a0f37c8cbcce4ffef04baa_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1319" data-rawheight="736" class="origin_image zh-lightbox-thumb" width="1319" data-original="https://pic4.zhimg.com/v2-1713450fa2a0f37c8cbcce4ffef04baa_r.jpg">

    假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。

    如有疑问欢迎提问。


    展开全文
  • 基于中文对话文本使用Word2Vec进行训练得到向量
  • 下面将围绕什么是词嵌入、三种嵌入的主要算法展开讲解,并通过案例具体讲解如何利用嵌入进行文本的情感分析。 什么是词嵌入? 嵌入实际上是一类技术,单个在预定义的向量空间中被表示为实数向量,每个单词...

    词嵌入(word embedding)是一种词的类型表示,具有相似意义的词具有相似的表示,是将词汇映射到实数向量的方法总称。词嵌入是自然语言处理的重要突破之一。下面将围绕什么是词嵌入、三种词嵌入的主要算法展开讲解,并通过案例具体讲解如何利用词嵌入进行文本的情感分析。

    什么是词嵌入?

    词嵌入实际上是一类技术,单个词在预定义的向量空间中被表示为实数向量,每个单词都映射到一个向量。举个例子,比如在一个文本中包含“猫”“狗”“爱情”等若干单词,而这若干单词映射到向量空间中,“猫”对应的向量为(0.1 0.2 0.3),“狗”对应的向量为(0.2 0.2 0.4),“爱情”对应的映射为(-0.4 -0.5 -0.2)(本数据仅为示意)。像这种将文本X{x12345……xn12345……yn },这个映射的过程就叫做词嵌入。

    之所以希望把每个单词都变成一个向量,目的还是为了方便计算,比如“猫”,“狗”,“爱情”三个词。对于我们人而言,我们可以知道“猫”和“狗”表示的都是动物,而“爱情”是表示的一种情感,但是对于机器而言,这三个词都是用0,1表示成二进制的字符串而已,无法对其进行计算。而通过词嵌入这种方式将单词转变为词向量,机器便可对单词进行计算,通过计算不同词向量之间夹角余弦值cosine而得出单词之间的相似性。

    此外,词嵌入还可以做类比,比如:v(“国王”)-v(“男人”)+v(“女人”)≈v(“女王”),v(“中国”)+v(“首都”)≈v(“北京”),当然还可以进行算法推理。有了这些运算,机器也可以像人一样“理解”词汇的意思了。

    词嵌入主要算法

    那么如何进行词嵌入呢?目前主要有三种算法:

    Embedding Layer

    由于缺乏更好的名称,Embedding Layer是与特定自然语言处理上的神经网络模型联合学习的单词嵌入。该嵌入方法将清理好的文本中的单词进行one hot编码(热编码),向量空间的大小或维度被指定为模型的一部分,例如50、100或300维。向量以小的随机数进行初始化。Embedding Layer用于神经网络的前端,并采用反向传播算法进行监督。

    被编码过的词映射成词向量,如果使用多层感知器模型MLP,则在将词向量输入到模型之前被级联。如果使用循环神经网络RNN,则可以将每个单词作为序列中的一个输入。

    这种学习嵌入层的方法需要大量的培训数据,可能很慢,但是可以学习训练出既针对特定文本数据又针对NLP的嵌入模型。

    Word2Vec(Word to Vector)/ Doc2Vec(Document to Vector)

    Word2Vec是由Tomas Mikolov 等人在《Efficient Estimation of Word Representation in Vector Space》一文中提出,是一种用于有效学习从文本语料库嵌入的独立词语的统计方法。其核心思想就是基于上下文,先用向量代表各个词,然后通过一个预测目标函数学习这些向量的参数。Word2Vec 的网络主体是一种单隐层前馈神经网络,网络的输入和输出均为词向量,其主要训练的是图中的红圈部分。

     

    该算法给出了两种训练模型,CBOW (Continuous Bag-of-Words Model) 和 Skip-gram (Continuous Skip-gram Model)。CBOW将一个词所在的上下文中的词作为输入,而那个词本身作为输出,也就是说,看到一个上下文,希望大概能猜出这个词和它的意思。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型;而Skip-gram它的做法是,将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词,2-gram比较常用。

    通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。给定xx预测xxx的模型的输入都是词的向量,然后通过中间各种深度学习DL的CNN或RNN模型预测下一个词的概率。通过优化目标函数,最后得到这些词汇向量的值。Word2Vec虽然取得了很好的效果,但模型上仍然存在明显的缺陷,比如没有考虑词序,再比如没有考虑全局的统计信息。

    Doc2Vec与Word2Vec的CBOW模型类似,也是基于上下文训练词向量,不同的是,Word2Vec只是简单地将一个单词转换为一个向量,而Doc2Vec不仅可以做到这一点,还可以将一个句子或是一个段落中的所有单词汇成一个向量,为了做到这一点,它只是将一个句子标签视为一个特殊的词,并且在这个特殊的词上做了一些处理,因此,这个特殊的词是一个句子的标签。如图所示,词向量作为矩阵W中的列被捕获,而段落向量作为矩阵D中的列被捕获。

     

     

    GloVe(Global Vectors for Word Representation)

    GloVe是Pennington等人开发的用于有效学习词向量的算法,结合了LSA矩阵分解技术的全局统计与word2vec中的基于局部语境学习。

    LSA全称Latent semantic analysis,中文意思是隐含语义分析,LSA算是主体模型topic model的一种,对于LSA的直观认识就是文章里有词语,而词语是由不同的主题生成的,比如一篇文章包含词语:计算机,另一篇文章包含词语:电脑,在一般的向量空间来看,这两篇文章不相关,但是在LSA看来,这两个词属于同一个主题,所以两篇文章也是相关的。该模型不依赖本地上下文,是对全局字词同现矩阵的非零项进行训练,其中列出了给定语料库中单词在彼此间共同出现的频率。

    从本质上说,GloVe是具有加权最小二乘法目标的对数双线性模型。字词共现概率的比率又编码成某种形式的潜在可能意义。例如,以下是基于60亿词汇语料库的各种关于冰和蒸汽的词的共现概率:

     

    如上表所示,“ice(冰)”与“solid(固体)”共现的可能性比“gas(气体)”大,“steam(蒸汽)”与“gas(气体)”共现的可能性比“solid(固体)”大,从而很轻易地可以区别出二者区别。而“ice(冰)”和“steam(蒸汽)”都与“water(水)”的共现概率较大,都与“fashion(时尚)”共现概率很小,因此无法区别“ice”和“steam”。只有在可能性的比率中(图表第三行),才会将像“water”和“fashion”这样的非区别性词汇(non-discriminative)的噪音相抵消,可能性比率越大(远大于1)的词与“ice”特性相关联,可能性比率越小(远小于1)则与“steam”的特性相关联。以这种方式,可能性比率编码了许多粗略形式的意义,这些意义与热力学相位的抽象概念相关联。

    GloVe的训练目标是学习词向量,使得它们的点积等于“共现概率”的对数,由于比率的对数等于对数差,这个目标将共现概率的比率与词向量空间中的向量相关联,由于这些比率可以编码某种形式的意义,所以该信息也被编码为向量差异。所以所得到的词向量在单词类比任务上执行的很好。

    词嵌入应用案例

    当您在自然语言处理项目中使用词嵌入时,您可以选择自主学习词嵌入,当然这需要大量的数百万或数十亿文本数据,以确保有用的嵌入被学习。您也可以选择采用开源的预先训练好的词嵌入模型,研究人员通常会免费提供预先训练的词嵌入,例如word2vec和GloVe词嵌入都可以免费下载。

    下面我们具体来看一下如何在KNIME中利用词嵌入进行情感分析,整体流程如下图所示:

     

    首先,我们从IMDb网站上获取关于《Girlfight》这部影片的2000条评论,储存为.CSV格式的文件,利用File Reader这个节点把文本读入。

     

     

    然后我们要将文件中的字符串转化成文档,把文件中除了文档的列都过滤掉,在结构图中是Document Creation这个节点,这是一个节点合集,点开包含三个子节点:

    接下来是进行文本的词向量训练,我们预设置词向量维度为200维,并通过上文所介绍的Doc2Vec算法将2000条评论文本转换成2000个向量数值,获得如下图所示的2000个词向量:

     

    另一方面,在进行词向量训练的同时导入预先设定的情感分类标签:

     

    然后,在Joiner节点处,带有”POS”或”NEG”标签的情感词典与训练好的2000条词向量进行匹配,使得2000条词向量分别贴上”POS”或”NEG”标签,这样就获得了2000条词向量的标签数据,以便后面训练情感分析模型。

     

     

     

    接下来,由于200维的向量数据量太大,通过主成分分析PCA算法将200维的数据进行降维处理转化为二维向量,以便对其分类效果进行可视化,通过颜色标记,最终2000条评论的情感分析情况如图所示:

     

     

    从图上看,POS和NEG的情感正负标签很明显,分类比较理想。

    然后,我们开始训练模型。先将数据进行分区,训练集和测试集,七三开分为两部分,一部分是训练数据,一部分是检验数据。

     

    训练模型为Random Forest模型,顾名思义,就是用随机的方式建立一个“森林”,“森林”里面有很多的决策树组成,随机森林的每一颗决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一颗决策树分别进行一下判断,看看这个样本该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。最终训练出来的Random Forest模型如下图所示:

     

    最后,通过检测数据的测试,我们得出该模型的精度为95.5%,由此可见拟合的模型较为精确。通过这个案例的练习,我们可以更好的理解词嵌入技术和算法对自然语言处理NLP的新思路,也是深度学习技术的革命性体现。

     

    展开全文
  • 什么是文本的嵌入?

    万次阅读 多人点赞 2018-11-21 11:30:52
     嵌入是单词的一种数值化表示方式,一般情况下会将一个单词映射到一个高维的向量中(向量)来代表这个单词。例如我们将:   ‘机器学习’表示为 [1,2,3]   ‘深度学习‘表示为[2,3,3]   ‘英雄联盟...

    前言

        词嵌入是单词的一种数值化表示方式,一般情况下会将一个单词映射到一个高维的向量中(词向量)来代表这个单词。例如我们将:  

    1.  ‘机器学习’表示为 [1,2,3]   
    2.  深度学习‘表示为[2,3,3]  
    3.  ‘英雄联盟‘表示为[9,1,3]

       对于词向量,我们可以使用余弦相似度在计算机中来判断单词之间的距离: 

    机器学习’与‘深度学习‘的距离:cos(\Theta_1 )=\frac{1*2+2*3+3*3}{\sqrt{1^2+2^2+3^3}\sqrt{2^2+3^2+3^3}}=0.97

    机器学习’与‘英雄联盟‘的距离:cos(\Theta_2 )=\frac{1*9+2*1+3*3}{\sqrt{1^2+2^2+3^3}\sqrt{9^2+1^2+3^3}}=0.56

    通过这篇文章你可以学习到下面内容:

    1. 文本的词嵌入是什么,以及它与其他特征提取方法有什么区别。
    2. 介绍3种主流的从文本数据中学习词嵌入的方法。
    3. 怎么训练新的词嵌入以及如何在日常的NLP任务中使用预先训练好的词嵌入。  

     

    什么是词嵌入?

         词嵌入是一种对文本算法学习后的表示形式,甚至,你可以理解为一个单词在算法中的储存形式。大家知道存入计算机的都是0101的数值化序列,这里也是同理,词嵌入就是将文本数值化以方便拟合算法。这种将单词或者文档数字化表示的方式被认为是深度学习在自然语言处理任务中最具有挑战性的问题之一。

     

    使用密集和低维向量的一个好处是方便计算:大多数神经网络工具包不能很好地处理非常高维,稀疏的向量。......密集表示的主要好处是泛化能力,如果我们认为某些特征可能提供类似的线索,那么提供能够捕获这些相似性的表示是值得的。

     — Page 92, Neural Network Methods in Natural Language Processing, 2017.

           词嵌入实际上是一种将各个单词在预定的向量空间中表示为实值向量的一类技术。每个单词被映射成一个向量(初始随机化),并且这个向量可以通过神经网络的方式来学习更新。因此这项技术基本集中应用与深度学习领域。

         这项技术的关键点在于如何用密集的分布式向量来表示每个单词。这样做的好处在于与one-hot这样的编码对比,使用词嵌入表示的单词向量往往只有几十或者几百个维度。极大的减少了计算和储存量。 

     

    将词汇表中的每个词与分布式词特征向量相关联...特征向量表示词的不同方面特征,每个词与向量空间中的点相关联。特征的数量......远小于词汇的大小

    — A Neural Probabilistic Language Model, 2003.

          这种分布式的词向量表示方式依赖于单词的使用习惯,这就使得具有相似使用方式的单词具有相似的表示形式。这个怎么理解呢?回想我们在看游戏直播,IG获得冠军时候的弹幕,很多主播(无论游戏还是娱乐)的直播间都在发‘IG牛逼’和 ‘77777’,所以我们算法能学习到,‘IG牛逼’和 ‘77777’是向量空间中很相近的2个词。

          虽然看起来有些粗糙,但是这个方法背后有很深的语言学理论支撑。即Zellig Harris的“distributional hypothesis”。这个假设可以归纳为:具有相似语境的词语具有相似的含义。有关更深入的信息,请参阅Harris的1956年论文 “Distributional structure“。

    这种使用语境定义单词的概念可以通过John Firth经常重复的谚语来概括:

     

    You shall know a word by the company it keeps!

    — Page 11, “A synopsis of linguistic theory 1930-1955“, in Studies in Linguistic Analysis 1930-1955, 1962.

    小知识:(链接

    英语中有俗语You shall know a person by the company it keeps.

    而英国语言学家 J. R. Firth在此基础上造出You shall know a word by the company it keeps.的语料库语言学名句。

    类似的说法,在中国古已有之。


    其一:不知其人视其友 出自《孔子家语》(中华书局版,2009:136页)电子版下载
    子曰:"商也好与贤己者处,赐也好说不若己者。不知其子视其父,不知其人视其友,不知其君视其所使,不知其地视其草木。故曰与善人居,如入芝兰之室,久而不闻其香,即与之化矣。与不善人居,如入鲍鱼之肆,久而不闻其臭,亦与之化矣。丹之所藏者赤,漆之所藏者黑,是以君子必慎其所与处者焉。"

    其二:观人于其所友
    李敖引自中国古语,详细出处未考出。也或许为李敖所造。

    词嵌入算法

    词嵌入是从文本语料中学习到的一种将单词表示为预定义大小的实值向量形式。学习过程一般与某个神经网络的模型任务一同进行,比如文档分类。

    下面介绍3中词嵌入技术。

    1.Embedding Layer

           这里并没有专业的名次,使用就称之为Embedding Layer吧。Embedding Layer是特定的自然语言处理任务(例如语言建模或者文档分类)上的与神经网络模型共同学习更新的词嵌入方法。

          使用Embedding Layer通常步骤一般是先预处理语料文本,将每个单词转化成one-hot形式的编码。而此单词对应的词向量其实是算法模型的其中一部分,词向量用预定义的维度来表示,大小我们随机初始化。在这里Embedding Layer其实就是神经网络的input layer,而词向量矩阵即是input layer 到 hidden layer中间的权值矩阵。

    … when the input to a neural network contains symbolic categorical features (e.g. features that take one of k distinct symbols, such as words from a closed vocabulary), it is common to associate each possible feature value (i.e., each word in the vocabulary) with a d-dimensional vector for some d. These vectors are then considered parameters of the model, and are trained jointly with the other parameters.

    — Page 49, Neural Network Methods in Natural Language Processing, 2017.

        牢骚一下: 神经网络本来可解释性就不高,懂了也未必能理解其中参数的意味

        这种将one-hot编码的单词映射到预定维度向量空间的方法,在处理句子时候,如果使用多层感知器模型,那么在作为模型的输入之前,需要将多个单词的向量连接起来(理解成CNN的全连接层吧),如果使用RNN来做的话,就不用这么考虑了,因为RNN本来就是以序列为输入的。

           这种学习嵌入层的方法需要大量的训练数据并且可能很慢,但是确实能学习到针对特定文本数据和NLP任务的词嵌入。

    2. Word2Vec

          Word2Vec是一种能有效从文本语料库中学习到独立词嵌入的统计方法。它是由Tomas Mikolov等人2013年在谷歌开发的一个基于神经网络的词嵌入学习方法,并从那时起,开创了预训练单词嵌入的这种标准。

         这项工作涉及到语义基本的分析和单词向量化的数学探索。举个例子,在wrod2vec词向量空间中,“ 国王 ” -“ 男人 ”=“ 女王 ” -“ 女人”,这就好像算法模型学习到了 国王对于女王的意义就好比男人对于女人的意义。

    We find that these representations are surprisingly good at capturing syntactic and semantic regularities in language, and that each relationship is characterized by a relation-specific vector offset. This allows vector-oriented reasoning based on the offsets between words. For example, the male/female relationship is automatically learned, and with the induced vector representations, “King – Man + Woman” results in a vector very close to “Queen.”

    — Linguistic Regularities in Continuous Space Word Representations, 2013.

    • Continuous Bag-of-Words, or CBOW model.
    • Continuous Skip-Gram Model. 

    关于算法原理参数解释可以参考我之前的文章:【word2vec】算法原理 公式推导

    3. GloVe

    GloVe算法是对于word2vec方法的扩展,更为有效。它由斯坦福大学Pennington等人开发。

    传统经典的词向量空间模型会使用诸如LSA(潜在语义分析)之类的矩阵分解技术来生成单词的词向量表示形式。这种技术在全文检索统计方面做的很好,但是不如word2vec可以捕获单词的语义。

    GloVe是一种将矩阵分解技术(如LSA)的全局统计与word2vec中的基于上下文的学习相结合的方法。GloVe不是使用窗口来定义局部上下文,而是使用整个文本语料库中的统计信息构造显式的单词上下文或单词共现矩阵。这样的词嵌入方法可能会决定学习模型的好坏。

    GloVe, is a new global log-bilinear regression model for the unsupervised learning of word representations that outperforms other models on word analogy, word similarity, and named entity recognition tasks.

    — GloVe: Global Vectors for Word Representation, 2014.

     

    使用词嵌入

    在自然语言处理项目中使用单词嵌入时,你可以选择下面几种方式。

     

    自己学一个词嵌入

    你可以通过你要解决的NLP问题自己学习一个词嵌入方法。当然这需要大量的文本数据来确保你的学习的词嵌入是有用的。例如几百万或者几十亿个单词。

    另外,训练词嵌入的时候,你也有2个选项:

    1. Learn it Standalone,训练模型学习词嵌入,训练好的结果保存下来,作为另一个模型的一部分。之后还可以作为其他任务的词嵌入。
    2. Learn Jointly, 将训练词嵌入作为一个大型任务模型的其中一部分,让训练词嵌入与NLP任务模型一同训练更新。但是这样往往是训练好的词嵌入只能提供给这一个模型使用

     

    使用别人训练好的词嵌入

    研究人员通常可以免费提供经过预先训练的单词嵌入,这样你就可以在自己的学术或商业项目中下载并使用它们。

    比如最近腾讯就开源出了800W的词嵌入向量模型。不过15G的词嵌入文件,真不是一般人玩得起来的。这里提供一个地址:

    https://github.com/cliuxinxin/TX-WORD2VEC-SMALL 这个git主人,对我的学习指导很多,希望大家star一下。

    另外,使用已经训练好的词嵌入的时候,你也有2个选项:

    1. Static,直接套用
    2. Updated,作为初始权值.用自己的数据.更新一下

     

    对于使用训练好的还是自己训练在业内目前应该还没有个标准,使用在实际工作中,你需要做一些不同的尝试来发掘能提升项目能力的一些方法。加油~

     

    参考:

    What Are Word Embeddings for Text?

    by Jason Brownlee on October 11, 2017 in Deep Learning for Natural Language Processing

     

     

     

    展开全文
  • 获取Word2vec训练得到的所有向量

    万次阅读 多人点赞 2019-05-28 13:47:10
    5、最后就是写一个主函数,用于调用cut_txt函数实现分词,调用model_train函数产生向量,并将获得及其对应的向量按字典的格式写入文本文件中,另外还可以实现计算一些之间的相似度以及获取其近义功能。...
  • data文件夹中存储语料(中文语料以及英文语料由老师提供,另一份为中文停用词语料) output文件夹中存储输出的向量文件 script文件夹中为CBOW的脚本,同时处理中文语料与英文语料 运行步骤:在脚本中确定训练中文...
  • 助记什么,有什么用?

    千次阅读 2019-02-04 19:36:34
    助记什么,有什么用?    玩加密货币的朋友相信对助记都不陌生,我们在使用钱包之前,会让你备份12个单词,在备份期间不允许截图操作,并且不断强调这12个单词非常重要,最好用物理方式备份,备份时身边...
  • word2vec是如何得到词向量的?

    千次阅读 2018-03-05 05:06:55
    前言word2vec是如何得到词向量的?这个问题比较大。从头开始讲的话,首先有了文本语料库,你需要对语料库进行预处理,这个处理流程与你的语料库种类以及个人目的有关,比如,如果是英文语料库你可能需要大小写转换...
  • 多个权威汉语词典比较后,得到的读音有争议的词语,就是不同词典标注的读音不一样,有1813个.txt
  • 向量的前世今生。。。
  • 韵律 的概念与分词类似。 韵律短语 包含韵律,一般由韵律和语气组成。 语调短语 包含韵律短语,一般指一个大停顿。 摘要  语句和篇章的韵律结构和信息结构的分析以及其模型化, 是提高 语音合成...
  • word2vec如何得到词向量

    千次阅读 2018-05-08 00:47:34
    前言word2vec是如何得到词向量的?这个问题比较大。从头开始讲的话,首先有了文本语料库,你需要对语料库进行预处理,这个处理流程与你的语料库种类以及个人目的有关,比如,如果是英文语料库你可能需要大小写转换...
  • 使用google的Bert获得中文的向量

    千次阅读 2019-05-06 20:37:20
    使用google的Bert获得中文的向量Bret介绍下载代码和模型 Bret介绍 Bret是Google2018年推出的最新的向量训练工具,在nlp领域各个问题的性能上均有大幅提升,是nlp领域具有变革型的一项工作。已经有大量介绍Bret...
  • 基于哈工大同义词词林的词语间相似度计算 局限:单纯使用同义词词林来计算相似度,如果词典中没有该,就算不出相似度。 代码(在python3.6上正常运行) #!/usr/bin/env python3 # -*- coding: utf-8 -*- #2018...
  • 嵌入

    千次阅读 多人点赞 2019-06-27 11:01:14
    所谓嵌入,通俗来讲,是指将一个词语(word)转换为一个向量 (vector)表示, 所以嵌入有时又被叫作“word2vec"。在CharRNN中,输入序列数据的每一步是一个字母 。 具体来说,先对这些字母使用了独热编码再输入到 ...
  • Word2Vec 怎么将得到向量变成句子向量 1)平均向量: 平均向量就是将句子中所有的word embedding相加取平均,得到的向量就当做最终的sentence embedding。这种方法的缺点是认为句子中的所有对于表达...
  • 关于相似性以及文档特征、特征有太多种说法。弄得好乱,而且没有一个清晰逻辑与归类,包括一些经典书籍里面也分得概念模糊,所以擅自分一分。 ————————————————————————————...
  • 基于统计的方法就是:用一个词语周边其他词语出现的次数来表示每一个词语,此时每个向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些向量组成的矩阵就是共现矩阵 ...
  • 用Bert生成中文的字、向量-附件资源
  • Py交易是什么意思

    千次阅读 2021-03-17 20:40:20
    最近常听见py交易这个,刚开始也一脸懵逼的脑补py的意思?拼音?便宜?朋友?别说一开始没人指导还真不好想到正确答案,今天就给大家... “Py交易”是什么梗据说这个的出处是由于有人在b站持续发垃圾贴,导致...
  • 自然语言处理的基本预处理(分词,停用记载,获得高频词语) -- coding: utf-8 -- #jieba分词示例 #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。 #对文本进行预处理 停用记载 ...
  • 平均向量就是将句子中所有的word embedding相加取平均,得到的向量就当做最终的sentence embedding。这种方法的缺点是认为句子中的所有对于表达句子含义同样重要。 2)TF-IDF加权平均向量: TFIDF加权平均...
  • 原标题:为什么孩子总是会把字母、数字给写反?这里有妙招!孩子的字母总是写反过来,数字总是倒过来!这可着实让一些家长很苦恼。其实美国小孩也不例外,常常把单词写成这样...有些小朋友经常把Up写成了Uq, down写...
  • 主要介绍了python gensim使用word2vec向量处理中文语料的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 最近常听见 py交易 这个,刚开始也一脸懵逼的脑补py的意思?拼音?便宜?朋友?别说一开始没人指导还真不好想到正确答案,今天要给大家说的就是 “py交易”是什么意思 呢? “py交易”是什么梗 ?我要开始学习了,...
  • 前言        ...1、 直接使用它们输出的向量或者叫context vector; 2、 在这些模型后面接一个简单浅层模型进行fine-tuning;      ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 473,269
精华内容 189,307
关键字:

得到了是什么词