什么是解析?

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

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

对于第一个问题,我们能够用树状结构图来表示,例如以下图所看到的。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. hdu1081(最大子矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 分析:a[i][j]代表第i行,前j个数据的和:那么由a[i][j]可得sum[k][long] ...

  2. 自己做站点(二) 20块钱搞定一个企业站:域名&空间申请

    域名注冊的话,推荐大家用新网,由于申请费用确实非常低,但续费的价格还是比較高的,所以不妨多申请几年.打开站点: http://www.xinnet.com/ 注冊一个帐号,然后申请域名,你能够看到,费 ...

  3. 编程算法 - 字典分词 代码(C)

    字典分词 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 给定字典, 给定一句话, 进行分词. 使用深度遍历(DFS)的方法. 使用一个參数string ...

  4. java获取当前日期时间代码总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值.  方法如下: 要使用 java.util.Date .获取当前时间的代码如下  代码如下 复制代码 Date date = new ...

  5. OpenStack_Swift源代码分析——ObjectReplicator源代码分析(2)

    1.Replicator运行代码具体分析 上篇问中介绍了启动Replicator的详细过程,以下解说Replicator的运行代码的详细实现,首先看replicate方法: def replicate ...

  6. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  7. visual studio 2013常用快捷键 VS2013快捷键大全

    visual studio 2013常用快捷键 VS2013快捷键大全   Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具 ...

  8. 工厂方法模式(factory method pattern)

    工厂方法模式相对于简单工厂模式的长处是为了更好的拓展,当假设再新加一种产品,对于简单工厂模式来说须要改动核心的工厂类,但对于工厂方法模式则不须要,在工厂方法模式中核心的工厂类不再负责创建全部产品的创建 ...

  9. 2010多校第一题 hdu3440House Man 差分约束系统

    给我们n座房子,房子的高度各不相同, 从最低的房子开始, 每次跳到更高的房子, 跳n-1次最能跳到最高的房子了,但是每次跳跃的距离不能超过d 将这些房子在一维的方向上重新摆放(但是保持输入时的相对位置 ...

  10. VS2010关于error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    前段时间自己的系统一直在安装更新.今天突然打开VS2010当运行的时候一直出现error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏这种错误.然后就百度 解决的方法: 1.项目\属 ...