什么是解析?

在自然语言的学习过程,个人一定都学过语法,比如句子能够用主语、谓语、宾语来表示。在自然语言的处理过程中。有很多应用场景都须要考虑句子的语法,因此研究语法解析变得很重要。

语法解析有两个基本的问题,其一是句子语法在计算机中的表达与存储方法。以及语料数据集;其二是语法解析的算法。

对于第一个问题,我们能够用树状结构图来表示,例如以下图所看到的。S表示句子;NP、VP、PP是名词、动词、介词短语(短语级别);N、V、P各自是名词、动词、介词。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFueHVfeXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


实际存储的时候上述的树能够表示为(S (NP (N Boeing)) (VP (V is) (VP (V located) (PP (P in) (NP (N Seattle))))))。互联网上已经有成熟的、手工标注的语料数据集。比如The Penn Treebank Project (Penn
Treebank II Constituent Tags
)。

对于第二个问题,我们须要有合适的算法来处理。这也是我们本章将要讨论的内容。

上下文无关语法(Context-Free Grammer)

为了生成句子的语法树,我们能够定义例如以下的一套上下文无关语法。

1)N表示一组非叶子节点的标注。比如{S、NP、VP、N...}
2)Σ表示一组叶子结点的标注。比如{boeing、is...}
3)R表示一组规则,每条规则能够表示为X->Y1Y2...Yn,X∈N。Yi∈(N∪Σ)
4)S表示语法树開始的标注

举例来说,语法的一个语法子集能够表示为下图所看到的。当给定一个句子时,我们便能够依照从左到右的顺序来解析语法。比如。句子the man sleeps就能够表示为(S (NP (DT the) (NN man)) (VP sleeps))。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFueHVfeXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


这种上下文无关的语法能够非常easy的推导出一个句子的语法结构,可是缺点是推导出的结构可能存在二义性。比如以下两张图中的语法树都能够表示同一个句子。

常见的二义性问题有:1)单词的不同词性,如can一般表示“能够”这个情态动词。有时表示罐子;2)介词短语的作用范围。如VP PP PP这种结构,第二个介词短语可能形容VP,也可能形容第一个PP;3)连续的名字,如NN NN NN。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFueHVfeXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">  

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFueHVfeXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


概率分布的上下文无关语法(Probabilistic Context-Free Grammar)

因为语法的解析存在二义性,我们就须要找到一种方法从多种可能的语法树种找出最可能的一棵树。一种常见的方法既是PCFG (Probabilistic Context-Free Grammar)。例如以下图所看到的。除了常规的语法规则以外,我们还对每一条规则赋予了一个概率。

对于每一棵生成的语法树,我们将当中所以规则的概率的乘积作为语法树的出现概率。


综上所述,当我们或得多颗语法树时,我们能够分别计算每颗语法树的概率p(t)。出现概率最大的那颗语法树就是我们希望得到的结果,即arg max p(t)。

训练算法

我们已经定义了语法解析的算法,而这个算法依赖于CFG中对于N、Σ、R、S的定义以及PCFG中的p(x)。上文中我们提到了Penn Treebank通过手工的方法已经提供了一个很大的语料数据集,我们的任务就是从语料库中训练出PCFG所须要的參数。

1)统计出语料库中全部的N与Σ;
2)利用语料库中的全部规则作为R;
3)针对每一个规则A -> B。从语料库中估算p(x) = p(A -> B) / p(A);

在CFG的定义的基础上,我们又一次定义一种叫Chomsky的语法格式。

这样的格式要求每条规则仅仅能是X -> Y1 Y2或者X -> Y的格式。实际上Chomsky语法格式保证生产的语法树总是二叉树的格式,同一时候随意一棵语法树总是可以转化成Chomsky语法格式。


语法树预測算法

如果我们已经有一个PCFG的模型,包括N、Σ、R、S、p(x)等參数,而且语法树总数Chomsky语法格式。当输入一个句子x1, x2, ... , xn时。我们要怎样计算句子相应的语法树呢?

第一种方法是暴力遍历的方法。每一个单词x可能有m = len(N)种取值,句子长度是n,每种情况至少存在n个规则,所以在时间复杂度O(m*n*n)的情况下。我们能够推断出全部可能的语法树并计算出最佳的那个。

另外一种方法当然是动态规划,我们定义w[i, j, X]是第i个单词至第j个单词由标注X来表示的最大概率。直观来讲。比如xi, xi+1, ... , xj,当X=PP时。子树可能是多种解释方式。如(P NP)或者(PP PP)。可是w[i, j, PP]代表的是继续往上一层递归时,我们仅仅选择当前概率最大的组合方式。特殊情况下。w[i, i, X] = p(X -> xi)。因此,动态规划的方程能够表示为w[i, j, X] = max (p(X -> Y Z) * w(i, s, Y) * w(s+1,
j, Z))。关于动态规划方法。leetcode里有不少案例能够说明。

