首页 百科知识 汉语句法分析

汉语句法分析

时间:2022-10-04 百科知识 版权反馈
【摘要】:句法分析是文本信息处理的核心基础工作之一,它是在词法分析的基础上对文本进行基于内容分析与处理的重要手段。句法分析并不面对最终用户,它属于文本信息处理的基础研究,是保证各种文本分析和应用系统能够在内容层面上处理自然语言的核心技术之一。各种机器学习方法的结合与使用,句法分析器的性能得以明显改善。Berkeley Parser是加州大学伯克利分校自然语言处理实验组开发的一个基于概率上下文无关文法的开源句法分析器。

实验目的

1.理解汉语句法分析的作用与意义。

2.了解并学习主流的句法分析方法。

3.掌握句法分析工具Stanford Parser的使用与调用方法。

实验内容

1.利用Stanford Parser进行句法分析并保存结果。

2.编写程序实现对批量数据进行句法分析。

3.编写程序实现分词、句法分析功能的集成。

预备知识

一、句法分析

句法分析是文本信息处理的核心基础工作之一,它是在词法分析的基础上对文本进行基于内容分析与处理的重要手段。句法分析的主要任务是根据给定的语法,自动识别出句子所包含的句法单位以及这些单位之间的关系,通常是以句法树的形式来表示句法分析的结果。

句法分析的主要目的有两个:第一是确定句子所包含的“谱系”结构;第二是明确句子的组成成份之间的关系。例如,利用哈尔滨工业大学的语言技术平台对句子“扬州市江都区曾经是长江下游的一个县级市。”进行句法分析,结果可以表示为图13.1。

图13.1 哈尔滨工业大学语言技术平台句法分析结果示例

二、句法分析的应用

句法分析并不面对最终用户,它属于文本信息处理的基础研究,是保证各种文本分析和应用系统能够在内容层面上处理自然语言的核心技术之一。它在机器翻译、信息检索、信息过滤、信息抽取和语音识别等众多应用领域中都具有非常广泛的应用前景。

三、句法分析分类

句法分析的方法可以简单地分为基于规则的方法和基于统计的方法两类。基于规则的方法需要专家构建规则,在遇到大规模真实文本时,会因为语法规则覆盖度有限而出现效果差的问题。此外,基于规则的方法开发的系统的可迁移性也比较差。

随着大规模标注树库的出现和共享(例如,宾州树库、清华句法树库、台湾“中研院”树库等),基于统计模型的句法分析方法开始兴起。各种机器学习方法的结合与使用,句法分析器的性能得以明显改善。统计句法分析模型本质上是一套面向候选树的筛选方法,它设置句法树的定量评价值,然后从各种候选句法树中找出最有可能的句法树作为结果。

四、主要难点

句法分析有两个主要难点:第一是歧义问题,在指定的语法下,一个句子往往有很多种句法分析结果,如何选择最优的结果是个难点;第二是搜索空间巨大的问题,句法分析的搜索空间和句子的长度存在指数级的增长关系,如何提高效率从而服务于实用系统也是个难点。

五、句法分析的评测

句法评测分析的主要指标有准确率、召回率、交叉括号数。准确率是指分析正确的短语个数在句法分析的整个结果中所占的比重,也就是分析结果中和标准句法树中的短语完全匹配的个数占分析结果中所有短语个数的比例。召回率是指分析得到正确的短语个数在标准分析树全部短语个数所占的比例。交叉括号表示分析得到的某一个短语的覆盖范围与标准句法分析结果的某个短语的覆盖范围存在重叠且不存在包含关系(即构成了一个交叉括号)。

实验原理

一、Stanford Parser

