什么是解析?

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

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

对于第一个问题,我们能够用树状结构图来表示,例如以下图所看到的。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. ARM裸编程系列---UART

    S5PV210 UART说明 通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER.它被用来传送串行数据.当发送数据,CPU将 ...

  2. CSS selectors for Selenium with example,selenium IDE

    CSS selectors for Selenium with example http://seleniumeasy.com/selenium-tutorials/css-selectors-tut ...

  3. ArrayList线程不安全?

    ArrayList是线程不安全的,轻量级的.如何使ArrayList线程安全? 1.继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchro ...

  4. JS数组追加数组採用push.apply的坑

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这样的自以为非常酷的,不须要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个非常大的 ...

  5. cocostudio内存释放

    在使用cocostudio时,在释放内存时能够这样做: 在onExit()方法里加入例如以下: void LoadLayer::onExit() { // 释放本对象自己 removeFromPare ...

  6. Linux进程间通信(九)---综合实验之有名管道通信实验

    实验目的 通过编写有名管道多路通信实验,进一步掌握管道的创建.读写等操作,同时复习使用select()函数实现管道的通信. 实验内容 这里采用管道函数创建有名管道(不是在控制台下输入命令mknod), ...

  7. EF一次请求公用一个实例

    应用场景: 我们在程序开发时,对数据库的操作是必不可少的部分,常规的做法是直接使用Using()语句块,在用完后立即释放连接资源,这种做法在桌面应用程序中毫无问题,但是在Web程序中,尤其是在当今大数 ...

  8. C#之网络

    首先很不好意思,前段时间把评论的功能给关掉啦,BUT NOW 此功能以开放,欢迎小伙伴们拍砖. 1网络 在网络环境下,我们最感兴趣的两个名称空间是System.Net和System.Net.Socke ...

  9. Beginning Python From Novice to Professional (4) - 演示样本格式字符串

    $ gedit price.py #!/usr/bin/env python width = input('Please enter width: ') price_width = 10 item_w ...

  10. Vs2012于Linux应用程序开发(4):公共财产的定义

    在嵌入式开发流程.有些参数基本上不改变,比如编译主机IP,username,password等参数.我们用VS提供的属性管理器来保存这些參数. 打开属性管理器: watermark/2/text/aH ...