给出括号中的解析,如何提取语法产生规则?

时间:2016-08-17 02:20:09

标签: python parsing nlp nltk context-free-grammar

我有一个例句。 “打开门。”我解析了一个句子来得到括号中的解析输出,如下所示。

  

(S(VP(VB open)(NP(DT)(NN门)))(。))

我需要提取产生解析输出的CFG语法规则。 我可以手动将它们写出来:

<ul>
    <li class="<? if ($_GET['page'] < '2') { echo 'disabled' ; } ?>">
        <a href="<? 
                   if ($_GET['page'] == '2') { 
                       echo 'inbox.php'; 
                   } else { 
                       echo '?page='.($_GET[page] - 1); 
                   } 
                 ?>">Prev</a>
    </li> <!-- previous button-->

    <li style="<? if ($_GET['page'] - 2 < '1') { echo 'display:none;'; } ?>">
        <a href="?page=<? 
                         echo ($_GET[page] -2); ?>">
                         <? echo ($_GET[page] -2); ?>
        </a>
    </li> <!-- the button 2 before current spot if its greater than 0 -->

    <li style="<? if ($_GET['page'] - 1 < '1') { echo 'display:none;'; } ?>">
        <a href="?page=<? 
                         echo ($_GET[page] -1); ?>">
                         <? echo ($_GET[page] -1); ?>
        </a>
    </li> <!-- the button 1 before current spot if its greater than 0 -->

    <li class="disabled">
        <a href=""><? echo $_GET[page]; ?></a>
    </li> <!-- current button disabled -->

    <li style="<? if ($total - ($_GET[page] * 10) <= '0') { echo 'display:none;'; } ?>">
        <a href="?page=<? 
                         echo ($_GET[page] + 1); ?>">
                         <? echo ($_GET[page] +1); ?>
        </a>
    </li> <!-- the button 1 after current spot if results go that high -->

    <li style="<? if ($total - ($_GET[page] + 1) * 10 <= '0') { echo 'display:none;'; } ?>">
        <a href="?page=<?
                          echo ($_GET[page] + 2); ?>">
                          <? echo ($_GET[page] + 2); ?>
        </a>
    </li> <!-- the button 2 after current spot if results go that high -->

    <li class="<? if ($total - ($_GET[page] * 10) <= '0') { echo 'disabled'; } ?>">
        <a href="?page=<? echo ($_GET[page] + 1); ?>">Next</a>
    </li> <!-- the next button if results go that high -->
</ul>

但这很耗时,如果自动解析括号,我该如何制作语法规则?

2 个答案:

答案 0 :(得分:4)

您可以使用 Tree.productions()方法从Tree获取CFG规则。

示例:

from nltk import Tree

t = Tree.fromstring("(S (VP (VB open) (NP (DT the) (NN door))) (. .))")
print t.productions()

<强>输出:

[S -> VP ., VP -> VB NP, VB -> 'open', NP -> DT NN, DT -> 'the', 
 NN -> 'door', . -> '.']

有关详情,请查看 - NLTK Tree Productions

答案 1 :(得分:2)

如果您希望通过括号中的解析创建规则,可以使用Tree.productions()

>>> from nltk import Tree
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))")
>>> t.productions()
[S -> NP VP, NP -> D N, D -> 'the', N -> 'dog', VP -> V NP, V -> 'chased', NP -> D N, D -> 'the', N -> 'cat']

Tree.productions()将返回nltk.grammar.Productions个对象的列表:

>>> type(t.productions()[0])
<class 'nltk.grammar.Production'>

要将规则转换为字符串形式,请使用Production.unicode_repr

>>> t.productions()[0].unicode_repr()
u'S -> NP VP'

获取从括号中解析的语法的字符串表示:

>>> from nltk import Tree
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))")
>>> grammar_from_parse = "\n".join([rule.unicode_repr() for rule in t.productions()])
>>> print grammar_from_parse
S -> NP VP
NP -> D N
D -> 'the'
N -> 'dog'
VP -> V NP
V -> 'chased'
NP -> D N
D -> 'the'
N -> 'cat'