【问题标题】:Chomsky-normal-form grammar extraction from a parse tree从解析树中提取乔姆斯基范式语法
【发布时间】:2014-11-14 02:19:01
【问题描述】:

我正在尝试从其解析树中提取乔姆斯基范式 (CNF) - 句子的语法产生:

(ROOT
  (S
    (NP (DT the) (NNS kids))
    (VP (VBD opened)
      (NP (DT the) (NN box))
      (PP (IN on)
        (NP (DT the) (NN floor)))))) 

我将整棵树放入一个名为 S 的字符串中,然后:

tree = Tree.fromstring(S)
tree.chomsky_normal_form()
for p in tree.productions():
    print p

输出是

(1) NN -> 'box'
(2) PP -> IN NP
(3) DT -> 'the'
(4) ROOT -> S
(5) NP -> DT NN
(6) VBD -> 'opened'
(7) VP|<NP-PP> -> NP PP
(8) VP -> VBD VP|<NP-PP>
(9) NP -> DT NNS
(10) NN -> 'floor'
(11) IN -> 'on'
(12) NNS -> 'kids'
(13) S -> NP VP

但有些作品(7 号和 8 号)似乎不是 CNF!有什么问题?

【问题讨论】:

    标签: python grammar nltk parse-tree chomsky-normal-form


    【解决方案1】:

    VP|&lt;NP-PP&gt;一个 非终结符。竖线并不代表传统意义上的多个选项。相反,NLTK 把它放在那里是为了表明规则的来源,即“这个新的非终结符号是从 VP 和 NP-PP 的组合中派生的”。这是 NLTK 为将您的语法转换为乔姆斯基范式而创建的新生产规则。

    看一下 CNF 之前的树的产生:

    ROOT -> S
    S -> NP VP
    NP -> DT NNS
    DT -> 'the'
    NNS -> 'kids'
    VP -> VBD NP PP ***
    VBD -> 'opened'
    NP -> DT NN
    DT -> 'the'
    NN -> 'box'
    PP -> IN NP
    IN -> 'on'
    NP -> DT NN
    DT -> 'the'
    NN -> 'floor'
    

    具体看规则VP -&gt; VBD NP PP,它不在CNF中(任何产生式规则的RHS上必须正好有两个非终结符)

    您问题中的两条规则 (7):VP|&lt;NP-PP&gt; -&gt; NP PP 和 (8):VP -&gt; VBD VP|&lt;NP-PP&gt; 在功能上等同于更一般的规则 VP -&gt; VBD NP PP

    当检测到VP 时,规则应用会导致:

    VBD VP|&lt;NP-PP&gt;

    而且,VP|&lt;NP-PP&gt; 是创建的生产规则的 LHS,结果是:

    VBD NP PP

    具体来说,如果隔离规则本身,可以看一下具体的符号(确实是单数):

    >>> tree.chomsky_normal_form()
    >>> prod = tree.productions()
    >>> x = prod[7]  # VP|<NP-PP> -> NP PP
    >>> x.lhs().symbol()  # Singular!
    u'VP|<NP-PP>'
    

    【讨论】:

    • 那么我如何区分表示 OR 的条(始终在 RHS 上)与不表示 OR 并且可能同时出现在 RHS 和 LHS 上的条(就像你提到的那个) ?
    • 在什么情况下你需要“区分”它们?在最基本的层面上,像VP | &lt;NP-PP&gt; 这样在 LHS 上输入非终结符会引发错误,因为符号中不应包含空格。还要意识到规范A -&gt; B | C 是更正式的A -&gt; BA -&gt; C 的简写。
    • 事实上,NLTK 将这些规则拆分为它们的组成形式,因此除了手动输入 A -&gt; B | C 之类的规则外,您不会在 NLTK 语法中发现 | 的出现,意思是“多个选项”。试试nltk.CFG.fromstring("A -&gt; B | C"),它会创建一个包含两个产生式规则的语法。
    • 我正在尝试实现需要CNF的CKY算法。
    • | 在处理 NLTK 时是明确的 - 您原始帖子中的语法确实是有效的 CNF。如果您正在创建解析这些产生式的脚本,请确保它考虑到 | 并不意味着“多个选项”这一事实。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2012-07-17
    • 2011-09-22
    • 1970-01-01
    • 2018-11-28
    • 2016-01-23
    • 2011-02-25
    相关资源
    最近更新 更多