<p>这可以用一种更简单的方式来完成。如果我们知道我们的语法结构是CNF-LR,我们可以使用递归正则表达式解析器来解析文本。在</p>
<p>有一个名为pyparser的包(如果您还没有,可以用<code>pip install pyparser</code>安装它)。在</p>
<pre><code>from pyparsing import nestedExpr
astring = '''(ROOT
(S
(NP (NN Carnac) (DT the) (NN Magnificent))
(VP (VBD gave) (NP ((DT a) (NN talk))))
)
)'''
expr = nestedExpr('(', ')')
result = expr.parseString(astring).asList()[0]
print(result)
</code></pre>
<p>这给了</p>
^{pr2}$
<p>因此,我们成功地将字符串转换为列表的层次结构。现在我们需要编写一些代码来解析列表和提取规则。在</p>
<pre><code>def get_rules(result, rules):
for l in result[1:]:
if isinstance(l, list) and not isinstance(l[0], list):
rules.add((result[0], l[0]))
get_rules(l, rules)
elif isinstance(l[0], list):
rules.add((result[0], tuple([x[0] for x in l])))
else:
rules.add((result[0], l))
return rules
</code></pre>
<p>正如我提到的,我们已经知道我们的语法结构,所以我们只需要注意有限的几个条件。在</p>
<p>按如下方式调用此函数:</p>
<pre><code>rules = get_rules(result, set()) # results was obtained from before
for i in rules:
print i
</code></pre>
<p>输出:</p>
<pre><code>('ROOT', 'S')
('VP', 'NP')
('DT', 'the')
('NP', 'NN')
('NP', ('DT', 'NN'))
('NP', 'DT')
('S', 'VP')
('VBD', 'gave')
('NN', 'Carnac')
('NN', 'Magnificent')
('S', 'NP')
('VP', 'VBD')
</code></pre>
<p>你要什么就点这个。在</p>