【编译原理】Python自然语言处理中的语法分析

目录

一、实验目的

二、实验任务

三、实验原理

1  自然语言处理概述

2  Stanford Parser简介

四、实验过程

1 安装JDK

2 下载StanfordParser[3],配置环境变量

3 安装NLTK库,配置环境变量

4 使用Stanford Parser的PCFG算法进行句法分析

五、实验结果

1 任务一

2 任务二

参考资料

附录

1 任务1代码

2 任务2代码


一、实验目的

1、熟悉中文句法分析;

2、掌握如何使用Stanford Parser工具完成句法分析

二、实验任务

识别句子所包含的句法成分以及这些成分之间的关系,一般以句法树表示句法分析的结果。

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

2、对文本“我爱北京*。”进行句法分析。

三、实验原理

自然语言处理概述

句法分析[2]是自然语言处理(natural language processing, NLP)中的关键底层技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。常见的主流技术为基于统计的方法是现阶段句法分析的主流技术。常见的概率句法分析模型包括概率上下文无关模型、基于历史的句法分析模型、层次化渐进式的句法分析模型和中心词驱动的句法分析模型。综合多种模型而实现的句法分析器种类繁多,目前在开源中文句法分析器中比较具有代表性有Stanford parser和 Berkeley parser。前者基于因子模型,后者基于非词汇化分析模型。随着自然语言应用的日益广泛,特别是对文本处理需求的进一步增加,句法分析的作用愈加突出,它在机器翻译、信息检索与抽取、问答系统、语音识别等研究领域中都有重要的应用价值。

句法分析分为:句法结构分析和依存关系分析两种。这里主要采用语法树来表示句法分析的结果。

2  Stanford Parser简介

Stanford Parser[1]是由斯坦福大学自然语言小组开发的开源句法分析器,是基于概率统计句法分析的一个Java实现。该句法分析器目前提供了5个中文文法的实现。他的优点如下:

(1)既是一个高度优化的概率上下文无关文法和词汇化依存分析器,又是一个词汇化上下文无关文法分析器;

(2)以权威的并州树库作为分析器的训练数据,支持多语言。目前已经支持英文,中文,德文,意大利文,阿拉伯文等;

(3)提供了多样化的分析输出形式,出句法分析树外,还支持分词和词性标注、短语结构、依存关系等输出;

(4)内置了分词,词性标注,基于自定义树库的分析器训练等辅助工作。

(5)支持多平台,并封装了多种常用语言的接口,例如:java,python,php,ruby等。

本次实验基于Stanford Parser的Python接口进行实现。其中的缩写单词及含义见下表3.1.

表3.1 Stanford Parser缩写及含义对应表

缩写

含义

ROOT

要处理文本的语句;

IP

简单从句;

NP

名词短语

VP

动词短语

PN

代词

VV

动词

NN

常用名词

、实验过程

1 安装JDK

(1)下载JDK.

【编译原理】Python自然语言处理中的语法分析

图4.1 JDK压缩包

(2) 配置环境变量

【编译原理】Python自然语言处理中的语法分析

图4.2 配置环境变量

a.新建-->变量名-->”JAVA_HOME”,变量值-->JDK的安装路径

b.新建-->变量名-->”CLASSPATH”,变量值--> “%JAVA_HOME%\lib”

c.编辑-->变量名”Path”,增加变量值--> “%JAVA_HOME%\bin”

(3) 检验是否安装配置成功

输入cmd,进入dos界面,输入Java。如下图所示,安装配置成功。

【编译原理】Python自然语言处理中的语法分析

图4.3 JDK安装成功示意图

2 下载StanfordParser[3],配置环境变量

【编译原理】Python自然语言处理中的语法分析

图4.4  Stanford Parser 3.9.2

(1)需要三个文件:

  1. stanford-parser-3.9.2-models.jar
  2. stanford-parser.jar
  3. chinesePCFG.ser.gz(中文句法分析)

