zoukankan      html  css  js  c++  java
  • 【语言处理与Python】7.4语言结构中的递归

    用级联分块器构建嵌套结构

    例如如下,是名词短语、介词短语、动词短语和句子的模式。一个四级块语法器。

    grammar= r"""
    NP:{<DT|JJ|NN.*>+} #Chunksequences of DT,JJ, NN
    PP:{<IN><NP>} #Chunkprepositions followed byNP
    VP:{<VB.*><NP|PP|CLAUSE>+$} #Chunkverbs and their arguments
    CLAUSE:{<NP><VP>} #ChunkNP,VP
    """
    cp= nltk.RegexpParser(grammar)
    sentence = [("Mary", "NN"), ("saw", "VBD"), ("the", "DT"), ("cat", "NN"),
    ("sit", "VB"), ("on", "IN"), ("the", "DT"), ("mat", "NN")]
    >>>print cp.parse(sentence)
    (S
    (NP Mary/NN)
    saw/VBD
    (CLAUSE
    (NP the/DT cat/NN)
    (VP sit/VB (PP on/IN(NP the/DT mat/NN)))))

    但是,这个是有缺陷的,没有认出来saw为首的VP。如果句子嵌套更深,那么更无法正常工作,我们可以设置循环次数,来解决这个问题。

    >>>cp = nltk.RegexpParser(grammar,loop=2)
    >>>print cp.parse(sentence)
    (S
        (NP John/NNP)
        thinks/VBZ
        (CLAUSE
        (NP Mary/NN)
        (VP
            saw/VBD
            (CLAUSE
                (NP the/DT cat/NN)
                (VP sit/VB (PP on/IN(NP the/DT mat/NN)))))))

    级联这种方法是有局限性的,创建和调试困难,只能产生固定深度的树,完整句法分析是不够的。

    树大家应该都很熟悉,不过多介绍树的定义。

    在NLTK中,我们也可以创造树。

    >>>tree1 = nltk.Tree('NP',['Alice'])
    >>>print tree1
    (NP Alice)
    >>>tree2 = nltk.Tree('NP',['the', 'rabbit'])
    >>>print tree2
    (NP the rabbit)
    #我们也可以合并树
    >>>tree3 = nltk.Tree('VP',['chased', tree2])
    >>>tree4 = nltk.Tree('S',[tree1, tree3])
    >>>print tree4
    (S (NP Alice)(VP chased (NP the rabbit)))
    #这里是树的一些方法
    >>>print tree4[1]
    (VP chased(NP the rabbit))
    >>>tree4[1].node
    'VP'
    >>>tree4.leaves()
    ['Alice', 'chased', 'the', 'rabbit']
    >>>tree4[1][1][1]
    'rabbit'
    #有的树直接看代码会很不直观,我们可以画出来
    >>>tree3.draw()

    image

    树遍历

    def traverse(t):
        try:
            t.node
        except AttributeError:
            print t,
        else:
            #Nowweknowthat t.node is defined
            print '(', t.node,
            for child in t:
                traverse(child)
            print ')',
    >>>t =nltk.Tree('(S(NP Alice)(VP chased(NP the rabbit)))')
    >>>traverse(t)
    ( S( NPAlice) ( VPchased ( NPthe rabbit ) ) )
  • 相关阅读:
    SPOJ913 Query on a tree II
    SPOJ375 Query on a tree
    HDU4348 To the moon
    Bzoj2753 [SCOI2012]滑雪与时间胶囊
    HDU4612 Warm up
    Uva11374 Airport Express
    Uva1624 Knots
    DevExpress的GridControl的使用以及怎样添加列和绑定数据源
    C#中使用Path、Directory、Split、Substring实现对文件路径和文件名的常用操作实例
    ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示
  • 原文地址:https://www.cnblogs.com/createMoMo/p/3109406.html
Copyright © 2011-2022 走看看