斯坦福大学自然语言处理组(http://nlp.stanford.edu/)是世界知名的NLP研究团队,他们提供了一系列开源的基于Java的文本分析工具,Stanford Parser是其中的句法分析工具(http://nlp.stanford.edu/software/lex-parser.html)。

Stanford Parser是一款开源的、基于词典依存句法分析和统计模型的句法分析工具。词典依存语法分析的作用是给出句子内部各个成分之间的相互依赖性;而统计模型的作用是去歧和筛选,试图从多个分析结果中寻找出最优答案。

Stanford Parser设计时将功能和模型分离,同样的程序使用不同的模型就可以支持不同的语言,因此下载该工具时需要同时下载中文句法分析的模型包。它使用之前需要首先对句子做好分词工作,各个分词单元间以空格符分隔。分析结果可以将句子的整体结构进行树形展示,其中叶子节点为各个分词单元。图13.2是利用Stanford Parser对句子“扬州市江都区曾经是长江下游的一个县级市。”进行分析后的结果图,该结果也可以用文本格式输出如下:

(ROOT(IP(NP(NP(NR扬州市))(NP(NN江都区)))(VP(ADVP(AD曾经))(VP(VC是) (NP(DNP(NP(NP(NR长江))(NP(NN下游)))(DEG的))(QP(CD一个))(ADJP(JJ县级))(NP(NN市)))))(PU。)))

图13.2 Stanford Parser的分析结果示例

为了支持不同的需求,Stanford Parser可以通过命令行和API两种形式调用该句法分析工具。同时提供了大量用于显示句子内部各分词单元间依赖关系的接口函数,用来描述句子中某两个词之间的依赖关系。

表13.1列出了Stanford Parser中常见的标注以及含义,更加全面的描述可以参见官方文档。

表13.1 Stanford Parser的常见标注以及含义

二、哈尔滨工业大学语言技术平台

哈尔滨工业大学语言技术平台(Language Technology Platform,LTP)是哈尔滨工业大学社会计算与信息检索研究中心提供的一整套开放中文自然语言处理系统。LTP首先设计了基于XML的语言处理结果表示形式,然后在此基础上提供了一整套丰富、高效、高精度的中文自然语言处理模块、应用程序接口、可视化工具以及能够以网络服务使用的语言技术云。借助于LPT可以方便地实现句法分析,可以在https://github.com/HIT-SCIR/ltp上下载到该软件的完整源程序。图13.3是LTP平台的在线演示界面示例,从中可以很容易看出句法分析只是该平台的子功能之一。

图13.3 哈尔滨工业大学LTP平台的在线演示界面

三、Berkeley Parser

Berkeley Parser是加州大学伯克利分校自然语言处理实验组开发的一个基于概率上下文无关文法的开源句法分析器。它不仅支持英文、中文、德文、阿拉伯文、保加利亚文、法文等多个语种,同时具有较高的句法分析性能、准确率较高、可选参数较多、运行速度快等优点。在http://code.google.com/p/berkeleyparser/上可以下载到最新版的Berkeley Parser。

四、Ctbparser

Ctbparser是一个用C++语言实现的开源的中文处理工具包,可以用于分词、词性标注、依存句法分析,它采用的是中文宾州树库(Chinese Tree Bank,CTB)标准。它的一个很大优点是用户可以自行编辑词条以改善分词、词性标注效果。在http://sourceforge. net/projects/ctbparser/上可以下载到该软件。

实验环境

一、操作系统

Windows2000以上版本,例如,Windows2000/XP/Vista/7/8/8.1/10等。

二、开发环境

任意Java语言集成开发环境,例如,Netbean、Eclipse、MyEclipse等。

实验步骤

一、使用Stanford Parser附带的图形界面进行句法分析

1.下载Stanford Parser程序和Chinese Models文件。

本书以Stanford Parser version 3.6.0和2016-01-19的Chinese Model文件为例进行操作,将下载后的文件解压到同一文件。本实验设解压后存储的路径为E:\NLP\stanford-parser-full-2015-12-09。

2.准备待句法分析句子。

利用Windows附带的记事本输入待句法分析的句子,其中的词组之间以空格分开,文件保存时采用UTF-8编码。

3.运行lexparser-gui.bat文件。

在运行的界面中单击【Load File】项选择待分析的文件,然后单击【Load Parser】定位Chines Model文件并选择使用的具体句法模型,运行界面参见图13.4。

图13.4 选择Chinese Model中的具体句法模型

4.进行句法分析。

选择好具体句法模型后,单击【Parse】按钮,系统将进行分析并在下方显示分析结果,具体界面参见图13.5。

图13.5 句法分析的结果

5.保存句法分析结果。

单击【Save Output】按钮可以保存句法分析结果为文本文件。

二、在命令行使用Stanford Parser进行句法分析

在图形界面使用句法分析器的优点是简单方便,缺点是需要用户不断交互,因此可以通过命令行快速调用句法分析功能。

1.使用批处理调用。

Stanford Parser已经提供了一个批处理文件lexparser.bat,使用方法如下:

lexparser待句法分析文件

这样就可以把指定文件中的句子的句法分析的结果显示在控制台窗口。如果需要把运行结果写入到文件,可以使用操作系统的重定向功能。

2.定制调用。

由于每个计算机的内存信息以及待使用的句法模型库的差异,可以直接用java命令来定制调用句法分析功能。如下的命令行就是表示读取F盘的in.txt文件,使用1G内存,利用中文PCFG句法模型进行句法分析,分析的结果以宾州树库的依存句法格式写入到F盘的out.txt文件中,图13.6显示了该命令行的运行结果。

java-mx1024m-cp"*;"edu.stanford.nlp.parser.lexparser.Lexicalized Parser

-outputFormat"penn,typedDependencies"

edu\stanford\nlp\models\lexparser\chinese PCFG.ser.gzf:\in.txt>f:\out.txt

图13.6 使用命令行进行句法分析的结果实例

三、在Java程序中调用Stanford Parser进行句法分析

如果有多个文件中的文本需要句法分析处理,可以通过多次调用命令行来加以解决,但每次进程的加载和释放都需要时间,因此效率低下。如果能够在程序中调用Stan-ford Parser进行批量处理,不仅效率得到提高,而且和具体的应用完全融合。

为便于用户在程序中调用,官方提供了两个Stanford Parser的调用源代码实例,本文对该实例加了简要注释,便于理解。

import java.util.Collection;

import java.util.List;

import java.io.StringReader;

import edu.stanford.nlp.process.Tokenizer;

import edu.stanford.nlp.process.TokenizerFactory;

import edu.stanford.nlp.process.CoreLabelTokenFactory;

import edu.stanford.nlp.process.DocumentPreprocessor;

import edu.stanford.nlp.process.PTBTokenizer;

import edu.stanford.nlp.ling.CoreLabel;

import edu.stanford.nlp.ling.HasWord;

import edu.stanford.nlp.ling.Sentence;

import edu.stanford.nlp.trees.*;

import edu.stanford.nlp.parser.lexparser.LexicalizedParser;

class ParserDemo{

/**

*The main method demonstrates the easiest way to load a parser.

*Simply call loadModel and specify the path of a serialized grammar

*model,which can be a file,a resource on the classpath,or even a URL.

*For example,this demonstrates loading a grammar from the models jar

*file,which you therefore need to include on the classpath for ParserDemo

*to work.

*

*Usage:{@code java ParserDemo[[model]textFile]}

*e.g.:java ParserDemo edu/stanford/nlp/models/lexparser/chineseFactored.ser.gzdata/

chinese-onesent-utf8.txt

*/

public static void main(String[]args){

String parserModel="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz";

//默认的模型文件

if(args.length>0){

//如果命令行有模型参数则以参数中的为准

parserModel=args[0];

LexicalizedParser lp=LexicalizedParser.loadModel(parserModel);

//加载模型

if(args.length==0){//如果命令行无待分析的文件,则系统简单演示

demoAPI(lp);

}else{

String text File=(args.length>1)?args[1]:args[0];

demoDP(lp,textFile);

//调用句法分析处理函数

/**

*demoDP demonstrates turning a file into tokens and then parse

*trees. Note that the trees are printed by calling pennPrint on

*the Tree object. It is also possible to pass a PrintWriter to

*pennPrint if you want to capture the output.

*This code will work with any supported language.

*/

public static void demoDP(LexicalizedParser lp,String filename){

//This option shows loading,sentence-segmenting and tokenizing

//a file using DocumentPreprocessor.

TreebankLanguagePack tlp=lp.treebankLanguagePack();

//a PennTreebankLanguagePack for English

GrammaticalStructureFactory gsf=null;

if(tlp.supportsGrammaticalStructures()){

gsf=tlp.grammaticalStructureFactory();

//加载句法信息

//You could also create a tokenizer here(as below)and pass it

//to DocumentPreprocessor

for(List<HasWord>sentence:new DocumentPreprocessor(filename)){

Tree parse=lp.apply(sentence);

//逐句处理

parse.pennPrint();

System.out.println();

if(gsf!=null){

GrammaticalStructure gs=gsf.newGrammaticalStructure(parse);

Collection tdl=gs.typedDependenciesCCprocessed();

System.out.println(tdl);

System.out.println();

/**

*demoAPI demonstrates other ways of calling the parser with

*already tokenized text,or in some cases,raw text that needs to

*be tokenized as a single sentence. Output is handled with a

*TreePrint object. Note that the options used when creating the

*TreePrint can determine what results to print out. Once again,

*one can capture the output by passing a PrintWriter to

*TreePrint.printTree.This code is for English.

*/

public static void demoAPI(LexicalizedParser lp){

//This option shows parsing a list of correctly tokenized words

String[]sent={"This","is","an","easy","sentence","."};

List<CoreLabel>rawWords=Sentence.toCoreLabelList(sent);

Tree parse=lp.apply(rawWords);//句法分析

parse.pennPrint();

System.out.println();

//This option shows loading and using an explicit tokenizer

String sent2="This is another sentence.";

TokenizerFactory<CoreLabel>tokenizerFactory=

PTBTokenizer.factory(new CoreLabelTokenFactory(),"");

Tokenizer<CoreLabel>tok=

tokenizerFactory.getTokenizer(new StringReader(sent2));

List<CoreLabel>rawWords2=tok.tokenize();

parse=lp.apply(rawWords2);//句法分析

TreebankLanguagePack tlp=lp.treebankLanguagePack();

//PennTreebankLanguagePack for English

GrammaticalStructureFactory gsf=tlp.grammaticalStructureFactory();

GrammaticalStructure gs=gsf.newGrammaticalStructure(parse);

List<TypedDependency>tdl=gs.typedDependenciesCCprocessed();

System.out.println(tdl);

System.out.println();

//You can also use a TreePrint object to print trees and dependencies

TreePrint tp=new TreePrint("penn,typedDependenciesCollapsed");

tp.printTree(parse);//输出句法树

private ParserDemo(){}//static methods only

请修改与完善上述代码,使得程序可以把一个文件夹下所有的扩展名为“txt”的分词后的文本文件进行句法分析,分析后的结果文件为原文件名之后添加”.par”。

思考题

1.请用1~2个例子测试中文句法分析工具对短句和长句的效果。

2.请用1~2个例子测试中文句法分析工具对新闻文本和网络论坛回复的分析结果。

3.请整合中文分词和句法分析程序,使其可以对一个文件夹中的指定编码(ANSI、UTF-8或Unicode)的所有文本文件,依次自动进行分词和句法分析,并保存最后结果。

参考文献

[1]王步康,王红玲,袁晓虹,等.基于依存句法分析的中文语义角色标注[J].中文信息学报, 2010(01):25-29,47.

[2]王鑫,孙薇薇,穗志方.基于浅层句法分析的中文语义角色标注研究[J].中文信息学报,2011 (01):116-122.

[3]米海涛,熊德意,刘群.中文词法分析与句法分析融合策略研究[J].中文信息学报,2008 (02):10-17.

[4]孟遥,李生,赵铁军,等.四种基本统计句法分析模型在汉语句法分析中的性能比较[J].中文信息学报,2003(03):1-8.

[5]孟遥,李生,赵铁军,等.基于统计的句法分析技术综述[J].计算机科学,2003(09):54-58.

[6]吴伟成,周俊生,曲维光.基于统计学习模型的句法分析方法综述[J].中文信息学报,2013 (03):9-19.

[7]林颖,史晓东,郭锋.一种基于概率上下文无关文法的汉语句法分析[J].中文信息学报,2006 (02):1-7,32.

[8]文勖,张宇,刘挺,等.基于句法结构分析的中文问题分类[J].中文信息学报,2006(02):33-39.

[9]曹海龙,赵铁军,李生.基于词汇化模型的汉语句法分析[J].电子与信息学报,2007(09):2082-2085.

[10]汤艳莉,耿骞.汉语自然语言检索中的句法分析方法[J].情报理论与实践,2004(03):245-248.

[11]张春祥,栾博,高雪瑶,等.基于句法分析的汉语词义消歧[J].计算机应用研究,2014(01):40-42.

[12]Wanxiang Che,Zhenghua Li,Ting Liu.LTP:A Chinese Language Technology Platform.In Pro-ceedings of the Coling 2010:Demonstrations.2010.08,pp13-16,Beijing,China.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