循环语句的语法分析及语义分析程序设计

循环语句的语法分析及语义分析程序设计,第1张

目 录

1 课程任务书····································(2)

1问题描述·······································(3)

2文法及属性文法的描述···························(3)

2.1 while-do循环语句的文法·····················(3)

2.2while-do循环语句的结构翻译·················(3)

3语法分析及中间代码形式的描述···················(4)

3.1 语法分析方法·······························(4)

3.2 中间代码形式描述···························(4)

4简要的分析与概要设计···························(5)

4.1词法分析··································(5)

4.2递归下降翻译器的设计·······················(5)

4.3语法制导翻译·······························(5)

5 详细的算法描述································(6)

5.1 文法·······································(6)

5.2 查错·······································(6)

6 测试方法和测试结果···························(9)

6.1测试方法··································(9)

6.2测试结果··································(10)

7 设计的特点、不足、收获与体会·················(10)

7.1 设计的特点································(10)

7.2 不足、收获与体会··························(11)

8 参考文献·····································(11)

课程设计任务书

题 目: 循环语句的语法分析及语义分析程序设计(递归下降法)

1.目的

通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

2.设计内容及要求

WHILE〈布尔表达式〉DO〈赋值语句〉

其中

(1)学号29至32的同学按顺序分别选择递归下降法、LL(1)、算符优先分析法(或简单优先法)、LR法完成以上任务,中间代码选用四元式。

