什么是解析?
在天然语言的学习过程,我的必定都学过语法,好比句子可以用主语、谓语、宾语来表示。在天然语言的处理过程当中。有不少应用场景都需要考虑句子的语法,所以研究语法解析变得很重要。
语法解析有两个基本的问题,其一是句子语法在计算机中的表达与存储方法。以及语料数据集;其二是语法解析的算法。
对于第一个问题,咱们可以用树状结构图来表示,例如如下图所看到的。S表示句子;NP、VP、PP是名词、动词、介词短语(短语级别);N、V、P各自是名词、动词、介词。
对于第二个问题,咱们需要有合适的算法来处理。这也是咱们本章将要讨论的内容。
上下文无关语法(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))。
这种上下文无关的语法可以很是easy的推导出一个句子的语法结构,但是缺点是推导出的结构可能存在二义性。好比如下两张图中的语法树都可以表示同一个句子。
常见的二义性问题有:1)单词的不一样词性,如can通常表示“可以”这个情态动词。有时表示罐子;2)介词短语的做用范围。如VP PP PP这种结构,第二个介词短语可能形容VP,也可能形容第一个PP;3)连续的名字,如NN NN NN。html
几率分布的上下文无关语法(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)连续短语(如名词、介词)的处理等。但总体来说它给语法解析提供了一种颇有效的实现方法。
版权声明:本文博主原创文章。博客,未经赞成不得转载。.net