zoukankan      html  css  js  c++  java
  • 【语言处理与Python】9.2处理特征结构\9.3扩展基于特征的文法

    9.2处理特征结构

    这一节内容为如何构建特征结构以及在NLTK中操作。

    NLTK提供了特征结构使用的构造函数FeatStruct()声明。

    >>>fs1 = nltk.FeatStruct(TENSE='past',NUM='sg')
    >>>print fs1
    [ NUM = 'sg' ]
    [ TENSE= 'past' ]

    将特征结构作为图来查看往往是有用的(有向无环图)

    image

    也会出现结构共享,或者重入。如图:

    image

    当两条路径具有相同的值时,被称为等价。

    在代码中表示结构共享,如下所示:

    >>>print nltk.FeatStruct("""[NAME='Lee',ADDRESS=(1)[NUMBER=74,STREET='ruePascal'],
    ... SPOUSE=[NAME='Kim', ADDRESS->(1)]]""")
    [ ADDRESS= (1) [ NUMBER= 74 ] ]
    [ [ STREET = 'rue Pascal'] ]
    [                                              ]
    [ NAME = 'Lee' ]
    [                                                ]
    [ SPOUSE =[ ADDRESS-> (1) ] ]
    [ [ NAME = 'Kim' ] ]

    包含和统一

    包含:一个更一般的特征结构包含一个较少一般的。

    统一:合并两个特征结构的信息被成为统一。

    >>>fs1 = nltk.FeatStruct(NUMBER=74,STREET='ruePascal')
    >>>fs2 = nltk.FeatStruct(CITY='Paris')
    >>>print fs1.unify(fs2)
    [ CITY = 'Paris' ]
    [ NUMBER=74 ]
    [ STREET= 'rue Pascal']

    结构共享也可以使用变量表示,如?x

    >>>fs1 = nltk.FeatStruct("[ADDRESS1=[NUMBER=74, STREET='ruePascal']]")
    >>>fs2 = nltk.FeatStruct("[ADDRESS1=?x,ADDRESS2=?x]")
    >>>print fs2
    [ ADDRESS1= ?x ]
    [ ADDRESS2= ?x ]
    >>>print fs2.unify(fs1)
    [ ADDRESS1= (1) [ NUMBER= 74 ] ]
    [ [ STREET= 'rue Pascal'] ]
    [ ]
    [ ADDRESS2-> (1)

    9.3扩展基于特征的文法

    在本节,将会探索各种语言问题,并展示将特征纳入文法的好处。

    子类别

    VP[TENSE=?t,NUM=?n]-> V[SUBCAT=intrans,TENSE=?t,NUM=?n]
    VP[TENSE=?t,NUM=?n]-> V[SUBCAT=trans,TENSE=?t,NUM=?n]NP
    VP[TENSE=?t,NUM=?n]-> V[SUBCAT=clause,TENSE=?t,NUM=?n]SBar
    V[SUBCAT=intrans,TENSE=pres,NUM=sg]-> 'disappears' | 'walks'
    V[SUBCAT=trans,TENSE=pres,NUM=sg]-> 'sees' | 'likes'
    V[SUBCAT=clause,TENSE=pres,NUM=sg]-> 'says' | 'claims'
    V[SUBCAT=intrans,TENSE=pres,NUM=pl]-> 'disappear' | 'walk'
    V[SUBCAT=trans,TENSE=pres,NUM=pl]-> 'see' | 'like'
    V[SUBCAT=clause,TENSE=pres,NUM=pl]-> 'say' | 'claim'
    V[SUBCAT=intrans,TENSE=past]-> 'disappeared' | 'walked'
    V[SUBCAT=trans,TENSE=past]-> 'saw' | 'liked'
    V[SUBCAT=clause,TENSE=past]-> 'said' | 'claimed'

    SBar代表从句标签。

    SBar-> CompS
    Comp-> 'that'

    You claim that youlike children.这句话的产生的结构如下:

    image

    例如这句话:put the book on the table

    可以表示为:

    V[SUBCAT=<NP,NP,PP>]

    其中,NP代表主语,后面跟着PP的NP,补语子类别。

    所以,Kimput the bookonthe table,这句话可以被解析为:

    image

    核心词回顾

    X-bar句法通过抽象出短语级别的概念。通常认为有三个级别。

    例如,如图所示:

    image

    结构36a的核心词是N,N",N'被称为N的投影。N"是最大的投影,N有时也称作零投影。

    一个词汇核心X的直接补语子类别总是位于核心词的兄弟的位置,而修饰成分位于中间类别X'的兄弟的位置。

    image

    S -> N[BAR=2]V[BAR=2]
    N[BAR=2]-> DetN[BAR=1]
    N[BAR=1]-> N[BAR=1]P[BAR=2]
    N[BAR=1]-> N[BAR=0]P[BAR=2]

    助动词与倒装

    (39)a. Doyoulike children?
    b.CanJodywalk?
    (40)a. Rarelydoyousee Kim.
    b.NeverhaveI seen this dog.

    但是不是什么动词都能放在前面的。可以放在从句开头的术语叫做助动词。例如:do can have,也包括be,will,shall

    我们可以使用下面这个表达式:

    S[+INV]-> V[+AUX] NP VP

    标记[+inv]说明,包含一个助动词。

    AUX区分是否是助动词。

    SUBCAT代表子类别。

    image

    无限制依赖成分

    填充词和缺口之间的距离没有上界。这一事实可以很容易地使用包含句子补语的成分来说明。

    a. Who do you like __?
    b.Who do you claim that you like __?
    c.Who do you claim that Jody says that you like __?

    广义短语文法中处理形式化文法的无限依赖:

    一个斜线类别的形式是Y/XP;我们解释为:类别Y的短语缺少一个类别XP的子成分。例如:S/NP是缺少一个NP的S。

    >>>nltk.data.show_cfg('grammars/book_grammars/feat1.fcfg')
    %start S
    ####################
    #GrammarProductions
    ####################
    S[-INV] -> NPVP
    S[-INV]/?x -> NPVP/?x
    S[-INV] -> NPS/NP
    S[-INV] -> Adv[+NEG]S[+INV]
    S[+INV]-> V[+AUX]NPVP
    S[+INV]/?x-> V[+AUX]NPVP/?x
    SBar-> CompS[-INV]
    SBar/?x-> CompS[-INV]/?x
    VP-> V[SUBCAT=intrans,-AUX]
    VP-> V[SUBCAT=trans,-AUX] NP
    VP/?x-> V[SUBCAT=trans,-AUX] NP/?x
    VP-> V[SUBCAT=clause,-AUX] SBar
    VP/?x-> V[SUBCAT=clause,-AUX] SBar/?x
    VP-> V[+AUX]VP
    VP/?x-> V[+AUX]VP/?x
    ####################
    #LexicalProductions
    ####################
    V[SUBCAT=intrans,-AUX] -> 'walk' | 'sing'
    V[SUBCAT=trans,-AUX] -> 'see' | 'like'
    V[SUBCAT=clause,-AUX] -> 'say' | 'claim'
    V[+AUX]-> 'do' | 'can'
    NP[-WH]-> 'you' | 'cats'
    NP[+WH]-> 'who'
    Adv[+NEG]-> 'rarely' | 'never'
    NP/NP->
    Comp-> 'that'

    使用文法来解析句子:

    >>>tokens = 'who doyouclaim that youlike'.split()
    >>>from nltk import load_parser
    >>>cp = load_parser('grammars/book_grammars/feat1.fcfg')
    >>>for tree in cp.nbest_parse(tokens):
    ... print tree
    (S[-INV]
    (NP[+WH] who)
    (S[+INV]/NP[]
    (V[+AUX] do)
    (NP[-WH] you)
    (VP[]/NP[]
    (V[-AUX, SUBCAT='clause']claim)
    (SBar[]/NP[]
    (Comp[] that)
    (S[-INV]/NP[]
    (NP[-WH] you)
    (VP[]/NP[] (V[-AUX, SUBCAT='trans']like) (NP[]/NP[] )))))))
  • 相关阅读:
    Cocos2d-html5 笔记2: director
    Cocos2d html5 笔记 1: overview
    Device Pixel Ratio & Media Queries
    Viewport
    Viewport解决分辨率适配问题
    Ajax缓存解决办法
    capitalize()
    chr() 、ord()
    oct()
    eval()
  • 原文地址:https://www.cnblogs.com/createMoMo/p/3116121.html
Copyright © 2011-2022 走看看