Python自然语言处理

一 如何使用形式化语法来描述无限的句子集合的结构?    --上下位无关文法

 
    1.1 一个例子: 
    grammar1 = nltk.parse_cfg("""
    S -> NP VP
    VP -> V NP | V NP PP
    PP -> P NP
    V -> "saw" | "ate" | "walked"
    NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
    Det -> "a" | "an" | "the" | "my"
    N -> "man" | "dog" | "cat" | "telescope" | "park"
    P -> "in" | "on" | "by" | "with"
    """)
 
    1.2 文法特点:
    简单,分析语句子结构时,无需考虑上下文信息。
 
    二 我们如何表示句子结构
 
    2.1 句法树
 alt
    这个图片所展示的句法树和下面的括号序列是一样的:
    (S (NP Mary) (VP (V saw) (NP Bob)))
 
    三 如何分析句子结构    --句法解析方法
 
    3.1 从规则入手
 
    3.1.1 递归下降分析
 
    3.1.1.1 介绍:
    枚举可能的树形结构,自上往下构建句法树。
alt
 
    3.1.1.2 特点:
 
    1) 无法处理一下类型的文法规则--bug!
    NP -> NP PP
    2) 漫无目的地枚举和重复计算--低效!
 
    3.2 从句子本身入手
 
    3.2.1 移近-规约分析
 
    3.2.1.1 介绍:
    移位-规约分析器反复将下一个输入词推到堆栈(见4.1 节),这是移位操作。如果堆栈
上的前n 项,匹配一些产生式的右侧的n 个项目,那么就把它们弹出栈,并把产生式左边的
项目压入栈。这种替换前n 项为一项的操作就是规约操作。此操作只适用于堆栈的顶部;规
约栈中的项目必须在后面的项目被压入栈之前做。当所有的输入都使用过,堆栈中只剩余一
个项目,也就是一颗分析树作为它的根的S 节点时,分析器完成。
alt
    3.2.1.2 特点
    1) 不回溯,没有多少无效枚举,以线性的复杂度扫一遍就结束--高效!
    2) 由于只是简单的扫描一遍,没有回溯过程,可能会错过某些可行解--舍弃召回率换取运行效率!
 
    3.3 流行做法--动态规划
 
    3.3.1 介绍:
    把整个输入句子当做一个一维空间(可以当成数轴),任意一个连续子串,可以由起始位置和长度确定,以连续子串为状态,求出每一个子串可能对应的最后规约出来的项。
    alt
 
    3.3.2 特点:
    1) 以空间换时间,保存中间结果,不做重复计算--高效!
    2) 可以计算出所有可能的结果--不存在召回率问题!
    
    四 一个句子可能会有多个可能的句法树    --歧义
    4.1 一个例子
 alt
 
   4.2 解决方法--概率上下文无关文法
   在刚才的计算过程中,中间状态加上一个权重,表示这个区间建立成某个非终结状态子树的可能性,最终得到权重最大的一颗完整的句法树
原文地址:https://www.cnblogs.com/tychyg/p/5277238.html