什么是解析?

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

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

对于第一个问题,我们能够用树状结构图来表示,例如以下图所看到的。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. CSDN开源夏令营 百度数据可视化实践 ECharts(8)问题分析

    ECharts问题描写叙述: 问题就是折线图上的点是显示的,有人问能不能一開始不显示,当你点击的时候或者是当鼠标移动到上面的时候,折线上的点才显示? 例如以下图所看到的: 分析:让折线上的点不显示能够 ...

  2. Thinkphp常用标签

    告:在使用下列所说的任何标签库都需要 HTML第一行加入 <tarlib name=”cx,html” /> 如果想单独引入cx标签库就直接写成<tarlib name=”cx” / ...

  3. IOS开发应用

    IOS开发应用 我的第一个IOS开发应用 1. 需求描述 2. 开发环境介绍 3. 创建一个工程 4. 工程配置介绍 5. 目录结构介绍 6. 界面设置 7. 关联输入输出 8. 关联事件代码 9.  ...

  4. hdu5384(trie树)

    hdu5384 给定n个字符串Ai 给定m个字符串Bi 问所有的Bi在每个Ai中出现了多少次 很显然,对Bi建Trie图,然后每次用Ai去匹配的时候,不断查找当前匹配串的最长后缀,这样就能找到答案了 ...

  5. python学习之list

    list: 创建:list = [5,7,9] 取值和改值:list[1] = list[1] * 5 列表尾插入:list.append(4) 去掉第0个值并返回第0个值的数值:list.pop(0 ...

  6. java 配置及安装Eclipse

    jdk下载 点我~ Java SE Development Kit 8u20 You must accept the Oracle Binary Code License Agreement for ...

  7. Android分屏显示LogCat

    Eclipse里有非常多界面组件,文件列表.编辑区.类结构等等,在这么多界面组件里,再打开一个Logcat就基本没有什么空间了.与其挤在一起还不如分开成两个窗体. 或者你有两个屏幕,想一个屏幕编辑,一 ...

  8. SQL:多表关联采取这一纪录迄今为止最大

    笔者:iamlasong 1.需求 两个表,投递记录表和封发开拆记录表,如今想知道投递日期距最后一次封发日期天数分布情况. 对这个需求,须要先查询出投递明细,同一时候要知道相应的邮件最后一次封发情况. ...

  9. lua简洁的功能(两)

    Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...

  10. ORA-00913错误:PL/SQL: ORA-00913: too many values

    ORA-00913错误 描写叙述:PL/SQL: ORA-00913: too many values 目标:编写一个能够循环插入数据的脚本 操作过程: SQL> desc tcustmer N ...