语法解析依照上述的算法过程便完毕了。虽说PCFG也有一些缺点,比如:1)缺乏词法信息。2)连续短语(如名词、介词)的处理等。但整体来讲它给语法解析提供了一种很有效的实现方法。


版权声明:本文博主原创文章。博客,未经同意不得转载。

NLP | 自然语言处理 - 解析(Parsing, and Context-Free Grammars)的更多相关文章

  1. NLP 自然语言处理实战

    前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...

  2. flask 第六章 人工智能 百度语音合成 识别 NLP自然语言处理+simnet短文本相似度 图灵机器人

    百度智能云文档链接 : https://cloud.baidu.com/doc/SPEECH/index.html 1.百度语音合成 概念: 顾名思义,就是将你输入的文字合成语音,例如: from a ...

  3. Html / XHtml 解析 - Parsing Html and XHtml

    Html / XHtml 解析 - Parsing Html and XHtml HTMLParser 模块 通过 HTMLParser 模块来解析 html 文件通常的做法是, 建立一个 HTMLP ...

  4. [NLP自然语言处理]谷歌BERT模型深度解析

    我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...

  5. NLP常用术语解析

    分词(Segment):中英文都存在分词的问题,不过相对来说,英文单词与单词之间本来就有空格进行分割,所以处理起来相对方便.但是中文书写是没有分隔符的,所以分词的问题就比较突出.分词常用的手段可以是基 ...

  6. NLP自然语言处理学习笔记二(初试)

    前言: 用Python对自然语言处理有很好的库.它叫NLTK.下面就是对NLTK的第一尝试. 安装: 1.安装Pip 比较简单,得益于CentOS7自带的easy_install.执行一行命令就可以搞 ...

  7. NLP 自然语言处理之综述

    (1) NLP 介绍 NLP 是什么? NLP (Natural Language Processing) 自然语言处理,是计算机科学.人工智能和语言学的交叉学科,目的是让计算机处理或"理解 ...

  8. NLP 自然语言处理

    参考: 自然语言处理怎么最快入门:http://www.zhihu.com/question/ 自然语言处理简介:http://wenku.baidu.com/link?url=W6Mw1f-XN8s ...

  9. NLP自然语言处理学习笔记三(集成开发环境)

    前言: 我们在做自然语言学习的过程中使用Python进行编程.是用解析器的方式确实有些麻烦.在这里给大家推荐一款集成开发环境IDE可以很方便的对Python进行项目管理,代码自动提示,运行调试等. 简 ...

随机推荐

  1. poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS (母函数)

    /* 给出一个数n,把它拆分成若干个数的和,要求最大的数在中间并向两边非递增.问拆法有多少种. 母函数.枚举中间的那一个数.由于左右对称.所以仅仅须要求左边部分的方案就可以. 注意,左右两部分的取数必 ...

  2. HDU 4916 树分治

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. hdu 4685 Prince and Princess(匈牙利算法 连通分量)

    看了别人的题解.须要用到匈牙利算法的强连通算法 #include<cstdio> #include<algorithm> #include<vector> #pra ...

  4. 用Python的Tkinter实现时钟

    import Tkinter,sys,time root=Tkinter.Tk() root.minsize(, ) Label1=Tkinter.Label(text=time.strftime(' ...

  5. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

  6. 使用windows-SQLyog连接linux-mysql

          嘿嘿,最近又清闲了一点,重新安装了mysql去学习.   -----博客园-邦邦酱好 系统环境: 1. 主机为windows系统,安装了SQLyog. 2. 主机上还安装了虚拟机,系统为c ...

  7. Android - 位置定位(Location)服务(Service)类的基本操作

    位置定位(Location)服务(Service)类的基本操作 本文地址: http://blog.csdn.net/caroline_wendy 定位服务(Location Service),能够确 ...

  8. java它们的定义ArrayList序列, 大神跳跃

    一个list有两种类型的对象,今天有需求必须责令不同的约会对象,这里是代码 /** *@author xh1991101@163.com */ List<Message> messages ...

  9. 初探Java8中的HashMap(转)

    HashMap是我们最常用的集合之一,同时Java8也提升了HashMap的性能.本着学习的原则,在这探讨一下HashMap. 原理 简单讲解下HashMap的原理:HashMap基于Hash算法,我 ...

  10. Effective C++ Item 33 避免遮掩继承过来的名称

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie ? 不懂 c++为什么derived classes 内的名称要遮掩 base classe ...