【说话处理惩罚与Python】9.1文法特点
添加时间:2013-6-3 点击量:
为了获得更大的灵活性,我们改变我们对待文法类别,如S,NP,V的体式格式,我们将这些原子标签分化为类似字典的布局,以便可以提取一系列的值作为特点。
9.1文法特点
先从一个简单的例子开端,应用字典存储特点和他们的值。
>>>kim = {CAT:NP, ORTH: Kim, REF: k}
>>>chase = {CAT:V, ORTH: chased, REL: chase}
CAT:文法类别;ORTH:拼写;REF:给出指导物或者关系。在基于规矩的文法高低文中,如许的特点和特点值对被称为特点布局。
按照须要,我们还可以添加特点
>>>chase[AGT] = sbj
>>>chase[PAT] = obj
AGT :施事的角色,PAT:受事的角色,在这里是宾语。
例如,我们如今要处理惩罚句子:Kim chased Lee.
>>>sent = "Kim chased Lee"
>>>tokens = sent.split()
>>>lee = {CAT:NP, ORTH: Lee, REF: l}
>>>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 kin [ORTH, REL, AGT, PAT]: #checkfeatstruct ofchase
... print "%-5s =>%s"%(k, verb[k])
ORTH =>chased
REL =>chase
AGT =>k
PAT =>l
同样的办法可以实用不合的动词,可以添加更多的特点,例如:
>>>surprise = {CAT:V, ORTH: surprised, REL: surprise,
... SRC: sbj, EXP: obj}
句法和谈
动词的形态属性与主语名词短语的属性一路变更,这种变更被成为和谈(agreement)。
例如:
a. the dog runs
b.the dog run
a. the dogs run
b.the dogs runs
我们可以应用改进文法的体式格式,来处理惩罚这种景象,下面是一个例子,然则须要重视,这种办法是很是麻烦的。
改进之前的文法:
(7) S -> NPVP
NP -> DetN
VP -> V
Det -> this
N -> dog
V -> runs
改进之后的文法:
(8) S -> NP_SGVP_SG
S -> NP_PLVP_PL
NP_SG-> Det_SGN_SG
NP_PL-> Det_PLN_PL
VP_SG-> V_SG
VP_PL-> V_PL
Det_SG-> this
Det_PL-> these
N_SG-> dog
N_PL-> dogs
V_SG-> runs
V_PL-> run
为了避免这种爆炸式的增长,我们可以应用属性和束缚。
应用属性和束缚
Det[NUM=sg]-> this
Det[NUM=pl]-> these
N[NUM=sg]-> dog
N[NUM=pl]-> dogs
V[NUM=sg]-> runs
V[NUM=pl]-> run
我们可以应用?n来改进:
S -> NP[NUM=?n]VP[NUM=?n]
NP[NUM=?n]-> Det[NUM=?n]N[NUM=?n]
VP[NUM=?n]-> V[NUM=?n]
然则有些词是对单复数没有抉剔的,有两种默示办法,很显然,第二种,是比第一种要简单了然的。
第一种:
Det[NUM=sg]-> the | some | several
Det[NUM=pl]-> the | some | several
第二种:
Det[NUM=?n]-> the | some | several
下面的代码演示了到今朝为止在本章中介绍过的大多半设法:
>>>nltk.data.show_cfg(grammars/book_grammars/feat0.fcfg)
%start S
####################
#GrammarProductions
####################
#S expansion productions
S -> NP[NUM=?n]VP[NUM=?n]
#NPexpansion productions
NP[NUM=?n]-> N[NUM=?n]
NP[NUM=?n]-> PropN[NUM=?n]
NP[NUM=?n]-> Det[NUM=?n]N[NUM=?n]
NP[NUM=pl]-> N[NUM=pl]
#VPexpansion productions
VP[TENSE=?t,NUM=?n]-> IV[TENSE=?t, NUM=?n]
VP[TENSE=?t,NUM=?n]-> TV[TENSE=?t,NUM=?n]NP
####################
#LexicalProductions
####################
Det[NUM=sg]-> this | every
Det[NUM=pl]-> these | all
Det-> the | some | several
PropN[NUM=sg]->Kim | Jody
N[NUM=sg]-> dog | girl | car | child
N[NUM=pl]-> dogs | girls | cars | children
IV[TENSE=pres, NUM=sg]-> disappears | walks
TV[TENSE=pres,NUM=sg]-> sees | likes
IV[TENSE=pres, NUM=pl]-> disappear | walk
TV[TENSE=pres,NUM=pl]-> see | like
IV[TENSE=past] -> disappeared | walked
TV[TENSE=past]-> saw | liked
下面的代码显现了,如何解析一句话:
若是文法无法解析输入,trees将为空,不然会包含一个或多个解析树。取决于舒畅是否有句法歧义。
>>>tokens = Kim likes children.split()
>>> nltk import load_parser ?
>>>cp = load_parser(grammars/book_grammars/feat0.fcfg, trace=2) ?
>>>trees = cp.nbest_parse(tokens)
|.Kim .like.chil.|
|[----] . .| PropN[NUM=sg]-> Kim
|[----] . .| NP[NUM=sg]-> PropN[NUM=sg]
|[----> . .| S[]-> NP[NUM=?n]VP[NUM=?n]{?n: sg}
|. [----] .| TV[NUM=sg,TENSE=pres]-> likes
|. [----> .| VP[NUM=?n,TENSE=?t]-> TV[NUM=?n,TENSE=?t]NP[]
{?n: sg, ?t: pres}
|. . [----]| N[NUM=pl]-> children
|. . [----]| NP[NUM=pl]-> N[NUM=pl]
|. . [---->| S[]-> NP[NUM=?n]VP[NUM=?n]{?n: pl}
|. [---------]| VP[NUM=sg,TENSE=pres]
-> TV[NUM=sg,TENSE=pres]NP[]
|[==============]| S[]-> NP[NUM=sg]VP[NUM=sg]
最后,可以搜检解析树:
>>>for tree in trees: print tree
(S[]
(NP[NUM=sg] (PropN[NUM=sg] Kim))
(VP[NUM=sg, TENSE=pres]
(TV[NUM=sg, TENSE=pres]likes)
(NP[NUM=pl] (N[NUM=pl] children))))
术语
像sg,pl如许的简单的值凡是被成为原子。原子值的一种特别景象是布尔值,仅仅指定一个属性是真还是假。
例如AUX代表助动词。
V[TENSE=pres,aux=+]->can
有的时辰,我们可以将和谈特点组合在一路,作为一个类此外不合项目组,默示AGR的值。
属性值矩阵:AVM
[POS = N ]
[ ]
[AGR = [PER = 3 ]]
[ [NUM = pl ]]
[ [GND = fem ]]
当有错杂的属性时,可以重构文法:
S -> NP[AGR=?n]VP[AGR=?n]
NP[AGR=?n]-> PropN[AGR=?n]
VP[TENSE=?t,AGR=?n]-> Cop[TENSE=?t,AGR=?n]Adj
Cop[TENSE=pres, AGR=[NUM=sg,PER=3]]-> is
PropN[AGR=[NUM=sg,PER=3]]-> Kim
Adj-> happy
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
为了获得更大的灵活性,我们改变我们对待文法类别,如S,NP,V的体式格式,我们将这些原子标签分化为类似字典的布局,以便可以提取一系列的值作为特点。
9.1文法特点
先从一个简单的例子开端,应用字典存储特点和他们的值。
>>>kim = {CAT:NP, ORTH: Kim, REF: k}
>>>chase = {CAT:V, ORTH: chased, REL: chase}
CAT:文法类别;ORTH:拼写;REF:给出指导物或者关系。在基于规矩的文法高低文中,如许的特点和特点值对被称为特点布局。
按照须要,我们还可以添加特点
>>>chase[AGT] = sbj
>>>chase[PAT] = obj
AGT :施事的角色,PAT:受事的角色,在这里是宾语。
例如,我们如今要处理惩罚句子:Kim chased Lee.
>>>sent = "Kim chased Lee"
>>>tokens = sent.split()
>>>lee = {CAT:NP, ORTH: Lee, REF: l}
>>>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 kin [ORTH, REL, AGT, PAT]: #checkfeatstruct ofchase
... print "%-5s =>%s"%(k, verb[k])
ORTH =>chased
REL =>chase
AGT =>k
PAT =>l
同样的办法可以实用不合的动词,可以添加更多的特点,例如:
>>>surprise = {CAT:V, ORTH: surprised, REL: surprise,
... SRC: sbj, EXP: obj}
句法和谈
动词的形态属性与主语名词短语的属性一路变更,这种变更被成为和谈(agreement)。
例如:
a. the dog runs
b.the dog run
a. the dogs run
b.the dogs runs
我们可以应用改进文法的体式格式,来处理惩罚这种景象,下面是一个例子,然则须要重视,这种办法是很是麻烦的。
改进之前的文法:
(7) S -> NPVP
NP -> DetN
VP -> V
Det -> this
N -> dog
V -> runs
改进之后的文法:
(8) S -> NP_SGVP_SG
S -> NP_PLVP_PL
NP_SG-> Det_SGN_SG
NP_PL-> Det_PLN_PL
VP_SG-> V_SG
VP_PL-> V_PL
Det_SG-> this
Det_PL-> these
N_SG-> dog
N_PL-> dogs
V_SG-> runs
V_PL-> run
为了避免这种爆炸式的增长,我们可以应用属性和束缚。
应用属性和束缚
Det[NUM=sg]-> this
Det[NUM=pl]-> these
N[NUM=sg]-> dog
N[NUM=pl]-> dogs
V[NUM=sg]-> runs
V[NUM=pl]-> run
我们可以应用?n来改进:
S -> NP[NUM=?n]VP[NUM=?n]
NP[NUM=?n]-> Det[NUM=?n]N[NUM=?n]
VP[NUM=?n]-> V[NUM=?n]
然则有些词是对单复数没有抉剔的,有两种默示办法,很显然,第二种,是比第一种要简单了然的。
第一种:
Det[NUM=sg]-> the | some | several
Det[NUM=pl]-> the | some | several
第二种:
Det[NUM=?n]-> the | some | several
下面的代码演示了到今朝为止在本章中介绍过的大多半设法:
>>>nltk.data.show_cfg(grammars/book_grammars/feat0.fcfg)
%start S
####################
#GrammarProductions
####################
#S expansion productions
S -> NP[NUM=?n]VP[NUM=?n]
#NPexpansion productions
NP[NUM=?n]-> N[NUM=?n]
NP[NUM=?n]-> PropN[NUM=?n]
NP[NUM=?n]-> Det[NUM=?n]N[NUM=?n]
NP[NUM=pl]-> N[NUM=pl]
#VPexpansion productions
VP[TENSE=?t,NUM=?n]-> IV[TENSE=?t, NUM=?n]
VP[TENSE=?t,NUM=?n]-> TV[TENSE=?t,NUM=?n]NP
####################
#LexicalProductions
####################
Det[NUM=sg]-> this | every
Det[NUM=pl]-> these | all
Det-> the | some | several
PropN[NUM=sg]->Kim | Jody
N[NUM=sg]-> dog | girl | car | child
N[NUM=pl]-> dogs | girls | cars | children
IV[TENSE=pres, NUM=sg]-> disappears | walks
TV[TENSE=pres,NUM=sg]-> sees | likes
IV[TENSE=pres, NUM=pl]-> disappear | walk
TV[TENSE=pres,NUM=pl]-> see | like
IV[TENSE=past] -> disappeared | walked
TV[TENSE=past]-> saw | liked
下面的代码显现了,如何解析一句话:
若是文法无法解析输入,trees将为空,不然会包含一个或多个解析树。取决于舒畅是否有句法歧义。
>>>tokens = Kim likes children.split()
>>> nltk import load_parser ?
>>>cp = load_parser(grammars/book_grammars/feat0.fcfg, trace=2) ?
>>>trees = cp.nbest_parse(tokens)
|.Kim .like.chil.|
|[----] . .| PropN[NUM=sg]-> Kim
|[----] . .| NP[NUM=sg]-> PropN[NUM=sg]
|[----> . .| S[]-> NP[NUM=?n]VP[NUM=?n]{?n: sg}
|. [----] .| TV[NUM=sg,TENSE=pres]-> likes
|. [----> .| VP[NUM=?n,TENSE=?t]-> TV[NUM=?n,TENSE=?t]NP[]
{?n: sg, ?t: pres}
|. . [----]| N[NUM=pl]-> children
|. . [----]| NP[NUM=pl]-> N[NUM=pl]
|. . [---->| S[]-> NP[NUM=?n]VP[NUM=?n]{?n: pl}
|. [---------]| VP[NUM=sg,TENSE=pres]
-> TV[NUM=sg,TENSE=pres]NP[]
|[==============]| S[]-> NP[NUM=sg]VP[NUM=sg]
最后,可以搜检解析树:
>>>for tree in trees: print tree
(S[]
(NP[NUM=sg] (PropN[NUM=sg] Kim))
(VP[NUM=sg, TENSE=pres]
(TV[NUM=sg, TENSE=pres]likes)
(NP[NUM=pl] (N[NUM=pl] children))))
术语
像sg,pl如许的简单的值凡是被成为原子。原子值的一种特别景象是布尔值,仅仅指定一个属性是真还是假。
例如AUX代表助动词。
V[TENSE=pres,aux=+]->can
有的时辰,我们可以将和谈特点组合在一路,作为一个类此外不合项目组,默示AGR的值。
属性值矩阵:AVM
[POS = N ]
[ ]
[AGR = [PER = 3 ]]
[ [NUM = pl ]]
[ [GND = fem ]]
当有错杂的属性时,可以重构文法:
S -> NP[AGR=?n]VP[AGR=?n]
NP[AGR=?n]-> PropN[AGR=?n]
VP[TENSE=?t,AGR=?n]-> Cop[TENSE=?t,AGR=?n]Adj
Cop[TENSE=pres, AGR=[NUM=sg,PER=3]]-> is
PropN[AGR=[NUM=sg,PER=3]]-> Kim
Adj-> happy