精华内容
下载资源
问答
  • 2017-04-04 20:48:33

    DeepNLP的表示学习·

    词嵌入来龙去脉·

    深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)


    原创作品, 转载请注明出处:[ Mr.Scofield  http://blog.csdn.net/scotfield_msn/article/details/69075227  ]

    From RxNLP.


    Indexing:

    〇、序
    一、DeepNLP的核心关键:语言表示(Representation)
    二、NLP词的表示方法类型

            1、词的独热表示one-hot representation
            2、词的分布式表示distributed representation
    三、NLP语言模型
    四、词的分布式表示

            1. 基于矩阵的分布表示
            2. 基于聚类的分布表示
            3. 基于神经网络的分布表示,词嵌入( word embedding)
    五、词嵌入( word embedding)
            1、概念
            2、理解
    六、神经网络语言模型与word2vec
            1、神经网络语言模型
            2.word2vec与CBOW、Skip-gram
            3.个人对word embedding的理解
    七、后言
    References



    〇、序
            之前一段时间,在结合深度学习做NLP的时候一直有思考一些问题,其中有一个问题算是最核心一个:究竟深度网络是怎么做到让各种NLP任务解决地如何完美呢?到底我的数据在NN中发什么了什么呢?


            并且,不少的terms like: 词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系?


            出于对知识结构追求完整梳理的强迫症的老毛病,于是不停地查资料、思考、keep revolving……


            然后就感觉有一点小进展了。想到,不如将个人对其的理解,无论对错,先拿出来跟peer分享下,或许能交换出更有意义的东西呢?


            整篇文章的构架是按照属于概念在逻辑上的先后大小顺序,一层一层一级一级地往下剖析、比较、说明。

            
            另外说明下,here整篇文字内容相对是比较入门,甚至有的点可能描述的不太客观正确,限于当前的认知水平……还请您海涵,希望您在评论中指正!




    一、DeepNLP的核心关键:语言表示(Representation)
            最近有一个新名词:Deep Learning + NLP =  DeepNLP。当常规的机器学习Machine Learning升级发展到了一定的阶段后,慢慢的被后起的深度学习Deep Learning夺势而去,并如火如荼地引领了一波新高潮,因为Deep Learning有machinelearning过而不及之处!那当Deep Learning进入NLP领域,自然是要横扫ACL一批paper才是。事实也是这样的。


            先提下数据特征表示问题。数据表示是机器学习的核心问题,在过去的Machine Learning阶段,大量兴起特征工程,人工设计大量的特征解决数据的有效表示问题。而到了Deep Learning,想都别想,end-2-end,一步到位,hyper-parameter自动帮你选择寻找关键的特征参数。


            那么,Deep Learning如何能在NLP中发挥出应有的real power呢?很明显,先不提如何设计出很强势的网络结构,不提如何在NLP中引入基于NN的解决例如情感分析、实体识别、机器翻译、文本生成这些高级任务,咱们首先得把语言表示这一关过了——如何让语言表示成为NN能够处理的数据类型。


            我们看看图像和语音是怎么表示数据的:

     
            在语音中,用音频频谱序列向量所构成的matrix作为前端输入喂给NN进行处理,good;在图像中,用图片的像素构成的matrix展平成vector后组成的vector序列喂给NN进行处理,good;那在自然语言处理中呢?噢你可能知道或者不知道,将每一个词用一个向量表示出来!想法是挺简单的,对,事实上就是这么简单,然而真有这么简单吗?可能没这么简单。


            有人提到,图像、语音属于比较自然地低级数据表示形式,在图像和语音领域,最基本的数据是信号数据,我们可以通过一些距离度量,判断信号是否相似,在判断两幅图片是否相似时,只需通过观察图片本身就能给出回答。而语言作为人类在进化了几百万年所产生的一种高层的抽象的思维信息表达的工具,其具有高度抽象的特征,文本是符号数据,两个词只要字面不同,就难以刻画它们之间的联系,即使是“麦克风”和“话筒”这样的同义词,从字面上也难以看出这两者意思相同(语义鸿沟现象),可能并不是简单地一加一那么简单就能表示出来,而判断两个词是否相似时,还需要更多的背景知识才能做出回答。


            那么据上是不是可以自信地下一个结论呢:如何有效地表示出语言句子是决定NN能发挥出强大拟合计算能力的关键前提!




    二、NLP词的表示方法类型
            接下来将按照上面的思路,引出各种词的表示方法。按照现今目前的发展,词的表示分为独热表示one-hot、分布式表示distributed。


    1、词的独热表示one-hot representation
            NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。关于one-hot编码的资料很多,街货,这里简单举个栗子说明:


                    “话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
                    “麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]

            每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。


            现在我们分析他的不当处。1、向量的维度会随着句子的词的数量类型增大而增大;2、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。


    2、词的分布式表示distributed representation

            传统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的分布假说( distributional hypothesis)为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957 年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定( a word is characterized by thecompany it keeps)。


            到目前为止,基于分布假说的词表示方法,根据建模的不同,主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。尽管这些不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系。





    三、NLP语言模型
            在详细介绍词的分布式表示之前,需要将NLP中的一个关键概念描述清楚:语言模型。语言模型包括文法语言模型和统计语言模型。一般我们指的是统计语言模型。之所以要将语言模型摆在词表示方法之前,是因为后面的表示方法马上要用到这一概念。


            统计语言模型: 统计语言模型把语言(词的序列)看作一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性。给定一个词汇集合 V,对于一个由 V 中的词构成的序列S = ⟨w1, · · · , wT ⟩ ∈ Vn,统计语言模型赋予这个序列一个概率P(S),来衡量S 符合自然语言的语法和语义规则的置信度。


            用一句简单的话说,就语言模型就是计算一个句子的概率大小的这种模型。有什么意义呢?一个句子的打分概率越高,越说明他是更合乎人说出来的自然句子。


            就是这么简单。常见的统计语言模型有N元文法模型(N-gram Model),最常见的是unigram model、bigram model、trigram model等等。形式化讲,统计语言模型的作用是为一个长度为 m 的字符串确定一个概率分布 P(w1; w2; :::; wm),表示其存在的可能性,其中 w1 到 wm 依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:

     
            同时通过这些方法均也可以保留住一定的词序信息,这样就能把一个词的上下文信息capture住。


            具体的语言模型详情属于街货,详细请自行搜索。





    四、词的分布式表示
    1. 基于矩阵的分布表示
            基于矩阵的分布表示通常又称为分布语义模型,在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。


            常见到的Global Vector 模型( GloVe模型)是一种对“词-词”矩阵进行分解从而得到词表示的方法,属于基于矩阵的分布表示。


    2. 基于聚类的分布表示
            基于聚类的分布表示我也还不是太清楚,所以就不做具体描述。


    3. 基于神经网络的分布表示,词嵌入( word embedding)
            基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。这正是我们的主角today。


            神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的 n-gram 作为上下文,当 n 增加时, n-gram 的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示 n-gram 时,可以通过一些组合方式对 n 个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。





    五、词嵌入( word embedding)
    1、概念
            基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。


            前面提到过,为了选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系,我们需要在词向量中capture到一个词的上下文信息。同时,上面我们恰巧提到了统计语言模型正好具有捕捉上下文信息的能力。那么构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。从历史上看,早期的词向量只是神经网络语言模型的副产品。


            2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。所以请注意一点:词向量可以认为是神经网络训练语言模型的副产品


    2、理解
            前面提过,one-hot表示法具有维度过大的缺点,那么现在将vector做一些改进:1、将vector每一个元素由整形改为浮点型,变为整个实数范围的表示;2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。如图示:

     
            这也是词向量又名词嵌入的缘由了。





    六、神经网络语言模型与word2vec
            好了,到目前为止我们已经对的分布式表示以及词嵌入的概念的层级关系有了个理性的认识了,那这跟word2vec有什么联系?


    1、神经网络语言模型
            上面说,通过神经网络训练语言模型可以得到词向量,那么,究竟有哪些类型的神经网络语言模型呢?个人所知,大致有这么些个:


    a) Neural Network Language Model ,NNLM
    b) Log-Bilinear Language Model, LBL
    c) Recurrent Neural Network based Language Model,RNNLM
    d) Collobert 和 Weston 在2008 年提出的 C&W 模型
    e) Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型


            到这,估计有人看到了两个熟悉的term:CBOW、skip-gram,有看过word2vec的同学应该对此有所了解。我们继续。


    2.word2vec与CBOW、Skip-gram

            现在我们正式引出最火热的另一个term:word2vec。


            上面提到的5个神经网络语言模型,只是个在逻辑概念上的东西,那么具体我们得通过设计将其实现出来,而实现CBOW( Continuous Bagof-Words)和 Skip-gram 语言模型的工具正是well-known word2vec!另外,C&W 模型的实现工具是SENNA。


            所以说,分布式词向量并不是word2vec的作者发明的,他只是提出了一种更快更好的方式来训练语言模型罢了。分别是:连续词袋模型Continous Bag of Words Model(CBOW)和Skip-Gram Model,这两种都是可以训练出词向量的方法,再具体代码操作中可以只选择其一,不过据论文说CBOW要更快一些。


            顺便说说这两个语言模型。统计语言模型statistical language model就是给你几个词,在这几个词出现的前提下来计算某个词出现的(事后)概率。CBOW也是统计语言模型的一种,顾名思义就是根据某个词前面的C个词或者前后C个连续的词,来计算某个词出现的概率。Skip-Gram Model相反,是根据某个词,然后分别计算它前后出现某几个词的各个概率。


            以“我爱北京天安门”这句话为例。假设我们现在关注的词是“爱”,C=2时它的上下文分别是“我”,“北京天安门”。CBOW模型就是把“我” “北京天安门” 的one hot表示方式作为输入,也就是C个1xV的向量,分别跟同一个VxN的大小的系数矩阵W1相乘得到C个1xN的隐藏层hidden layer,然后C个取平均所以只算一个隐藏层。这个过程也被称为线性激活函数(这也算激活函数?分明就是没有激活函数了)。然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟ground truth也就是“爱”的one hot形式做比较计算loss。这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”那个位置的元素肯定要算在loss里面,word2vec就用基于huffman编码的Hierarchical softmax筛选掉了一部分不可能的词,然后又用nagetive samping再去掉了一些负样本的词所以时间复杂度就从O(V)变成了O(logV)。Skip gram训练过程类似,只不过输入输出刚好相反。


            补充下,Word embedding的训练方法大致可以分为两类:一类是无监督或弱监督的预训练;一类是端对端(end to end)的有监督训练。无监督或弱监督的预训练以word2vec和auto-encoder为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的embedding向量。不过因为缺少了任务导向,可能和我们要解决的问题还有一定的距离。因此,我们往往会在得到预训练的embedding向量后,用少量人工标注的样本去fine-tune整个模型。


            相比之下,端对端的有监督模型在最近几年里越来越受到人们的关注。与无监督模型相比,端对端的模型在结构上往往更加复杂。同时,也因为有着明确的任务导向,端对端模型学习到的embedding向量也往往更加准确。例如,通过一个embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。


    3.个人对word embedding的理解
            现在,词向量既能够降低维度,又能够capture到当前词在本句子中上下文的信息(表现为前后距离关系),那么我们对其用来表示语言句子词语作为NN的输入是非常自信与满意的。


            另外一点很实用的建议,在你做某一项具体的NLP任务时如你要用到词向量,那么我建议你:要么1、选择使用别人训练好的词向量,注意,得使用相同语料内容领域的词向量;要么2、自己训练自己的词向量。我建议是前者,因为……坑太多了。





    七、后言
            说到这里,其实我并没有想继续说下去的打算了,即并没有打算将word2vec的数学原理、详解啥的统统来一顿讲了,因为我发现网上关于讲解word2vec的文章实在是太多了,多到几乎所有的文章都是一样的。所以我也没有必要再copy一份过来咯。


            所以,要详细了解word2vec、cbow、skip-gram细节的请您仔细搜索。我相信,在了解了这一系列的前提上下文知识的背景下,你再去读word2vec相关的细节文章时,一定不会感到有多吃力。


            另外这也反映出来了一个更大的问题,即网络文章缺少critical思维的原创性。


            网上随便一搜“word2vec”、“词向量”,然后一大堆的关于word2vec、cbow、skip-gram数学公式的讲解,并且还都是千篇一律的东西……但最让人无法理解的是,基本上没有人去详细地提一提这些东西他的出现他的存在的上下文、他的发展的过程、他在整个相关技术框架的所处位置等等。这让我很郁闷……


            其实顺便分享下,在我个人的方法论思维中,一个带有完整上下文以及结构构建良好的知识框架,在某种程度上,比一些细枝末节的详细知识点来的重要的多了!因为,一旦构建了一个完备的知识结构框架,那么剩下你要做的是将一些零零碎碎的细节进行填补而已;而反过来却根本不行,知识堆砌只会让你思维混乱,走不了多远。


            所以here我也呼吁各位blogger,大家能充分发挥自己的能动性,主动去创造一些没有的东西,分享一些独有的思维见解,也算是对中国网络blog以及CS事业的推动贡献啊!I mean,即便是copy别人的原来的东西,也最好是咀嚼咀嚼,消化后加上自己的东西再share啊!








    References:
    《How to Generate a Good Word Embedding?》,Siwei Lai, Kang Liu, Liheng Xu, Jun Zhao
    《基于神经网络的词和文档语义向量表示方法研究》,来斯惟
    《面向自然语言处理的分布式表示学习》,邱锡鹏
    《Deep Learning 实战之 word2vec》

    http://www.cnblogs.com/iloveai/p/word2vec.html
    http://www.hankcs.com/nlp/word2vec.html
    http://licstar.net/archives/328
    https://zhuanlan.zhihu.com/p/22477976
    http://blog.csdn.net/itplus/article/details/37969519
    http://www.tuicool.com/articles/fmuyamf
    http://licstar.net/archives/620#comment-1542
    http://blog.csdn.net/ycheng_sjtu/article/details/48520293









    更多相关内容
  • 在cips2016出来之前,笔者也总结过种类繁多,类似向量的内容,自然语言处理︱简述四大类文本分析中的“向量”(文本特征提取)事实证明,笔者当时所写的基本跟CIPS2016一章中总结的类似,当然由于入门较晚没有...

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一章中总结的类似,当然由于入门较晚没有CIPS2016里面说法权威,于是把CIPS2016中的内容,做一个摘录。

    CIPS2016 中文信息处理报告《第五章 语言表示与深度学习研究进展、现状及趋势》第三节 技术方法和研究现状中有一些关于语言表示模型划分的内容P33-P35,其中:
    这里写图片描述
    语言表示方法大体上可以从两个维度进行区分。一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、词、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号,而将语言表示为连续空间中的一个点,包括分布式表示和分散式表示。

    CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebos.com/cips2016.pdf
    .
    .


    一、离散表示

    1、词向量

    • 一个词可以表示为One-Hot 向量(一维为1 其余维为0
      的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,这和事实不符。
    • 一种改进的方法是基于聚类的词表示。其中一个经典的方法是Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。

    2、句向量

    有了词的表示之后,我们可以进一步得到句子或篇章的表示。句子或篇章的离散表示通常采用词袋模型、N 元模型等。
    .
    .
    .


    二、连续表示——分布式表示

    这样就可以通过共现矩阵的方式来进行词的表示,这类方法也叫分布式表示(Distributional Representations)

    1、词向量

    潜在语义分析模型(Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)、随机索引(random indexing)等。

    2、句向量

    句子的表示方式对应于共现矩阵,另一列,在LDA中句子-词语矩阵中就是很好地句子表示方式。
    .
    .
    .


    ★三、连续表示——分散式表示

    另一种连续表示是分散式表示(Distributed Representations),即将语言表示为稠密、低维、连续的向量

    1、词向量

    研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。

    2、句向量

    句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性的方法有四种。

    • (1)神经词袋模型

    简单对文本序列中每个词嵌入进行平均/加总,作为整个序列的表示。
    这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。

    • (2)递归神经网络(Recursive Neural Network)

    按照一个给定的外部拓扑结构(比如成分句法树),不断递归得到整个序列的表示。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。

    • (3)循环神经网络(Recurrent Neural Network)

    将文本序列看作时间序列,不断更新,最后得到整个序列的表示。

    • (4)卷积神经网络(Convolutional Neural Network)

    通过多个卷积层和子采样层,最终得到一个固定长度的向量。

    在上述四种基本方法的基础上,很多研究者综合这些方法的优点,结合具体的任务,已经提出了一些更复杂的组合模型,例如双向循环神经网络(Bi-directional Recurrent Neural Network)、长短时记忆模型(Long-Short Term Memory)等。
    同时根据上面的内容,句向量的表征在RNN、CNN之间,到底哪个更好呢? 有一篇文章在这点上讲得比较清楚,会在下面的延伸三:《NLP 模型到底选 RNN 还是 CNN?》提到。

    3、篇章表示

    如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法,先得到句子编码,然后以句子编码为输入,进一步得到篇章的表示。具体的层次化可以采用以下几种方法:

    • (1)层次化的卷积神经网络

    即用卷积神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。

    • (2)层次化的循环神经网络

    即用循环神经网络对每个句子进行建模,然后再用一个循环神经网络建模以句子为单位的序列,得到篇章表示。

    • (3)混合模型

    先用循环神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。
    .
    .
    .


    四、总结

    基于深度学习的方法在自然语言处理中取得了很大的进展,因此,分散式表示也成为语言表示中最热门的方法,不但可以在特定的任务中端到端地学习字、词、句子、篇章的分散式表示,也可以通过大规模未标注文本自动学习。
    分散式表示可以非常方便地应用在下游的各种自然语言处理任务上,并且可以端到端地学习,给研究者带来了很大的便利。但是分散式表示对以下几种情况还不能很好地处理,需要进一步解决。

    1. 语言中出现所有符号是否都需要使用统一的表示模型?比如,无意义的符号、变量、数字等。
    2. 新词以及低频词的表示学习方法。目前的表示学习方法很难对这些词进行很好的建模,而这些词都是极具信息量的,不能简单忽略。
    3. 篇章的语言表示。目前对篇章级别的文本进行建模方法比较简单,不足以表示篇章中的复杂语义。
    4. 语言表示的基础数据结构。除了目前的基于向量的数据结构之外是否有更好的表示结构,比如矩阵、队列、栈等。
      .
      .

    延伸一:句向量的表示方式

    参考blog:Sentence Embedding/Nishant Nikhil

    在实际应用方面,可以参考google在2014发表的内容,对实际应用非常有帮助:Distributed Representations of Sentences and Documents

    该博客较多是对分散表示词向量进行一定的总结与归纳。

    1、词向量简单相加/平均(类似神经词袋模型)

    对词向量的相加/平均,但是譬如以下的两句话质心是一致的:

    You are going there to teach not play.
    You are going there to play not teach

    这样的方式,再来求句子距离,其实是在求句子的质心距离(centroid distance)。
    另外一种改良版本,用Word Movers’ Distance

    这里写图片描述

    相近词之间求距离,然后把这样的相近距离相加。

    参考paper1:From Word Embeddings To Document Distances
    参考paper2:Using Centroids of Word Embeddings and Word Mover’s Distance for Biomedical Document Retrieval in Question Answering
    .
    .

    2、深度学习方面

    以上的方法并没有关照到句子的序列信息。
    1、CNN
    用CNN来句子表示(paper:Convolutional Neural Networks for Sentence Classification),操作流程是:
    padding句子让其长度一致 -> 使用词表示技术成为方阵 -> 使用CNN -> 使用Max-overtime pooling -> 全连接层 -> 获得句向量。

    2、GRU
    Dynamic Memory Networks for Visual and Textual Question Answering
    通过GRU进行编码,生成上下文向量+更新记忆。
    当然还有用双向GRUs(Efficient Summarization With Read-Again And Copy Mechanism
    .
    .

    3、fasttext表示

    可见NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
    .
    .

    延伸二:句向量表达:Sentence 2 vec

    跟眼神一中词向量简单相加减类似,是通过PCA/SVD的加权得到了句向量,同时作者在实验过程中,发现这一表征方式,可以跟LSTM表征的效果媲美。
    这里写图片描述

    github地址:https://github.com/peter3125/sentence2vec
    paper地址:《A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS》

    # test
    embedding_size = 4   # dimension of the word embedding
    w1 = Word('Peter', [0.1, 0.2, 0.3, 0.4])
    w2 = Word('was', [0.2, 0.1, 0.3, 0.4])
    w3 = Word('here', [0.1, 0.4, 0.1, 0.4])
    
    sentence1 = Sentence([w1, w2, w3])
    sentence2 = Sentence([w2, w3, w1])
    sentence3 = Sentence([w3, w1, w2])
    
    # calculate and display the result
    print(sentence_to_vec([sentence1, sentence2, sentence3], embedding_size))

    .


    延伸三:NLP 模型到底选 RNN 还是 CNN?

    本文来源于文章《AI技术讲座精选:NLP 模型到底选 RNN 还是 CNN?》,不过实质上并没有得出非常建设性的答案。
    paper地址:https://arxiv.org/pdf/1702.01923.pdf

    CNN 是分层架构,RNN 是连续结构。一般靠常规直觉来判断:

    1. 倾向于为分类类型的任务选择 CNN,例如情感分类,因为情感通常是由一些关键词来决定的;
    2. 对于顺序建模任务,我们会选择 RNN,例如语言建模任务,要求在了解上下文的基础上灵活建模。

    在实践中,得到的结论:

    1. CNN 和 RNN 为文本分类任务提供补充信息。至于哪个架构的执行效果更好一点,取决于对整个序列的语义理解的重要程度。
    2. 目前来看,RNN 在文本级别的情感分类表现得很好(Tang et al., 2015),对于LSTM,封闭的 CNN
      在语言建模任务上同比 LSTM 更胜一筹
    3. RNN 表现较好并且在大范围内的任务中都较为稳健。除了以下种情况:当前的任务本质上是一项在一些情感探测和问答匹配设置中识别关键词的任务。
    4. 隐藏层尺寸hidden size和批尺寸batch size会使 DNN 的性能变得非常不稳定,波动较大,从实践来看这两个参数对结果的影响非常大。

    .

    延伸四:对词向量干预,可以提高效率

    paper:All-but-the-Top: Simple and Effective Postprocessing for Word Representations
    本文来源于paperweekly,《本周值得读(2017.02.06-2017.02.10)》

    本文提出了一种对已有的词向量进行预处理的方法,用来对学习到的词向量降噪。基于词向量自身的几何结构 — 均值非零以及各项不同性,本文提出了一个反直观的处理方法:从所有的词向量中移除均值,以及移除部分导致各项不同性的方向。虽然这种处理方式忽略了词向量中的部分信息,但是它可以使多种通过不同方式训练出来的词向量加强词向量中包含的语义信息。经过预处理之后的词向量在一系列intrinsic衡量方式上(similarity, analogy, concept categorization)得到了一致性地提高。同时,我们通过了不同的应用上进行了测试,试验结果表明该预处理已经在诸多neural network中有所体现,进一步证实了对词向量进行预处理的重要性。

    .


    延伸五:NLP+Skip-Thoughts-Vectors︱基于TensorFlow的带语义特征的句向量编码方式

    本篇转载于新智元,题为《TensorFlow 自动句子语义编码,谷歌开源机器学习模型
    Skip-Thoughts》

    笔者觉得是高层次的

    github地址(新换):https://github.com/tensorflow/models/tree/master/research/skip_thoughts

    Skip-Thoughts 模型概要

    Skip-Thoughts 模型是一个句子编码器。它学习将输入的句子编码成固定维度的向量表示,这些向量表示能够对许多任务有用,例如检测释义,或对产品评论进行积极或消极的分类等等。有关模型架构和更多示例应用的详细信息,可以参阅Ryan Kiros 等人的 NIPS 论文 Skip-Thought Vectors。

    一个训练好的 Skip-Thoughts 模型会在嵌入的向量空间中对相互临近的相似句子进行编码。以下示例展示了对电影评论数据集中的一些句子的余弦相似性的最近邻域。
    我们描述了一种通用、分布式句子编码器的无监督学习方法。使用从书籍中提取的连续文本,我们训练了一个编码器-解码器模型,试图重建编码段落周围的句子。语义和语法属性一致的句子因此被映射到相似的向量表示。我们接着引入一个简单的词汇扩展方法来编码不再训练预料内的单词,令词汇量扩展到一百万词。同时建立word2vec到skip-thoughts向量之间的映射关系。
    在训练模型后,我们用线性模型在8个任务上提取和评估我们的向量,包括:语义相关性,释义检测,图像句子排序,问题类型归类,以及4个基准情绪和主观性数据集。最终的结果是一个非专门设计的编码器,能够生成高度通用性的句子表示,在实践中表现良好。
    这里写图片描述

    Skip-Thought 模型是 NIPS 2015论文 Skip-Thought Vectors 中描述的模型的一个 TensorFlow 实现,学习对句子的语义属性进行编码。

    引用:Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Richard S. Zemel, Antonio Torralba, Raquel Urtasun, Sanja Fidler. Skip-Thought Vectors. In NIPS, 2015.

    论文下载地址:https://papers.nips.cc/paper/5950-skip-thought-vectors.pdf

    这里写图片描述

    编码句子示例

    该示例的句子来自电影评论数据集(Movie Review Data)。

    ipython  # Launch iPython.
    
    In [0]:
    
    # Imports.
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    import numpy as np
    import os.path
    import scipy.spatial.distance as sd
    from skip_thoughts import configuration
    from skip_thoughts import combined_encoder
    
    In [1]:
    # Set paths to the model.
    VOCAB_FILE = "/path/to/vocab.txt"
    EMBEDDING_MATRIX_FILE = "/path/to/embeddings.npy"
    CHECKPOINT_PATH = "/path/to/model.ckpt-9999"
    # The following directory should contain files rt-polarity.neg and
    # rt-polarity.pos.
    MR_DATA_DIR = "/dir/containing/mr/data"
    
    In [2]:
    # Set up the encoder. Here we are using a single unidirectional model.
    # To use a bidirectional model as well, call load_encoder() again with
    # configuration.ModelConfig(bidirectional_encoder=True) and paths to the
    # bidirectional model's files. The encoder will use the concatenation of
    # all loaded models.
    encoder = combined_encoder.CombinedEncoder()
    encoder.load_encoder(configuration.ModelConfig(),
                         vocabulary_file=VOCAB_FILE,
                         embedding_matrix_file=EMBEDDING_MATRIX_FILE,
                         checkpoint_path=CHECKPOINT_PATH)
    
    In [3]:
    # Load the movie review dataset.
    data = []
    with open(os.path.join(MR_DATA_DIR, 'rt-polarity.neg'), 'rb') as f:
      data.extend([line.decode('latin-1').strip() for line in f])
    with open(os.path.join(MR_DATA_DIR, 'rt-polarity.pos'), 'rb') as f:
      data.extend([line.decode('latin-1').strip() for line in f])
    
    In [4]:
    # Generate Skip-Thought Vectors for each sentence in the dataset.
    encodings = encoder.encode(data)
    
    In [5]:
    # Define a helper function to generate nearest neighbors.
    def get_nn(ind, num=10):
      encoding = encodings[ind]
      scores = sd.cdist([encoding], encodings, "cosine")[0]
      sorted_ids = np.argsort(scores)
      print("Sentence:")
      print("", data[ind])
      print("\nNearest neighbors:")
      for i in range(1, num + 1):
        print(" %d. %s (%.3f)" %
              (i, data[sorted_ids[i]], scores[sorted_ids[i]]))
    
    In [6]:
    # Compute nearest neighbors of the first sentence in the dataset.
    get_nn(0)

    输出:

    Sentence:
     simplistic , silly and tedious .
    
    Nearest neighbors:
     1. trite , banal , cliched , mostly inoffensive . (0.247)
     2. banal and predictable . (0.253)
     3. witless , pointless , tasteless and idiotic . (0.272)
     4. loud , silly , stupid and pointless . (0.295)
     5. grating and tedious . (0.299)
     6. idiotic and ugly . (0.330)
     7. black-and-white and unrealistic . (0.335)
     8. hopelessly inane , humorless and under-inspired . (0.335)
     9. shallow , noisy and pretentious . (0.340)
     10. . . . unlikable , uninteresting , unfunny , and completely , utterly inept . (0.346)

    延伸六:Doc2Vec的情感分析以及相似性

    Tutorial for Sentiment Analysis using Doc2Vec in gensim (or “getting 87% accuracy in sentiment analysis in under 100 lines of code”)
    github:https://github.com/linanqiu/word2vec-sentiments

    也可以用doc2vec来做相似性分析,其他办法有:
    第一种方法,使用docsim;第二种办法,使用doc2vec;第三种方式:使用LSH。
    博客里面也有code

    详细可见:用docsim/doc2vec/LSH比较两个文档之间的相似度

    .

    延伸七:能够表征相似的:基于CNN的短文本表达模型及相似度计算的全新优化模型

    来源:LSF-SCNN:一种基于CNN的短文本表达模型及相似度计算的全新优化模型

    LSF-SCNN,即基于词汇语义特征的跳跃卷积模型 (Lexical Semantic Feature based Skip Convolution neural network ),基于卷积神经网络模型引入三种优化策略:词汇语义特征 (Lexical Semantic Feature, LSF)、跳跃卷积 (Skip Convolution, SC)和K-Max均值采样 (K-Max Average Pooling, KMA) ,分别在词汇粒度、短语粒度、句子粒度上抽取更加丰富的语义特征,从而更好的在向量空间构建短文本语义表达模型,并广泛的适用于问答系统 (question answering)、释义识别 (paraphrase identification) 和文本蕴含 (textual entailment)等计算成对儿出现的短文本的相似度的任务中。
    LSF特征怎样计算得到?
    问题和答案中的每一个单词都会有一个LSF特征,具体来说是一个[0,t]上的整数值。LSF的计算过程可通过下面一个例子说明,当我们想要求解问题中general一词的LSF特征时,第一步我们需要计算general与答案中每一个词的余弦相似度并选取其中的最大值,因此chief被选取出来。第二步,余弦相似度值的最大值0.79将通过一个映射函数映射为一个[0,t]区间的整数,当我们假定t=10,最终计算得到general的LSF特征为3。这是合理的,general和chief一定程度上是近义词。
    这里写图片描述

    .

    延伸八:473个模型试验告诉你文本分类中的最好编码方式

    论文地址:https://arxiv.org/pdf/1708.02657.pdf
    来源机器之心:学界 473个模型试验告诉你文本分类中的最好编码方式
    本论文实证研究了在文本分类模型中汉语、日语、韩语(CJK)和英语的不同编码方式。该研究讨论了不同层面的编码,包括 UTF-8 bytes、字符级和词汇级。对于所有的编码层面,我们都提供了线性模型、fastText (Joulin et al., 2016) 和卷积网络之间的对比。对于卷积网络,我们使用字符字形(character glyph)图像、one-hot(或 one-of-n)编码和嵌入方法比较了不同的编码机制。总的来说,该实验涉及 473 个模型,并使用了四种语言(汉语、英语、日语和韩语)的 14 个大规模文本分类数据集。该研究所得出来的一些结论:基于 UTF-8 字节层面的 one-hot 编码在卷积网络中始终生成优秀结果;词层面的 N 元线性模型即使不能完美地分词,它也有强大的性能;fastText 使用字符层面的 N 元模型进行编码取得了最好的性能,但当特征太多时容易过拟合。
    这里写图片描述

    通过比较以上表格中的误差率,作者得出以下结论:

    • 1、fastText模型对中、日、韩文本(CJK语言文本)在character级编码的处理结果更好;而对英语文本则在word级编码的处理结果更好;
    • 2、对于fastText和线性模型,CJK语言的word级编码在没有完美分割的情况下效果相当;
    • 3、卷积网络的最佳编码机制是byte级独热编码(byte-level one-hot encoding)。
      这表明卷积网络能够从低级别的表示中理解文本,并提供了一致的和统一的方式来处理多种语言。
    • 4、fastText相比于卷积网络更倾向于过拟合,而相比于线形模型也并没有表现出更多的表示能力(representation
      capacity)。

    当然,尽管作者在此列了473种模型进行对比,但仍不是全部。例如深度学习模型本文只用了卷积网络模型,但其实还有别的一些有意思的模型,例如周期性网络(recurrent networks)等。作者似乎计划在之后会对周期性网络进行研究,同时还会改进卷积网络模型,看会有什么样的效果。

    展开全文
  • 一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号...

    这里写图片描述
    语言表示方法大体上可以从两个维度进行区分。一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、词、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号,而将语言表示为连续空间中的一个点,包括分布式表示和分散式表示。
    一、离散表示

    1、词向量
    一个词可以表示为One-Hot 向量(一维为1 其余维为0
    的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,这和事实不符。
    一种改进的方法是基于聚类的词表示。其中一个经典的方法是Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。
    2、句向量
    有了词的表示之后,我们可以进一步得到句子或篇章的表示。句子或篇章的离散表示通常采用词袋模型、N 元模型等。
    二、连续表示——分布式表示

    可以通过共现矩阵的方式来进行词的表示,这类方法也叫分布式表示(Distributional Representations)

    1、词向量

    潜在语义分析模型(Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)、随机索引(random indexing)等。

    2、句向量

    句子的表示方式对应于共现矩阵,另一列,在LDA中句子-词语矩阵中就是很好地句子表示方式。

    三、连续表示——分散式表示

    另一种连续表示是分散式表示(Distributed Representations),即将语言表示为稠密、低维、连续的向量

    1、词向量
    研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。
    2、句向量
    句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性的方法有四种。
    (1)神经词袋模型
    简单对文本序列中每个词嵌入进行平均/加总,作为整个序列的表示。
    这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。
    (2)递归神经网络(Recursive Neural Network)
    按照一个给定的外部拓扑结构(比如成分句法树),不断递归得到整个序列的表示。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。
    (3)循环神经网络(Recurrent Neural Network)
    将文本序列看作时间序列,不断更新,最后得到整个序列的表示。
    (4)卷积神经网络(Convolutional Neural Network)
    通过多个卷积层和子采样层,最终得到一个固定长度的向量。
    在上述四种基本方法的基础上,很多研究者综合这些方法的优点,结合具体的任务,已经提出了一些更复杂的组合模型,例如双向循环神经网络(Bi-directional Recurrent Neural Network)、长短时记忆模型(Long-Short Term Memory)等。
    同时根据上面的内容,句向量的表征在RNN、CNN之间,到底哪个更好呢?
    3、篇章表示
    如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法,先得到句子编码,然后以句子编码为输入,进一步得到篇章的表示。具体的层次化可以采用以下几种方法:
    (1)层次化的卷积神经网络
    即用卷积神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。
    (2)层次化的循环神经网络
    即用循环神经网络对每个句子进行建模,然后再用一个循环神经网络建模以句子为单位的序列,得到篇章表示。
    (3)混合模型
    先用循环神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。

    四、总结

    基于深度学习的方法在自然语言处理中取得了很大的进展,因此,分散式表示也成为语言表示中最热门的方法,不但可以在特定的任务中端到端地学习字、词、句子、篇章的分散式表示,也可以通过大规模未标注文本自动学习。
    分散式表示可以非常方便地应用在下游的各种自然语言处理任务上,并且可以端到端地学习,给研究者带来了很大的便利。但是分散式表示对以下几种情况还不能很好地处理,需要进一步解决。
    语言中出现所有符号是否都需要使用统一的表示模型?比如,无意义的符号、变量、数字等。
    新词以及低频词的表示学习方法。目前的表示学习方法很难对这些词进行很好的建模,而这些词都是极具信息量的,不能简单忽略。
    篇章的语言表示。目前对篇章级别的文本进行建模方法比较简单,不足以表示篇章中的复杂语义。
    语言表示的基础数据结构。除了目前的基于向量的数据结构之外是否有更好的表示结构,比如矩阵、队列、栈等。

    句向量的表示方式
    1、词向量简单相加/平均(类似神经词袋模型)
    对词向量的相加/平均,但是譬如以下的两句话质心是一致的:
    You are going there to teach not play.
    You are going there to play not teach
    这样的方式,再来求句子距离,其实是在求句子的质心距离(centroid distance)。
    另外一种改良版本,用Word Movers’ Distance
    这里写图片描述
    相近词之间求距离,然后把这样的相近距离相加。
    2、深度学习方面

    以上的方法并没有关照到句子的序列信息。
    1、CNN
    用CNN来句子表示(paper:Convolutional Neural Networks for Sentence Classification),操作流程是:
    padding句子让其长度一致 -> 使用词表示技术成为方阵 -> 使用CNN -> 使用Max-overtime pooling -> 全连接层 -> 获得句向量。

    2、GRU
    Dynamic Memory Networks for Visual and Textual Question Answering
    通过GRU进行编码,生成上下文向量+更新记忆。
    当然还有用双向GRUs(Efficient Summarization With Read-Again And Copy Mechanism)
    3、fasttext表示
    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法。
    fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
    序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
    fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
    fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。
    这里写图片描述
    句向量表达:Sentence 2 vec

    跟词向量简单相加减类似,是通过PCA/SVD的加权得到了句向量,同时作者在实验过程中,发现这一表征方式,可以跟LSTM表征的效果媲美。
    这里写图片描述
    NLP 模型到底选 RNN 还是 CNN?

    CNN 是分层架构,RNN 是连续结构。一般靠常规直觉来判断:
    倾向于为分类类型的任务选择 CNN,例如情感分类,因为情感通常是由一些关键词来决定的;
    对于顺序建模任务,我们会选择 RNN,例如语言建模任务,要求在了解上下文的基础上灵活建模。
    在实践中,得到的结论:
    CNN 和 RNN 为文本分类任务提供补充信息。至于哪个架构的执行效果更好一点,取决于对整个序列的语义理解的重要程度。

    目前来看,RNN 在文本级别的情感分类表现得很好(Tang et al., 2015),对于LSTM,封闭的 CNN 在语言建模任务上同比 LSTM 更胜一筹

    RNN 表现较好并且在大范围内的任务中都较为稳健。除了以下种情况:当前的任务本质上是一项在一些情感探测和问答匹配设置中识别关键词的任务。

    隐藏层尺寸hidden size和批尺寸batch size会使 DNN 的性能变得非常不稳定,波动较大,从实践来看这两个参数对结果的影响非常大。

    对词向量干预,可以提高效率
    https://www.researchgate.net/publication/313398040_All-but-the-Top_Simple_and_Effective_Postprocessing_for_Word_Representations
    本文提出了一种对已有的词向量进行预处理的方法,用来对学习到的词向量降噪。基于词向量自身的几何结构 — 均值非零以及各项不同性,本文提出了一个反直观的处理方法:从所有的词向量中移除均值,以及移除部分导致各项不同性的方向。虽然这种处理方式忽略了词向量中的部分信息,但是它可以使多种通过不同方式训练出来的词向量加强词向量中包含的语义信息。经过预处理之后的词向量在一系列intrinsic衡量方式上(similarity, analogy, concept categorization)得到了一致性地提高。同时,我们通过了不同的应用上进行了测试,试验结果表明该预处理已经在诸多neural network中有所体现,进一步证实了对词向量进行预处理的重要性。

    NLP+Skip-Thoughts-Vectors︱基于TensorFlow的带语义特征的句向量编码方式

    github地址:https://github.com/tensorflow/models/tree/master/skip_thoughts

    Skip-Thoughts 模型概要

    Skip-Thoughts 模型是一个句子编码器。它学习将输入的句子编码成固定维度的向量表示,这些向量表示能够对许多任务有用,例如检测释义,或对产品评论进行积极或消极的分类等等。有关模型架构和更多示例应用的详细信息,可以参阅Ryan Kiros 等人的 NIPS 论文 Skip-Thought Vectors。

    一个训练好的 Skip-Thoughts 模型会在嵌入的向量空间中对相互临近的相似句子进行编码。以下示例展示了对电影评论数据集中的一些句子的余弦相似性的最近邻域。
    我们描述了一种通用、分布式句子编码器的无监督学习方法。使用从书籍中提取的连续文本,我们训练了一个编码器-解码器模型,试图重建编码段落周围的句子。语义和语法属性一致的句子因此被映射到相似的向量表示。我们接着引入一个简单的词汇扩展方法来编码不再训练预料内的单词,令词汇量扩展到一百万词。同时建立word2vec到skip-thoughts向量之间的映射关系。
    在训练模型后,我们用线性模型在8个任务上提取和评估我们的向量,包括:语义相关性,释义检测,图像句子排序,问题类型归类,以及4个基准情绪和主观性数据集。最终的结果是一个非专门设计的编码器,能够生成高度通用性的句子表示,在实践中表现良好。
    这里写图片描述
    Doc2Vec的情感分析以及相似性

    Tutorial for Sentiment Analysis using Doc2Vec in gensim (or “getting 87% accuracy in sentiment analysis in under 100 lines of code”)
    github:https://github.com/linanqiu/word2vec-sentiments

    也可以用doc2vec来做相似性分析,其他办法有:
    第一种方法,使用docsim;第二种办法,使用doc2vec;第三种方式:使用LSH。
    能够表征相似的:基于CNN的短文本表达模型及相似度计算的全新优化模型
    LSF-SCNN,即基于词汇语义特征的跳跃卷积模型 (Lexical Semantic Feature based Skip Convolution neural network ),基于卷积神经网络模型引入三种优化策略:词汇语义特征 (Lexical Semantic Feature, LSF)、跳跃卷积 (Skip Convolution, SC)和K-Max均值采样 (K-Max Average Pooling, KMA) ,分别在词汇粒度、短语粒度、句子粒度上抽取更加丰富的语义特征,从而更好的在向量空间构建短文本语义表达模型,并广泛的适用于问答系统 (question answering)、释义识别 (paraphrase identification) 和文本蕴含 (textual entailment)等计算成对儿出现的短文本的相似度的任务中。
    LSF特征怎样计算得到?
    问题和答案中的每一个单词都会有一个LSF特征,具体来说是一个[0,t]上的整数值。LSF的计算过程可通过下面一个例子说明,当我们想要求解问题中general一词的LSF特征时,第一步我们需要计算general与答案中每一个词的余弦相似度并选取其中的最大值,因此chief被选取出来。第二步,余弦相似度值的最大值0.79将通过一个映射函数映射为一个[0,t]区间的整数,当我们假定t=10,最终计算得到general的LSF特征为3。这是合理的,general和chief一定程度上是近义词。
    这里写图片描述

    展开全文
  • 系统学习NLP(十二)--文本表示综述

    千次阅读 2019-03-10 11:23:02
    词表示 关于文本表示,研究者从不同的角度出发,提出大量的文本表示模型。本文重点梳理现有模型,大致分为三类,即基于向量空间模型、基于主题模型和基于神经网络的方法。 基于向量空间模型的...

    文本表示,简单的说就是不将文本视为字符串,而视为在数学上处理起来更为方便的向量(也就是文本特征抽取)。而怎么把字符串变为向量,就是文本表示的核心问题。

    文本表示,基于类型分为:

    • 长文本表示
    • 短文本表示(句子)
    • 词表示

    关于文本表示,研究者从不同的角度出发,提出大量的文本表示模型。本文重点梳理现有模型,大致分为三类,即基于向量空间模型、基于主题模型和基于神经网络的方法。

    基于向量空间模型的方法

    向量空间模型是将文本表示成实数值分量所构成的向量,一般而言,每个分量对应一个词项,相当于将文本表示成空间中的一个点。向量不仅可以用来训练分类器,而且计算向量之间的相似度可以度量文本之间的相似度。

    词袋子模型(bag of words)

    词袋子模型是一种非常经典的文本表示。顾名思义,它就是将字符串视为一个 “装满字符(词)的袋子” ,袋子里的词语是随便摆放的。而两个词袋子的相似程度就以它们重合的词及其相关分布进行判断。
    举个例子,对于句子:“我们这些傻傻的路痴走啊走,好不容易找到了饭店的西门”。
    我们先进行分词,将所有出现的词储存为一个词表。然后依据 “词语是否出现在词表中” 可以将这句话变为这样的向量:
    [1,0,1,1,1,0,0,1,…]
    词表:[我们,你们,走,西门,的,吃饭,旅游,找到了,…]
    其中向量的每个维度唯一对应着词表中的一个词。可见这个向量的大部分位置是0值,这种情况叫作“稀疏”。为了减少存储空间,我们也可以只储存非零值的位置。

    词袋子模型的优缺点
    优点:

    简单,方便,快速在语料充足的前提下,对于简单的自然语言处理任务效果不错。如文本分类。
    缺点:

    其准确率往往比较低。
    凡是出现在文本中的词一视同仁,不能体现不同词在一句话中的不同的重要性。
    无法关注词语之间的顺序关系,这是词袋子模型最大的缺点。如“武松打老虎”跟“老虎打武松”在词袋子模型中是认为一样的。

    对词袋子模型的改进:TF-IDF

    即向量的维度对应词表的大小,对应维度使用TF-IDF计算。向量空间模型的优点是简单明了,向量维度意义明确,效果不错,但也存在明显的缺点,其一,维度随着词表增大而增大,且向量高度稀疏;其二,无法处理“一义多词”和“一词多义”问题。

    在向量空间模型中,文档集合相当于表示成高维稀疏矩阵,如图1中所示,文档集合矩阵的维度是N*V,其中N是文档数目,V是词表的大小。为了更好的提升文本的语义表示能力,有人提出通过矩阵分解的方法,对高维稀疏矩阵进行分解,最为著名的便是潜在语义分析(Latent semantic analysis, LSA),具体而言,LSA会构建一个文档与词项的共现矩阵,矩阵的元素一般通过TFIDF计算得到,最终通过奇异值分解的方法对原始矩阵降维,可以得到文档向量和词项向量。如图1所示,分解后,每个文档可以用k维向量表示(k << V),相当于潜在语义分析实现对文档的低维语义表示。但是,以上过程通过矩阵分解得到,空间中维度的物理含义不明确,无法解释。

    图1  LSA

    补充:TFIDF原理

    如果某个词或短语在一篇文章中出现的频率高(TF),并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处. 在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语来说,它的重要性可表示为:

    以上式子中分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。

    逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:

    其中

    • |D|:语料库中的文件总数

    • :包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用数据平滑作为分母。idf公式分母idf公式分母

    然后再计算TF与IDF的乘积。

    某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

    基于主题模型的方法

    上面提到LSA算法通过线性代数中奇异值分解实现文档映射到低维语义空间里的向量,但是空间中每一个维度是没有明确物理意义的,主题模型尝试从概率生成模型的角度实现文本的表示,每一个维度是一个“主题(topic)”,这个主题通常是一组词的聚类,因此可以通过主题大概猜测每个维度所代表的语义,具有一定的解释性。

    最早的主题模型pLSA (probabilistic LSA),假设文档具有主题分布,文档中的词从主题对应的词分布中抽取。如图2所示,以d表示文档,w表示词,z表示主题(隐变量),则文档和词的联合概率p(d, w)的生成过程可表示为:

    其中p(z|d)和p(w|z)作为参数可以用EM算法进行学习。然而,pLSA没有假设主题的的先验分布,导致参数随训练文档的数目呈线性增长,参数空间很大。

    图2  pLSA

    于是,有人提出更加完善的主题的模型LDA(Latent Dirichlet allocation),可以认为pLSA体现频率学派的思想,而LDA是贝叶斯学派的思想,LDA在已有的模型上中的2个多项式分布引入了狄利克雷先验分布,从而解决pLSA中存在的问题。如图3所示,每个文档的主题分布为多项式分布Mult(θ),其中θ从狄利克雷先验分布Dir(α)抽取,同理,对于主题的词分布为多项式分布Mult(Φ),参数Φ也是从狄利克雷先验Dir(β)抽取得到。

    图3  LDA

    基于主题模型的方法,引入“主题”概念,具有一定的物理意义,从而得到文档的主题分布表示。当然,主题模型很存在一些问题,比如训练参数多导致训练时间长,对短文本的建模效果不好,主题数目的设置需要人工设定可能导致不合理。后来,也有很多人提出改进的方法,在这就不一一赘述了。

    基于神经网络的方法

    现今,基于神经网络的方法受到广泛关注,各种各样的模型被相继提出,本节总结其中最具有代表性的模型,将其分为三类:

    • 第一类,基于词向量合成的模型,该类方法仅是在词向量基础上简单合成;
    • 第二类,基于RNN/CNN的模型,该类方法利用更复杂的深度学习模型对文本进行建模;
    • 第三类,基于注意力机制的模型,在已有神经网络模型基础上,引入注意力机制,提升文本建模效果。

    基于词向量合成的模型

    2003年Bengio等人开始使用神经网络来做语言模型的工作,尝试得到词的低维、稠密的向量表示,2013年Mikolov等人提出简化的模型,即著名的Word2Vec,包含两个模型CBOW和Skip-gram,前者通过窗口语境预测目标词出现的概率,后者使用目标词预测窗口中的每个语境词出现的概率。语义上相似或相关的词,得到的表示向量也相近,这样的特性使得Word2Vec获得巨大成功。

    后来,Mikolov等人又延续Word2Vec的思想,提出Doc2Vec,核心思想是将文档向量当作“语境”,用来预测文档中的词。Doc2Vec算法可以得到词向量和文档向量。如图4所示,两个算法的思想基本一致。

    图4  Word2Vec和Doc2Vec比较

    其实,也可以通过最简单的合成方式实现从词向量到句子向量的表示,fastText就是这样简单有效的模型,如图5所示,输入层是词向量,然后通过把句子里的词向量平均就得到句子的表示,最后送到分类器中。不过,输入端会另外补充一些n-gram信息来捕捉局部序列信息。fastText是线性分类模型,实验表明在诸多“简单”文本分类任务中表现出色,且具备训练速度非常快的优点,所以可以成为很好的Baseline。

    图5  fastText模型

    基于RNN/CNN的模型

    自然语言中,词构成句子,句子构成文档,有很多工作尝试合理表示词向量同时,也有很多模型被提出来建模句子和文档,其中最常见的网络结构便是LSTM和CNN。

    2014年Kim提出基于卷积神经网络的文本分类,如图6所示,输入是句子对应的词向量矩阵,经过一层卷积层和一层Max Pooling层,得到句子的表示,送入到全连接层,最后softmax输出。卷积神经网络擅长提取重要的局部特征,在文本分类中,可以理解为不同大小的卷积核在提取不同n-gram特征。一般认为,卷积神经网络无法考虑长距离的依赖信息,且没有考虑词序信息,在有限的窗口下提取句子特征,会损失一些语义信息。

    图6 CNN网络用于文本分类

    针对CNN的不足之处,LSTM和GRU等循环神经网络因为擅长捕捉长距离信息,所以也被大家尝试用来文本表示。如图7所示,图中利用双向LSTM来建模输入句子,输入是句子的词向量,输入至BiLSTM中进行序列建模。最后句子表示,可以尝试两种方法,其一,选择最后的hidden state用来表示句子;其二,所有hidden state的平均用于表示句子。

    图7 BiLSTM用于文本表示

    刚才分析到,CNN擅长提取局部特征,而LSTM擅长捕捉长距离信息,不难想到,有人尝试结合两种网络的优点,提出RCNN用于文本建模。如图8所示,整个网络结构主要有两部分组成,循环结构和Max Pooling。循环结构,可以理解为,在已有词向量为输入的基础上,通过双向RNN网络学习每一个词的左、右上下文信息,接着将三部分(left context, word embedding, right context)表示向量拼接起来,作为句子中每一个词的表示,然后使用变换得到中间语义表示;Max Pooling层,采用element-wise的max pooling方式,可以从变长的输入中得到固定的句子表示。

    图8  RCNN用于文本表示

    基于注意力机制的模型

    注意力被认为是一种有效选择信息的方式,可以过滤掉大量与任务无关的信息,最先在机器翻译任务中被提出,解决seq2seq中encoder过程把源序列映射成固定大小的向量存在“损失”信息的情况。紧接着,Attention被推广到各种NLP任务中,文本表示任务当然不例外。这里,主要介绍两种Attention的形式,Hierarchical Attention 和 Self-Attention。

    Hierarchical Attention网络结构,如图9所示,该模型基于两个基本假设,其一,文档是分层结构的,词构成句子,句子构成文档;其二,文档中不同词或句子提供的信息量不一样的,该模型适合用来表示包含多个句子的文档的表示问题。模型主要由word encoder和sentence encoder,以及相应的attention组成,word encoder部分用于得到句子的表示,该层的输入为句子的词向量,经过双向GRU后得到中间表示,word attention部分对中间表示按attention值进行加权得到此句最终的句子表示;sentence encoder部分用于得到文档的表示,使用word encoder部分得到文档中所有句子的表示后,将此作为sentence encoder部分的输入,类比word encoder的计算,可以最终得到文档的表示。简言之,利用Hierarchical Attention结构,一层词输入得到句子表示,一层句子输入得到文档表示。即使文档长度较长,但是在注意力的作用下,依然可以较好的捕捉到有效的特征信息,忽略无意义的输入。

    图9  Hierarchical Attention

    Self-Attention网络结构,如图10所示,大多数神经网络模型将文本表示成一维的向量,但是此模型通过二维矩阵来表示句子,包括两部分,一部分是双向的LSTM,另一部分是自注意力机制,自注意力机制实现对双向LSTM中所有的隐藏状态以不同权重的方式线形组合,每一次组合获得句子的一部分表示,多次组合便得到矩阵表示(图中矩阵M)。

    图10  Self-Attention

    展开全文
  • 的向量表示

    万次阅读 2014-04-30 12:59:13
     NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了...
  • mysql中时间比较的实现

    千次阅读 2021-01-18 18:31:52
    不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果 使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970-01-01 00:00:00到指定时间所经历的秒数。有了这个函数,就可以自然地...
  • 转自:[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec向量模型 阅读目录 1. 向量 2.Distributed representation向量表示 3.向量模型 4.word2vec算法思想 5.doc2vec算法...
  • 知识表示方法
  • 第一个,我室友,上课以外的时间都是看漫画,看小说,画画,睡觉,吃零食。但是成绩就是好,她化学进了学校的竞赛培训班,数学也好,但是平时完全没有死命学的迹象。 第二个,另一个寝室的,我们是寄宿学校要求...
  • 一个良好的表示是内容充分高效表达的基础,作为沟通计算机与现实世界的桥梁,计算机行业人员每时每刻都在研究事物的表示。比如:编程语言,早期的机器语言和现在的高级程序语言可以看作是指令的两种不同表示方式,从...
  • 向量2.Distributed representation向量表示3.向量模型4.word2vec算法思想5.doc2vec算法思想6.参考内容 深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展。深度学习...
  • 多模态特征表示和融合

    万次阅读 多人点赞 2020-12-15 16:51:41
    值得注意的是,在最近的工作中,对于像深度神经网络这样的模型,多模态表示和融合之间的界限已经模糊了,其中表示学习与分类或回归目标交织在一起 多模态融合的优势 1.对于同一任务,能够应用多种模态的数据,可以...
  • 网络表示学习简单总结(一)

    千次阅读 2019-03-06 17:39:50
    1. 网络表示学习的定义 简单来说,网络表示学习就是通过相关算法将网络中的节点用一个低维稠密的向量空间表示(其中向量空间的维度远远小于节点的总个数),并且能够保持原有网络的相关结构和特征,然后再输入到...
  • NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了...
  • 文本表示简介

    千次阅读 2018-08-20 16:02:58
    SIGAI特邀作者:徐国海 研究方向:自然语言处理和知识图谱 ...文本分类是自然语言处理中研究最为广泛的任务之一,通过构建模型实现对文本内容进行自动分类,有多应用场景,比如新闻文章主题分类,产品评论...
  • 《文本嵌入式表示方法实战》系列文章是基于2017年我于研一下半学期做的两场长时间的组会汇报ppt上形成的文章(学习和实验长达3个月,因为当时主要以上课为主,实验都是课余时间做的。。),由于当时我正处于入门阶段...
  • 【操作系统】时间片轮转调度法

    千次阅读 2020-12-21 10:40:02
    同义时间片轮转法一般指时间片轮转调度算法,时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一时间段,称作它的时间片,即该进程允许运行的时间。 中文名 时间片轮转调度算法...
  • 文章目录什么是语义表示静态向量动态向量(上下文向量)位置编码ERNIE的原理介绍神经网络上的改造辅助任务学习过程ERNIE的应用案例性能不敏感的场景:直接使用ERNIE 的模型蒸馏案例:搜索问答Query识别和QP...
  • 命题和联结 ( 命题 | 命题符号化 | 真值联结 | 否 | 合取 | 析取 | 非真值联结 | 蕴涵 | 等价 )
  • 摘要 最近引入的连续Skip-gram...通过对频繁进行重复采样我们可以极大地提升学习速度,学习到更有规律的单词表示。我们还描述了一种分层softmax的简单代替方案称作负抽样。  单词表示的内在局限是它们对单词顺序
  • 知识表示

    千次阅读 2018-07-05 11:58:47
    http://pelhans.com/2018/03/16/xiaoxiangkg-note2/本讲首先对早期的知识...知识表示历史知识的概念早期的知识表示方法一阶谓词逻辑产生式系统框架表示法语义网络基于语义网的知识表示框架RDF简介RDF概念RDF和RDFSO...
  • 时间序列常用算法总结

    千次阅读 多人点赞 2020-12-14 10:06:06
    时间序列预测算法总结 文章目录时间序列预测算法总结前言一、基于统计的时序数据建模方法1.1传统时序数据建模方法1.1.1周期因子法1.1.2移动平均法1.1.3ARIMA模型1.1.3.1模型原理1.平稳性要求2.AR模型3.MA模型4.ARMA...
  • 知识图谱入门 (二) 知识表示与知识建模

    万次阅读 多人点赞 2018-04-20 16:04:59
    欢迎大家关注我的博客 http://pelhans.com/ ,所有文章都会第一时间发布在那里哦~ 本讲首先对早期的知识表示做了一个简单介绍,而后详细介绍了基于语义网的知识表示框架,如RDF和RDFS和查询语言SQARQL。最终给出...
  • mysql 查询当前时间是星期几

    万次阅读 2017-03-22 12:02:47
    MySQL中DATE_FORMAT(date, format)函数可根据format字符串格式化日期或日期和时间值date,返回结果串。  也可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值
  • 表示学习的发展,以及自然语言 处理领域向量等嵌入(Embedding)技术手段的出现,启发了人们用类似于 向量的低维稠密向量的方式表示知识的研究。通过嵌入(Embedding)将知识图 谱中的实体和关系投射到一个低维...
  • 什么是知识图谱?

    千次阅读 2021-12-12 20:28:46
    知识图谱这一概念最有Google 提出,它是结构化知识库结合语义网络的产物,在表示形式上跟语义网络相似,但语义网络偏向描述概念之间的关系,而知识图谱偏向实体之间的关联。 举个例子: 语义网络 用相互连接的...
  • 基于GNN的图表示学习及其应用

    千次阅读 2020-03-11 11:00:00
    文章内容概述 本文内容分两部分,第一部分为基于 GNN 的图表示学习,共包含两节,第1节主要从三种建模方法上对图表示学习进行对比阐述;第2节分别从两类无监督学习目...
  • 小评最近火的BERT模型

    千次阅读 2019-04-04 14:06:54
    应Pattern Recognition审稿人要求,加入最近火的BERT模型作为我们提出的文本表示模型的对比方法。在此和大家共同学习分析一下最近深度学习在自然语言处理领域的网红模型BERT,尝试品味BERT的精髓,探讨BERT可能的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,109
精华内容 26,043
关键字:

很早是表示时间的词吗