} } }

    【说话处理惩罚与Python】9.1文法特点

    添加时间:2013-6-3 点击量:

    为了获得更大的灵活性,我们改变我们对待文法类别,如S,NP,V的体式格式,我们将这些原子标签分化为类似字典的布局,以便可以提取一系列的值作为特点。

    9.1文法特点

    先从一个简单的例子开端,应用字典存储特点和他们的值。

    >>>kim = {CAT:NPORTH: KimREF: k}
    
    >>>chase = {CAT:VORTH: chasedREL: chase}



    CAT:文法类别;ORTH:拼写;REF:给出指导物或者关系。在基于规矩的文法高低文中,如许的特点和特点值对被称为特点布局。



    按照须要,我们还可以添加特点




    >>>chase[AGT] = sbj
    
    >>>chase[PAT] = obj



    AGT :施事的角色,PAT:受事的角色,在这里是宾语。



    例如,我们如今要处理惩罚句子:Kim chased Lee.




    >>>sent = "Kim chased Lee"
    
    >>>tokens = sent.split()
    >>>lee = {CAT:NPORTH: LeeREF: 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 [ORTHRELAGTPAT]: checkfeatstruct ofchase
    ... print "%-5s =>%s"(k, verb[k])
    ORTH
    =>chased
    REL
    =>chase
    AGT
    =>k
    PAT
    =>l



    同样的办法可以实用不合的动词,可以添加更多的特点,例如:




    >>>surprise = {CAT:VORTH: surprisedREL: surprise
    ...
    SRC: sbjEXP: 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

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: