自然语言具有广泛的文法结构,用第8章中所描述的简单方法很难处理如此广泛的文法结构。为了获得更大的灵活性,可改变对待文法类别如S、NP和V的方式。我们将这些原子标签分解为类似字典的结构,以便可以提取一系列的值作为特征。
回答下列问题:
(1)怎样用特征扩展无关上下文文法的框架,以获得对文法类别和产生式的更细粒度的控制?
(2)特征结构的主要形式化属于是什么,如何使用它们来计算?
(3)我们现在用基于特征的文法能获得哪些语言模式和文法结构?
在此过程中,我们将介绍更多的英语句法主题,包括:约定、子类别和无限制依赖成分等现象
一 文法特征
在本章中,我们将探讨建立在基于规则上的文法中特征的作用。对比特征提取,记录已经自动检测到的特征,我们现在要介绍词和短语的特征。
特征结构包含各种有关文法实体的信息
# 文法实体的信息 # CAT(文法类别) ORTH(拼写) REF(指示物) REL(关系) kim = {'CAT': 'NP', 'ORTH': 'Kim', 'REF': 'k'} chase = {'CAT': 'V', 'ORTH': 'chased', 'REL': 'chase'} # AGT(agent施事的角色) PAT(patient受事角色) chase['AGT'] = 'sbj' chase['PAT'] = 'obj' sent = 'Kim chased Lee' tokens = sent.split() lee = {'CAT': 'NP', 'ORTH': 'Lee', 'REF':'1'} def lex2fs(word): for fs in [kim, lee, chase]: if fs['ORTH'] == word: return fs # 查找句子中的实体 subj, verb, obj = lex2fs(tokens[0]), lex2fs(tokens[1]), lex2fs(tokens[2]) verb['AGT'] = subj['REF'] # agent of 'chase' is Kim verb['PAT'] = obj['REF'] # patient of 'chase' is Lee for k in ['ORTH', 'REL', 'AGT', 'PAT']: # check featstruct of 'chase' print "%-5s => %s" % (k, verb[k]) ORTH => chased REL => chase AGT => k PAT => 1同样的方法可以应用于不同的动词
特征结构是非常强大的,但我们操纵它们的方式是极其特别的。
无关上下文文法和分析如何能扩展到合适的特征结构,使我们可以以一种更通用的和有原则的方式建立像这样的分析。以查看句法协议的现象作为开始;展示如何使用特征表示协议约束。
#句法协议
动词的形态属性同主语名词短语的句法属性一起变化,该过程被称为协议(agreement)
#使用属性和约束
非正式的语言类别具有属性,例如:名词具有复数的属性。
import nltk nltk.data.show_cfg('grammars/book_grammars/feat0.fcfg')跟踪基于特征的图表分析器
tokens = 'Kim likes children'.split() from nltk import load_parser cp = load_parser('grammars/book_grammars/feat0.fcfg', trace=2) trees = cp.nbest_parse(tokens)
#术语
二 处理特征结构
NLTK中的特征结构使用构造函数FeatStruct()声明。原子特征值可以是字符串或整数
fs1 = nltk.FeatStruct(TENSE='past', NUM='sg') print fs1 [ NUM = 'sg' ] [ TENSE = 'past' ]可以将特征结构看作是有向无环图
#包含和统一
一个更一般的特征结构包含一个较一般的。合并两个特征结构的信息被称为统一
三 扩展基于特征的文法
#子类别
最初为文法框架开发的简单方法称为广义短语结构文法,通过允许词汇类别支持SUBCAT特征尝试解决这个问题,设SUBCAT特征表明该项目所属的子类别。
#核心词回顾
通过从主累别标签分解出子类别信息,我们可以概括更多有关动词属性的内容。
#助动词与倒装
倒装从句
#无限制依赖成分
因为可以无限地加深句子补语的递归,所以在整个句子中缺口可以无限远地被填充。这一属性导致无限依赖成分的概念,也就是填充词-缺口依赖,即填充词和缺口之间的距离没有上界。
tokens = 'who do you claim that you like'.split() from nltk import load_parser cp = load_parser('grammars/book_grammars/feat1.fcfg') for tree in cp.nbest_parse(tokens): print tree
#德语中的格式和性别
nltk.data.show_cfg('grammars/book_grammars/german.fcfg')