目录
4 使用Stanford Parser的PCFG算法进行句法分析
一、实验目的
1、熟悉中文句法分析;
2、掌握如何使用Stanford Parser工具完成句法分析
二、实验任务
识别句子所包含的句法成分以及这些成分之间的关系,一般以句法树表示句法分析的结果。
1、对“他骑自行车去了菜市场。”进行句法分析。
2、对文本“我爱北京*。”进行句法分析。
三、实验原理
1 自然语言处理概述
句法分析[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.
图4.1 JDK压缩包
(2) 配置环境变量
图4.2 配置环境变量
a.新建-->变量名-->”JAVA_HOME”,变量值-->JDK的安装路径
b.新建-->变量名-->”CLASSPATH”,变量值--> “%JAVA_HOME%\lib”
c.编辑-->变量名”Path”,增加变量值--> “%JAVA_HOME%\bin”
(3) 检验是否安装配置成功
输入cmd,进入dos界面,输入Java。如下图所示,安装配置成功。
图4.3 JDK安装成功示意图
2 下载StanfordParser[3],配置环境变量
图4.4 Stanford Parser 3.9.2
(1)需要三个文件:
- stanford-parser-3.9.2-models.jar
- stanford-parser.jar
- 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环境变量中,如下图所示:
图4.5 配置环境变量
3 安装NLTK库,配置环境变量
由于我之前已经安装了nltk库,在Anaconda下可以搜索到,所以没重新进行安装,如下图所示。
图4.6 nltk示意图
4 使用Stanford Parser的PCFG算法进行句法分析
Step 1:使用Jieba分词;
Step 2:采用中文PCFG算法进行句法分析。
五、实验结果
1 任务一
Jieba分词结果:'他 骑 自行车 去 了 菜市场';之后采用中文PCFG算法进行句法分析,句法树如下图所示:
图5.1 任务1句法树
根据表3.1,由图5.1可知,任务一的例句的句法分析正确。‘他’为代词,‘骑’和‘去’为动词,‘自行车’和‘菜市场’为名词,‘了’为介词。但是,句法分析的前提是jieba分词一定要准确,因为我们进行此实验是基于jieba进行分词。
2 任务二
Jieba分词结果:'我 爱 北京 *';之后采用中文PCFG算法进行句法分析,句法树如下图所示:
图5.2 任务2句法树
根据表3.1,由图5.2可知,任务二的例句的句法分析正确。‘我’为代词,‘爱’为动词,‘北京’和‘*’为名词。
参考资料
- Stanford Parser简介:https://blog.csdn.net/meiqi0538/article/details/82392403
- 自然语言处理概述:https://www.csdn.net/gather_27/MtTacg4sOTE1My1ibG9n.html
- 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() |