(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

3.课程设计报告书的内容应包括:

1.设计题目、班级、学号、姓名、完成日期;

2.给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法

3.及符号表和TOKEN代码的设计。

4.简要的分析与概要设计;

5.详细的算法描述;

6.源程序清单;

7.给出软件的测试方法和测试结果;

8.设计的评价、收获与体会。

4.时间安排:

第17周,周1-周4上午,周五全天

指导教师签名: 年月日

系主任(或责任教师)签名: 年月日

1问题描述

设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。

2文法及属性文法的描述。

2.1 while-do循环语句的文法

产生式为S->while E do A,为便于语法制导翻译将其改写如下:

文法G(s)如下:

S-->WEDG (意思是while E do G)

G-->c=R

R-->dTe|d

T-->+|-|*|/

E-->aFb

F-->>|==|<

2.2 whlie-do循环语句的结构翻译:

3.语法分析方法及中间代码形式的描述

3.1语法分析方法

递归下降法的实现思想是为文法的每个非终结符号设计一个相对应的递归子程序,识别程序由一组这样的子程序组成。

它的优点是简单直观,易于构造,很多编译系统所实现

缺点是对文法要求很高,由于递归调用多,影响分析器的效率

其文法可以表示为:

E→T│E+T

T→F│T*F

F→i│(E)

可以用语法图来表示语言的文法,如图:

E

T

F

3.2中间代码形式描述

中间代码采用四元式输出,一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。域op包含一个代表运算符的内部码。语句while a<b do a=a+b的四元式输出形式如下:

100 ( <, a , b , 102 )

101 ( j , _ , _ , 105 )

102 ( + , a , b , n )

103 ( = , n , _ , a )

104 ( j , _ , _ , 100)

105

4.简要的分析与概要设计

4.1词法分析

词法分析程序的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号的中间程序。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。

4.2递归下降翻译器的设计

1.:对每个非终结符A构造一个函数过程,对A的每个继承属性设置一个形式参数,函数的返回值为A的综合属性,A对应的函数过程中,为出现在A的产生式中的每一个文法符号的每一个属性都设置一个局部变量。非终结符A对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。

2:每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号,非3:终结符和语义动作分别做以下工作。

(1)对于带有综合属性x的终结符X,把x的值存入为X,x设置的变量中。然后产生一个匹配X的调用,并继续读入一个输入符号。

(2)对于每个非终结符号B,产生一个右边带有函数调用的赋值语句c=B(b1,b2,…,bk)

(3)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对应属性的每一次引用。

4.3语法制导翻译

在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。

5详细的算法描述

5.1 文法

/*

文法G(s)

s-->WEDG

G-->c=R

R-->dTe|d

T ->+|-|*|/|%E-->aFb

F-->>|==|<

*/

5.2 查错

按照递归下降法求Wa<bDa=a+b,程序的执行顺序应该是S()W()EF()D()G()R()T()

S()

void S()

{

printf("%d\tS-->WEDG\n",total)total++

W()

E()

}

W()

void W()

{

if(ch!='W')

{

printf("有非法字符%c请按回车返回!!",ch)

getchar()

getchar()

exit(1)

}

}

E()

void E()

{

ch=a[++i1]

if(ch!='a')

{

printf("有非法字符%c %c请按回车返回!!",ch)

getchar()

getchar()

exit(1)

}

printf("%d\tE-->aFb\n",total)total++

F()

}

F()

void F()

{

int i

ch=a[++i1]

i=i1+1

if(a[i]!='b')

{

printf("有非法字符%c请按回车返回!!",a[i])

getchar()

getchar()

exit(1)

}

switch(ch)

{

case '>':

printf("%d\tF-->>\n",total)total++

break

case '==':

printf("%d\tF-->==\n",total)total++

break

default:

printf("%d\tF--><\n",total)total++

break

}

D()

G()

}

D()

void D()

{

++i1

ch=a[++i1]

if(ch!='D')

{

printf("有非法字符%c请按回车返回!!",ch)

getchar()

getchar()

exit(1)}

ch=a[++i1]

}

G()

void G()

{

int i=i1+1

if(ch!='c'&&a[i]!='=')

{

printf("有非法字符%c %c请按回车返回!!",ch,a[i])

getchar()

getchar()

exit(1)

}

printf("%d\tG-->c=R\n",total)total++

R()

}

R()

void R()

{

int i

i=i1+1

i1=i1+2

ch=a[i1]

if(a[i]!='='&&ch!='d')

{

printf("有非法字符%c %c请按回车返回!!",a[i],ch)

getchar()

getchar()

exit(1)

}

else

{

if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/'))

{

printf("%d\tR-->dTe\n",total)total++

T()

}

else

{

printf("%d\tR-->d\n",total)total++

W()

E()

}

}

}

T()

void T()

{

ch=a[++i1]

switch(ch)

{

case '+':

printf("%d\tT-->+\n",total)total++

break

case '-':

printf("%d\tT-->-\n",total)total++

break

case '*':

printf("%d\tT-->*\n",total)total++

break

default:

printf("%d\tT-->/\n",total)total++

break

}

ch='#'

}

6测试方法和测试结果

6.1测试方法

在C++环境下,设计几个有代表的用例,进行测试,例如:输入语句Wa<bDa=a+b#(其中d表示do ,w表示while)。若得出的不是预期的结果,那么程序就出现问题。如果有问题的话就进行单步调试找到程序中出现的逻辑问题。

6.2测试结果

测试结果如下:

7设计的特点、不足、收获与体会

7.1设计的特点

本次设计是采用递归下降的方法对输入的while--do 循环语句进行语法,语义分析,并输出四元式。因此程序中充分体现了递归下降的思想。

7.2设计的不足,收获与体会

本次的设计的不足主要是我没将程序一般化,实现不了用户自动输入代码进行词法分析的四元式输出,此程序只能实现对Wa<bDa=a+b#的分析与四元式输出,由于我所设计的栈中只能一个字符一个字符的存放,因此只能用D W分别表示do while;而且我对语法制导翻译这一块很不熟悉,因此我始终不能用程序实现语法制导翻译输出四元式,于是根据自己的理解,直接把四元式写了出来。

本次课程设计巩固了我所学习的关于递归下降法这一方面的知识,并且使我对WHILE—DO循环语句也有了更深刻的理解,提高了我的动手能力。

8 课程设计参考资料

1张幸儿 《编译原理》(第二版)清华大学出版社

2何炎祥 《编译原理》华中理工大学出版社

3陈火旺 《程序设计语言编译原理》(第3版)国防工业出版社

本科生课程设计成绩评定表

班级:软件0701 姓名:周璐萍 学号:0120710680129

序号 评分项目 满分 实得分

1 学习态度认真、遵守纪律 10

2 设计分析合理性 10

3 设计方案正确性、可行性、创造性 20

4 设计结果正确性 40

5 设计报告的规范性 10

6 设计验收 10

总得分/等级

评语:

注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

源程序

#include <stdio.h>

#include<dos.h>

#include<stdlib.h>

#include<string.h>

char a[50],g[50][50]

char ch

int n1,i1=0,i2=0

int total=0

void S()

void D()

void G()

void W()

void E()

void R()

void T()

void F()

void main()

{

int j=0

printf("文法G(s)为:\n")

printf("s-->DGWE\n")

printf("G-->c=R\n")

printf("R-->dTe|d\n")

printf("T-->+|-|*|/\n")

printf("E-->aFb\n")

printf("F-->>|==|<\n")

printf("请输入while-do语句(D代表do,W代表while),并以#结束:\n")

do{

scanf("%c",&ch)

a[j]=ch

j++

}while(ch!='#')

n1=j

ch=a[0]

S()

printf("\n")

if (ch=='#')

{ printf("输出四元式为:\n")

printf("100 (<,a,b,102)\n")

printf("101 (j,_,_,105)\n")

printf("102 (+,a,b,n)\n")

printf("103 (=,n,_,a)\n")

printf("104 (j,_,_,100)\n")

printf("105\n")

}

else {

printf("error\n")

printf("press any key to continue..\n")

getchar()getchar()

return

}

printf("\n")

printf("press any key to continue..\n")

getchar()

getchar()

}

/*出错情况分析*/

void S()

{

printf("%d\tS-->WEDG\n",total)total++

W()

E()

}

void W()

{

if(ch!='W')

{

printf("有非法字符%c请按回车返回!!",ch)

getchar()

getchar()

exit(1)

}

}

void E()

{

ch=a[++i1]

if(ch!='a')

{

printf("有非法字符%c %c请按回车返回!!",ch)

getchar()

getchar()

exit(1)

}

printf("%d\tE-->aFb\n",total)total++

F()

}

void F()

{

int i

ch=a[++i1]

i=i1+1

if(a[i]!='b')

{

printf("有非法字符%c请按回车返回!!",a[i])

getchar()

getchar()

exit(1)

}

switch(ch)

{

case '>':

printf("%d\tF-->>\n",total)total++

break

case '==':

printf("%d\tF-->==\n",total)total++

break

default:

printf("%d\tF--><\n",total)total++

break

}

D()

G()

}

void D()

{ ++i1

ch=a[++i1]

if(ch!='D')

{ printf("有非法字符%c请按回车返回!!",ch)

getchar()

getchar()

exit(1)}

ch=a[++i1]

}

void G()

{ int i=i1+1

if(ch!='c'&&a[i]!='=')

{ printf("有非法字符%c %c请按回车返回!!",ch,a[i])

getchar()

getchar()

exit(1)}

printf("%d\tG-->c=R\n",total)total++

R()

}

void R()

{

int i

i=i1+1

i1=i1+2

ch=a[i1]

if(a[i]!='='&&ch!='d')

{

printf("有非法字符%c %c请按回车返回!!",a[i],ch)

getchar()

getchar()

exit(1)

}

else

{

if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/'))

{

printf("%d\tR-->dTe\n",total)total++

T()

}

else

{

printf("%d\tR-->d\n",total)total++

W()

E()

}

}

}

void T()

{

ch=a[++i1]

switch(ch)

{

case '+':

printf("%d\tT-->+\n",total)total++

break

case '-':

printf("%d\tT-->-\n",total)total++

break

case '*':

printf("%d\tT-->*\n",total)total++

break

default:

printf("%d\tT-->/\n",total)total++

break

}

ch='#'

}

指导教师签名:

2010 年 月 日

对于不同的语言单位,语义分析的任务各不相同。在词的层次上,语义分析的基本任务是进行 词义消歧(WSD) ,在句子层面上是 语义角色标注(SRL) ,在篇章层面上是 指代消歧 ,也称共指消解。

词义消歧

由于词是能够独立运用的最小语言单位,句子中的每个词的含义及其在特定语境下的相互作用构成了整个句子的含义,因此,词义消歧是句子和篇章语义理解的基础,词义消歧有时也称为词义标注,其任务就是确定一个多义词在给定上下文语境中的具体含义。

词义消歧的方法也分为有监督的消歧方法和无监督的消歧方法,在有监督的消歧方法中,训练数据是已知的,即每个词的词义是被标注了的;而在无监督的消歧方法中,训练数据是未经标注的。

多义词的词义识别问题实际上就是该词的上下文分类问题,还记得词性一致性识别的过程吗,同样也是根据词的上下文来判断词的词性。

有监督词义消歧根据上下文和标注结果完成分类任务。而无监督词义消歧通常被称为聚类任务,使用聚类算法对同一个多义词的所有上下文进行等价类划分,在词义识别的时候,将该词的上下文与各个词义对应上下文的等价类进行比较,通过上下文对应的等价类来确定词的词义。此外,除了有监督和无监督的词义消歧,还有一种基于词典的消歧方法。

在词义消歧方法研究中,我们需要大量测试数据,为了避免手工标注的困难,我们通过人工制造数据的方法来获得大规模训练数据和测试数据。其基本思路是将两个自然词汇合并,创建一个伪词来替代所有出现在语料中的原词汇。带有伪词的文本作为歧义原文本,最初的文本作为消歧后的文本。

有监督的词义消歧方法

有监督的词义消歧方法通过建立分类器,用划分多义词上下文类别的方法来区分多义词的词义。

基于互信息的消歧方法

基于互信息的消歧方法基本思路是,对每个需要消歧的多义词寻找一个上下文特征,这个特征能够可靠地指示该多义词在特定上下文语境中使用的是哪种语义。

互信息是两个随机变量X和Y之间的相关性,X与Y关联越大,越相关,则互信息越大。

这里简单介绍用在机器翻译中的Flip-Flop算法,这种算法适用于这样的条件,A语言中有一个词,它本身有两种意思,到B语言之后,有两种以上的翻译。

我们需要得到的,是B语言中的哪些翻译对应义项1,哪些对应义项2。

这个问题复杂的地方在于,对于普通的词义消歧,比如有两个义项的多义词,词都是同一个,上下文有很多,我们把这些上下文划分为两个等价类;而这种跨语言的,不仅要解决上下文的划分,在这之前还要解决两个义项多种词翻译的划分。

这里面最麻烦的就是要先找到两种义项分别对应的词翻译,和这两种义项分别对应的词翻译所对应的上下文特征,以及他们之间的对应关系。

想象一下,地上有两个圈,代表两个义项;这两个圈里,分别有若干个球,代表了每个义项对应的词翻译;然后这两个圈里还有若干个方块,代表了每个义项在该语言中对应的上下文。然后球和方块之间有线连着(球与球,方块与方块之间没有),随便连接,球可以连多个方块,方块也可以连多个球。然后,圈没了,两个圈里的球和方块都混在了一起,乱七八糟的,你该怎么把属于这两个圈的球和方块分开。

Flip-Flop算法给出的方法是,试试。把方块分成两个集合,球也分成两个集合,然后看看情况怎么样,如果情况不好就继续试,找到最好的划分。然后需要解决的问题就是,怎么判定分的好不好?用互信息。

如果两个上下文集(方块集)和两个词翻译集(球集)之间的互信息大,那我们就认为他们的之间相关关系大,也就与原来两个义项完美划分更接近。

实际上,基于互信息的这种方法直接把词翻译的义项划分也做好了。

基于贝叶斯分类器的消歧方法

基于贝叶斯分类器的消歧方法的思想与《浅谈机器学习基础》中讲的朴素贝叶斯分类算法相同,当时是用来判定垃圾邮件和正常邮件,这里则是用来判定不同义项(义项数可以大于2),我们只需要计算给定上下文语境下,概率最大的词义就好了。

根据贝叶斯公式,两种情况下,分母都可以忽略,所要计算的就是分子,找最大的分子,在垃圾邮件识别中,分子是P(当前邮件所出现的词语|垃圾邮件)P(垃圾邮件),那么乘起来就是垃圾邮件和当前邮件词语出现的联合分布概率,正常邮件同理;而在这里分子是P(当前词语所存在的上下文|某一义项)P(某一义项),这样计算出来的就是某一义项和上下文的联合分布概率,再除以分母P(当前词语所存在的上下文),计算出来的结果就是P(某一义项|当前词语所存在的上下文),就能根据上下文去求得概率最大的义项了。

基于最大熵的词义消歧方法

利用最大熵模型进行词义消歧的基本思想也是把词义消歧看做一个分类问题,即对于某个多义词根据其特定的上下文条件(用特征表示)确定该词的义项。

基于词典的词义消歧方法

基于词典语义定义的消歧方法

M. Lesk 认为词典中的词条本身的定义就可以作为判断其词义的一个很好的条件,就比如英文中的core,在词典中有两个定义,一个是『松树的球果』,另一个是指『用于盛放其它东西的锥形物,比如盛放冰激凌的锥形薄饼』。如果在文本中,出现了『树』、或者出现了『冰』,那么这个core的词义就可以确定了。

我们可以计算词典中不同义项的定义和词语在文本中上下文的相似度,就可以选择最相关的词义了。

基于义类词典的消歧方法

和前面基于词典语义的消歧方法相似,只是采用的不是词典里义项的定义文本,而是采用的整个义项所属的义类,比如ANMINAL、MACHINERY等,不同的上下文语义类有不同的共现词,依靠这个来对多义词的义项进行消歧。

无监督的词义消歧方法

严格地讲,利用完全无监督的消歧方法进行词义标注是不可能的,因为词义标注毕竟需要提供一些关于语义特征的描述信息,但是,词义辨识可以利用完全无监督的机器学习方法实现。

其关键思想在于上下文聚类,计算多义词所出现的语境向量的相似性就可以实现上下文聚类,从而实现词义区分。

语义角色标注概述

语义角色标注是一种浅层语义分析技术,它以句子为单位,不对句子所包含的予以信息进行深入分析,而只是分析句子的谓词-论元结构。具体一点讲,语义角色标注的任务就是以句子的谓词为中心,研究句子中各成分与谓词之间的关系,并且用语义角色来描述它们之间的关系。比如:

实际上就是填槽吧,找到句子中的时间、地点、施事者、受事者和核心谓词。

目前语义角色标注方法过于依赖句法分析的结果,而且领域适应性也太差。

自动语义角色标注是在句法分析的基础上进行的,而句法分析包括短语结构分析、浅层句法分析和依存关系分析,因此,语义角色标注方法也分为 基于短语结构树 的语义角色标注方法、 基于浅层句法分析结果 的语义角色标注方法和 基于依存句法分析结果 的语义角色标注方法三种。

它们的基本流程类似,在研究中一般都假定谓词是给定的,所要做的就是找出给定谓词的各个论元,也就是说任务是确定的,找出这个任务所需的各个槽位的值。其流程一般都由4个阶段组成:

候选论元剪除的目的就是要从大量的候选项中剪除掉那些不可能成为论元的项,从而减少候选项的数目。

论元辨识阶段的任务是从剪除后的候选项中识别出哪些是真正的论元。论元识别通常被作为一个二值分类问题来解决,即判断一个候选项是否是真正的论元。该阶段不需要对论元的语义角色进行标注。

论元标注阶段要为前一阶段识别出来的论元标注语义角色。论元标注通常被作为一个多值分类问题来解决,其类别集合就是所有的语义角色标签。

最终,后处理阶段的作用是对前面得到的语义角色标注结果进行处理,包括删除语义角色重复的论元等。

基于短语结构树的语义角色标注方法

首先是第一步,候选论元剪除,具体方法如下:

将谓词作为当前结点,依次考察它的兄弟结点:如果一个兄弟结点和当前结点在句法结构上不是并列的关系,则将它作为候选项。如果该兄弟结点的句法标签是介词短语,则将它的所有子节点都作为候选项。

将当前结点的父结点设为当前结点,重复上一个步骤,直至当前结点是句法树的根结点。

举个例子,候选论元就是图上画圈的:

经过剪除得到候选论元之后,进入论元识别阶段,为分类器选择有效的特征。人们总结出了一些常见的有效特征,比如谓词本身、路径、短语类型、位置、语态、中心词、从属类别、论元的第一个词和最后一个词、组合特征等等。

然后进行论元标注,这里也需要找一些对应的特征。然后后处理并不是必须的。

基于依存关系树的语义角色标注方法

该语义角色标注方法是基于依存分析树进行的。由于短语结构树与依存结构树不同,所以基于二者的语义角色标注方法也有不同。

在基于短语结构树的语义角色标方法中,论元被表示为连续的几个词和一个语义角色标签,比如上面图给的『事故 原因』,这两个词一起作为论元A1;而在基于依存关系树的语义角色标注方法中,一个论元被表示为一个中心词和一个语义角色标签,就比如在依存关系树中,『原因』是『事故』的中心词,那只要标注出『原因』是A1论元就可以了,也即谓词-论元关系可以表示为谓词和论元中心词之间的关系。

下面给一个例子:

句子上方的是原来的依存关系树,句子下方的则是谓词『调查』和它的各个论元之间的关系。

第一步仍然是论元剪除,具体方法如下:

将谓词作为当前结点

将当前结点的所有子结点都作为候选项

将当前结点的父结点设为当前结点,如果新当前结点是依存句法树的根结点,剪除过程结束,如果不是,执行上一步

论元识别和论元标注仍然是基于特征的分类问题,也有一些人们总结出来的常见特征。这里不详述。

基于语块的语义角色标注方法

我们前面知道,浅层语法分析的结果是base NP标注序列,采用的方法之一是IOB表示法,I表示base NP词中,O表示词外,B表示词首。

基于语块的语义角色标注方法将语义角色标注作为一个序列标注问题来解决。

基于语块的语义角色标注方法一般没有论元剪除这个过程,因为O相当于已经剪除了大量非base NP,也即不可能为论元的内容。论元辨识通常也不需要了,base NP就可以认为是论元。

我们需要做的就是论元标注,为所有的base NP标注好语义角色。与基于短语结构树或依存关系树的语义角色标注方法相比,基于语块的语义角色标注是一个相对简单的过程。

当然,因为没有了树形结构,只是普通序列的话,与前两种结构相比,丢失掉了一部分信息,比如从属关系等。

语义角色标注的融合方法

由于语义角色标注对句法分析的结果有严重的依赖,句法分析产生的错误会直接影响语义角色标注的结果,而进行语义角色标注系统融合是减轻句法分析错误对语义角色标注影响的有效方法。

这里所说的系统融合是将多个语义角色标注系统的结果进行融合,利用不同语义角色标注结果之间的差异性和互补性,综合获得一个最好的结果。

在这种方法中,一般首先根据多个不同语义角色标注结果进行语义角色标注,得到多个语义角色标注结果,然后通过融合技术将每个语义角色标注结果中正确的部分组合起来,获得一个全部正确的语义角色标注结果。

融合方法这里简单说一种基于整数线性规划模型的语义角色标注融合方法,该方法需要被融合的系统输出每个论元的概率,其基本思想是将融合过程作为一个推断问题处理,建立一个带约束的最优化模型,优化目标一般就是让最终语义角色标注结果中所有论元的概率之和最大了,而模型的约束条件则一般来源于人们根据语言学规律和知识所总结出来的经验。

除了基于整数线性规划模型的融合方法之外,人们还研究了若干种其他融合方法,比如最小错误加权的系统融合方法。其基本思想是认为,不应该对所有融合的标注结果都一视同仁,我们在进行融合时应当更多的信赖总体结果较好的系统。

END


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12086222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存