Python与自然语言处理——句法分析

Python与自然语言处理——句法分析

  • 句法分析
    • 句法分析简介
    • 数据集与评测方法
        • 数据集
        • 评测方法
    • 句法分析的常用方法
        • 基于PCFG的句法分析
        • 基于最大间隔马尔可夫网络的句法分析
        • 基于CRF的句法分析
        • 基于移进-归约的句法分析模型
    • 使用Stanford Parser的PCFG算法实现句法分析
        • Stanford Parser
        • 简单示例
            • 完整代码
            • 参考文献

句法分析

句法分析是机器翻译的核心数据结构,是对语言进行深层次理解的基石。

句法分析简介

  • 主要任务
    识别句子中所包含的句法成分以及这些成分之间的关系,一般以句法树来表示句法分析的结果。
  • 主要难点
    • 歧义
    • 搜索空间
  • 句法分析分类
    • 完全句法分析:企图获取整个句子的句法结构
    • 部分句法分析:只关注局部的一些成分
  • 相关方法
    • 基于规则
      • 存在着语法规则覆盖有限、系统可迁移差等缺陷
    • 基于统计(主流)

数据集与评测方法

数据集

与别的语言处理所需要的数据集不同,句法分析需要的是一种树形的标注结构,又称为树库,如下图所示:
Python与自然语言处理——句法分析_第1张图片
最常使用的树库为美国宾夕法尼亚大学的英文宾州树库PTB,中文树库则包括CTB、TCT和台湾中研院树库

评测方法

主要任务是评测句法分析生成的树结构与手工标记的树结构之间的相似性程度。

  • 满意度:测试句法分析器是否适合或胜任某个特定的自然语言处理任务
  • 效率:运行时间

主流的评测方法是PARSEVAL评测体系,主要考察准确率、召回率、交叉括号数。其中交叉括号表示分析得到的某一个短语的覆盖范围与标准句法分析结果的某个短语的覆盖范围存在交叉又不包含的关系,即构成一个交叉括号。

句法分析的常用方法

基于PCFG的句法分析

  • PCFG基于概率的短语结构分析方法,是一种上下文无关文法的扩展
  • PCFG处理的问题
    • 计算分析树的概率值
    • 若一个句子有多个分析树,依据概率进行排序
    • 可用来进行句法排歧
  • PCFG五元组表示 ( X , V , S , R , P ) \left( {X,V,S,R,P} \right) (X,V,S,R,P)
    • X X X是一个有限词汇的集合(词典),其元素称为词汇或终结符
    • V V V是一个有限标注的集合,称为非终结符
    • S S S包含于 V V V,称为文法的开始符号
    • R R R是有序对 ( α , β ) \left( {\alpha ,\beta } \right) (α,β)的集合,也就是产生的规则集
    • P P P表示每个产生规则的统计概率
  • PCFG运算表示
    • 形式: A → α , P A \to \alpha ,P Aα,P
    • 约束: ∑ α P ( A → α ) \sum\nolimits_\alpha {P\left( {A \to \alpha } \right)} αP(Aα)

基于最大间隔马尔可夫网络的句法分析

  • 基于最大间隔马尔可夫网络的句法分析是一种判别式的句法分析方法,通过丰富特征来消除歧义
  • 判别函数:
    f x ( x ) = arg ⁡ max ⁡ y ∈ G ( x ) ⟨ w , Φ ( x , y ) ⟩ {f_x}\left( x \right) = \arg {\max _{y \in G\left( x \right)}}\left\langle {w,\Phi \left( {x,y} \right)} \right\rangle fx(x)=argyG(x)maxw,Φ(x,y)
    其中 Φ ( x , y ) \Phi \left( {x,y} \right) Φ(x,y)表示与 x x x相对应的句法树 y y y的特征向量, w w w表示特征权重

基于CRF的句法分析

  • 将句法分析作为序列标注问题来解决,可以使用CRF模型
  • 也是判别式方法,需要融合大量特征
  • 与PCFG的区别
    • 概率计算方法和概率归一化方法不同
    • CRF模型最大化的是句法树的条件概率而非联合概率

基于移进-归约的句法分析模型

  • 移进-规约法是一种自下而上的方法,操作的基本数据结构是堆栈
  • 主要操作( S S S表示句法树的根节点)
    • 移进:从句子左端将一个终结符移至栈顶
    • 归约:根据规则,将栈顶的若干字符替换为一个字符
    • 接收:句子中所有词都已入栈,且栈中只剩下一个符号 S S S,则分析成功
    • 拒绝:句子中所有词都已入栈,且栈中并非只有一个符号 S S S,也无法进行任何归约操作,则分析失败

使用Stanford Parser的PCFG算法实现句法分析

Stanford Parser

  • Stanford Parser是基于Java的,所以需要jdk环境
  • Stanford Parser是封装在nltk库中实现的,所以要先安装nltk
  • 需要下载Stanford Parser的jar包:https://nlp.stanford.edu/software/lex-parser.shtml#Download

简单示例

我们对“他骑自行车去了菜市场”进行句法分析。

  • 分词
    这里我们采用Jieba分词,代码如下:
######Jieba分词######
import jieba
string='他骑自行车去了菜市场。'
seg_list=jieba.cut(string,cut_all=False,HMM=True)
seg_str=' '.join(seg_list)
print(seg_str)

结果如下所示:


他 骑 自行车 去 了 菜市场 。


  • PCFG句法分析
    下面进行句法分析,代码如下所示:
######PCFG句法分析######
from nltk.parse import stanford
import os

root='./stanford-parser-full-2018-10-17/'
parser_path=root+'stanford-parser.jar'
model_path=root+'stanford-parser-3.9.2-models.jar'

##PCFG模型路径
pcfg_path='edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz'

parser=stanford.StanfordParser(path_to_jar=parser_path,path_to_models_jar=model_path,model_path=pcfg_path)

sentence=parser.raw_parse(seg_str)
for line in sentence:
    print(line)
    line.draw()
完整代码

https://github.com/canshang/python-nlk/blob/master/句法分析.ipynb

参考文献

《Python与自然语言处理》

你可能感兴趣的:(Python与自然语言处理)