获取上述三个文件:解压刚下载的压缩包(stanford-parser-full-2018-10-17.zip),从中找到stanford-parser-3.9.2-models.jar和stanford-parser.jar文件。再将stanford-parser-3.9.2-models.jar文件解压,chinesePCFG.ser.gz文件就藏在stanford-parser-3.9.2-models.jar文件中,一直单击\edu\stanford\nlp\models\lexparser,找到chinesePCFG.ser.gz文件。

(2)配置环境变量:

Stanford NLP是由java开发的,Stanford Parser模型被包含在jar文件中。去访问该模型的最简单的方式是:将该jar文件放到java的CLASSPATH中。

将上述三个文件的路径放于CLASSPATH环境变量中,如下图所示:

【编译原理】Python自然语言处理中的语法分析

图4.5 配置环境变量

3 安装NLTK库,配置环境变量

由于我之前已经安装了nltk库,在Anaconda下可以搜索到,所以没重新进行安装,如下图所示。

【编译原理】Python自然语言处理中的语法分析

图4.6 nltk示意图

4 使用Stanford Parser的PCFG算法进行句法分析

Step 1:使用Jieba分词;

Step 2:采用中文PCFG算法进行句法分析。

五、实验结果

1 任务一

Jieba分词结果:'他 骑 自行车 去 了 菜市场';之后采用中文PCFG算法进行句法分析,句法树如下图所示:

【编译原理】Python自然语言处理中的语法分析

图5.1 任务1句法树

根据表3.1,由图5.1可知,任务一的例句的句法分析正确。‘他’为代词,‘骑’和‘去’为动词,‘自行车’和‘菜市场’为名词,‘了’为介词。但是,句法分析的前提是jieba分词一定要准确,因为我们进行此实验是基于jieba进行分词。

2 任务二

Jieba分词结果:'我 爱 北京 *';之后采用中文PCFG算法进行句法分析,句法树如下图所示:

 

【编译原理】Python自然语言处理中的语法分析

图5.2 任务2句法树

根据表3.1,由图5.2可知,任务二的例句的句法分析正确。‘我’为代词,‘爱’为动词,‘北京’和‘*’为名词。

参考资料

  1. Stanford Parser简介:https://blog.csdn.net/meiqi0538/article/details/82392403
  2. 自然语言处理概述:https://www.csdn.net/gather_27/MtTacg4sOTE1My1ibG9n.html
  3. Windows下StanfordParser的使用:https://blog.csdn.net/qq_41618091/article/details/97239505

附录

1 任务1代码

import jieba as jeb

string1="他骑自行车去了菜市场"

string2="我爱北京*"

 

seg_list=jeb.cut(string1,cut_all=False,HMM=True)

seg_str=' '.join(seg_list)

 

import os

from nltk.parse import stanford

 

root="D:\\Anaconda_App\\jar\\";

os.environ['STANFORD_PARSER'] = root+"stanford-parser.jar"

os.environ['STANFORD_MODELS'] = root+"stanford-parser-3.9.2-models.jar"

parser=stanford.StanfordParser(model_path=root+"chinesePCFG.ser.gz")

 

 

sent = parser.raw_parse(seg_str)

for line in sent:

    line.draw()

2 任务2代码

import jieba as jeb

string1="他骑自行车去了菜市场"

string2="我爱北京*"

 

seg_list=jeb.cut(string2,cut_all=False,HMM=True)

seg_str=' '.join(seg_list)

 

import os

from nltk.parse import stanford

 

root="D:\\Anaconda_App\\jar\\";

os.environ['STANFORD_PARSER'] = root+"stanford-parser.jar"

os.environ['STANFORD_MODELS'] = root+"stanford-parser-3.9.2-models.jar"

parser=stanford.StanfordParser(model_path=root+"chinesePCFG.ser.gz")

 

 

sent = parser.raw_parse(seg_str)

for line in sent:

    line.draw()

 

上一篇:java自然语言StanfordCoreNLP入门


下一篇:基于NLTK搭建stanford parser环境