七、文法分析还是基于特征好啊

本文探讨了语法分析与文法分析的区别,介绍了基于特征的文法分析方法,该方法适用于处理自然语言处理中广泛的语言学现象。文章还详细解析了NLTK库中的特征结构及其在文法分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法分析固然重要,但要想覆盖语言的全部,需要进一步扩展到文法分析,文法分析可以基于规则,但是工作量难以想象,基于特征的文法分析不但可穷举,而且可以方便用计算机存储和计算,本节简单做一个介绍,更深层次的内容还需要继续关注后面的系列文章

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

语法和文法

还记得上一节中的这个吗?

 
  1. (S

  2. (NP 小明)

  3. (VP

  4. (V 追赶)

  5. (NP

  6. (Det 一只)

  7. (N 兔子))))

这里面的N表示名词,Det表示限定词,NP表示名词短语,V表示动词,VP表示动词短语,S表示句子

这种句子分析方法叫做语法分析

因为句子可以无限组合无限扩展,所以单纯用语法分析来完成自然语言处理这件事情是不可能的,所以出现了文法分析

文法是一个潜在的无限的句子集合的一个紧凑的特性,它是通过一组形式化模型来表示的,文法可以覆盖所有结构的句子,对一个句子做文法分析,就是把句子往文法模型上靠,如果同时符合多种文法,那就是有歧义的句子

最重要的结论:文法结构范围相当广泛,无法用规则类的方法来处理,只有利用基于特征的方法才能处理

 

文法特征结构

文法特征举例:单词最后一个字母、词性标签、文法类别、正字拼写、指示物、关系、施事角色、受事角色

因为文法特征是一种kv,所以特征结构的存储形式是字典

不是什么样的句子都能提取出每一个文法特征的,需要满足一定的条件,这需要通过一系列的检查手段来达到,包括:句法协议(比如this dog就是对的,而these dog就是错的)、属性和约束、术语

 

特征结构的处理

nltk帮我实现了特征结构:

 
  1. >>> import nltk

  2. >>> fs1 = nltk.FeatStruct(TENSE='past', NUM='sg')

  3. >>> fs1

  4. [NUM='sg', TENSE='past']

  5. >>> fs2 = nltk.FeatStruct(POS='N', AGR=fs1)

  6. >>> fs2

  7. [AGR=[NUM='sg', TENSE='past'], POS='N']

在nltk的库里已经有了一些产生式文法描述可以直接使用,位置在:

 
  1. [root@centos $] ls ~/nltk_data/grammars/book_grammars

  2. background.fol discourse.fcfg drt.fcfg feat0.fcfg feat1.fcfg german.fcfg simple-sem.fcfg sql0.fcfg sql1.fcfg storage.fcfg

我们看其中最简单的一个sql0.fcfg,这是一个查找国家城市的sql语句的文法:

 
  1. % start S

  2.  
  3. S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]

  4.  
  5. VP[SEM=(?v + ?pp)] -> IV[SEM=?v] PP[SEM=?pp]

  6. VP[SEM=(?v + ?ap)] -> IV[SEM=?v] AP[SEM=?ap]

  7. NP[SEM=(?det + ?n)] -> Det[SEM=?det] N[SEM=?n]

  8. PP[SEM=(?p + ?np)] -> P[SEM=?p] NP[SEM=?np]

  9. AP[SEM=?pp] -> A[SEM=?a] PP[SEM=?pp]

  10.  
  11. NP[SEM='Country="greece"'] -> 'Greece'

  12. NP[SEM='Country="china"'] -> 'China'

  13.  
  14. Det[SEM='SELECT'] -> 'Which' | 'What'

  15.  
  16. N[SEM='City FROM city_table'] -> 'cities'

  17.  
  18. IV[SEM=''] -> 'are'

  19. A[SEM=''] -> 'located'

  20. P[SEM=''] -> 'in'

解释一下

这里面从上到下是从最大范围到最小范围一个个的解释,S是句子

我们来加载这个文法描述,并试验如下:

 
  1. import nltk

  2. from nltk import load_parser

  3. cp = load_parser('grammars/book_grammars/sql0.fcfg')

  4. query = 'What cities are located in China'

  5. tokens = query.split()

  6. for tree in cp.parse(tokens):

  7. print tree

输出结果如下:

 
  1. (S[SEM=(SELECT, City FROM city_table, WHERE, , , Country="china")]

  2. (NP[SEM=(SELECT, City FROM city_table)]

  3. (Det[SEM='SELECT'] What)

  4. (N[SEM='City FROM city_table'] cities))

  5. (VP[SEM=(, , Country="china")]

  6. (IV[SEM=''] are)

  7. (AP[SEM=(, Country="china")]

  8. (A[SEM=''] located)

  9. (PP[SEM=(, Country="china")]

  10. (P[SEM=''] in)

  11. (NP[SEM='Country="china"'] China)))))

我们可以看到用特征结构可以建立对大量广泛的语言学现象的简介分析

实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验中用大写的英文字母表示; Vt 文法的终结符号集合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn集合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值