搜索
当前位置: 678彩票官网 > 递归向量 >

专栏 递归卷积神经网络在解析和实体识别中的应用

gecimao 发表于 2019-04-13 13:00 | 查看: | 回复:

  在本文中,来自触宝科技的工程师介绍了如何在传统的解析算法中用上深度学习的技术。在实践中,深度学习减少了数据工程师大量的编码特征的时间,而且效果比人工提取特征好很多。在解析算法中应用神经网络是一个非常有前景的方向。

  人类语言与计算机语言不同,人类的语言是没有结构的,即使存在一些语法规则,这些规则往往也充满着歧义。在有大量用户输入语料的情况下,我们需要根据用户的输入,分析用户的意图。比如我们想看看一个用户有没有购买某商品的想法,此时就必须使用解析算法,将用户的输入转换成结构化的数据,并且在此结构上提取出有用的信息。

  NLP 解析算法的一般步骤是分词、标记词性、句法分析。分词和标记词性等,可以用条件随机场 (Conditional Random Field),隐马尔可夫模型 (Hidden Markov Model) 等模型解决,近年来也有用神经网络来做的,相对比较成熟,所以暂时不讨论。本文主要讨论一下最主要的一步,句法分析。

  句子 John sees Bill 被划分成了如上图的结构。首先单词 Bill 是一个名词短语,sees 是一个动词,根据预先设置的语法规则,动词 + 名词短语能构成动词短语,然后 名词 + 动词短语能够构成一句完整的句子。

  但是依存文法根据单词之间的修饰关系将它们连接起来构成一棵树,树中的每个节点都代表一个单词。

  子节点的单词是依赖于父节点的,每条边标准了依赖关系的类型。上面例句被解析成下面的树。

  成分分析的缺点是搜索空间太大,构建树的时间往往和可供选择的节点的数目相关,成分分析需要在计算过程中不断构建新的节点,而依存分析不需要构建新的节点。自然语言中有歧义,例如上下文无关文法中有规则「C - AB」,「D - AB」, 那么在计算 AB 应该合成什么节点的时候就出现了两种选择,多种歧义组合在一起,使成分分析的搜索空间爆炸增长,必须设计一些算法进行剪枝等操作。而依存分析不会去创建节点,因此没有这些问题。但是成分分析中保存的信息比依存分析更加多一点,因此可以直接通过一些确定的规则将成分的树转化成依存树。

  依存文法树的构建我们可以看成是一个状态转换的序列。当前的状态包括三部分,s 为当前的栈,b 为剩余未解析的词的数组,以及一个依存关系的集合 A。初始的状态是

  在每个状态下,我们都有很多可选的转移。关于如何选出正确的转移,一般有贪心或者搜索两种策略。目前的结果表明,尽管贪心比搜索的结果稍微差一点,但是解析的速度快非常多,因此,日常使用基本采用贪心算法。

  传统的解析算法需要根据当前的状态以及预先设置好的规则提取出特征。比如当前栈顶的前两个词,当前前几个未解析的词等。

  稀疏。这些特征尤其是词法特征,非常稀疏。依存文法的分析依赖于词之间的关系,有可能两个词距离非常远,那么仅仅提取栈顶前两个词作为特征已经无法满足需要,必须使用更高维度的特征,一旦维度高,势必使得特征非常稀疏。

  解析算法的绝大部分时间花费在了提取特征中。据统计百分之九十几的时间花费是特征提取。

  词嵌入是将单词表示成低维的稠密的实数向量。自从词向量技术的提出,到目前为止已经有很多方法来得到句法和语义方面的向量表示,这种技术在 NLP 领域发挥着重要的作用。

  如何用稠密的向量表示短语,这是使用词向量的一个难题。在成分分析中,业界使用递归神经网络 (Recursive Neural Network, RNN) 来解决这个问题。RNN 是一种通用的模型,用来对句子进行建模。句子的语法树中的左右子节点通过一层线性神经网络结合起来,根节点的这层神经网络的参数就表示整句句子。RNN 能够给语法树中的所有叶子节点一个固定长度的向量表示,然后递归地给中间节点建立向量的表示。

  其中 W 是 RNN 的参数矩阵。为了计算一个父节点是否合理,我们可以用一个线性层来打分, score(p_i)=vp_i 。v是需要被训练的参数向量。在构建树的过程中,我们采用这种方法来评估各种可能的构建,选出最佳的构建。

  但是 RNN 只能处理二元的组合,不适合依存分析。因为依存分析的某个节点可能会有非常多的子节点。于是有学者提出用递归卷积神经网络 (Recursive Convolutional Neural Network, RCNN) 来解决这个问题。通过使用 RCNN,我们能够捕捉到单词和短语的句法和组合语义的表示。RCNN 的架构能够处理任意 k 分叉的解析树。RCNN 是一个通用的架构,不仅能够用于依存分析,还能对于文章的语义进行建模,将任意长度的文本转化成固定长度的向量。

  对于依存树上的每个节点,我们用一个 RCNN 单元来表示改节点与其子节点之间的关系,然后用一层 Pooling 层来获得最具信息量的表示。每个 RCNN 单元又是其父节点的 RCNN 单元的输入。

  首先对于每个词,我们需要将其转换成向量。这一步一开始可以用已经训练好的向量,然后在训练的时候根据反向传播来进行更新。

  距离嵌入 (Distance Embedding),除了词需要嵌入,我们还需要将一个词和该词的子节点之间的距离进行编码。很直觉的是距离近的词更有可能发生修饰关系。例如上面的例子中,Mac 到 a 的距离是-1,到 wants 的距离是 -2。距离嵌入编码了子树的更多信息。

  与一般的解析树不同,依存分析的树的每个节点都有两个向量表示。一个是该节点的单词的词向量表示w,另一个是该节点的短语向量表示x。

  对于父节点 h,以及某个子节点 c_i,用卷积隐层来计算他们组合起来的表示向量

  其中是组合矩阵,是以及距离嵌入连接起来的向量。tanh是用来当做激发层。

  对于 RCNN 可以用最大间距的标准来训练。我们选取打分最高的解析树 和给定的标准解析树。定义两棵树之间的距离为树中依赖标记不一致的节点的数目。损失函数就是

  比如我们想要提取出「wants sth」的短语。就可以用如下的算法得到。

  #如果当前token的依赖指向want及其变形,而且依赖的关系是dobj。那么这是潜在的目标短语

  #如果当前的token是nt,依赖指向的词在潜在的目标短语中,而且依赖关系是neg,其实表示的意思是不想要,因此需要从目标短语的集合中剔除。

  本文介绍了如何在传统的解析算法中用上深度学习的技术。在实践中,深度学习减少了数据工程师大量的编码特征的时间,而且效果比人工提取特征好很多。在解析算法中应用神经网络是一个非常有前景的方向。

本文链接:http://windsorflowers.net/diguixiangliang/40.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部