Python自然语言处理 9 建立基于特征的文法

时间:2021-10-30 06:29:08

自然语言具有广泛的文法结构,用第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' ]
可以将特征结构看作是有向无环图

Python自然语言处理 9 建立基于特征的文法

#包含和统一

一个更一般的特征结构包含一个较一般的。合并两个特征结构的信息被称为统一

三 扩展基于特征的文法

#子类别

最初为文法框架开发的简单方法称为广义短语结构文法,通过允许词汇类别支持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')

四 深入阅读