使用递归文法的 nltk 进行解析

Parsing with nltk of a Recursive Grammar

我一定是遗漏了一些关于递归定义的非终结符的基本知识,但我想做的就是识别正则表达式之类的东西,其中一系列数字后跟一系列字母。

from nltk import CFG
import nltk

grammar = CFG.fromstring("""
S -> N L
N -> N | '1' | '2' | '3'
L -> L | 'A' | 'B' | 'C'
""")

from nltk.parse import BottomUpChartParser
parser = nltk.ChartParser(grammar)

sentence = '1 2 1 3 A C B C'.split()

for t in parser.parse(sentence):
    print(t)

上面的代码returns一个空的解析,没有打印任何东西

语法需要类似于:

grammar = CFG.fromstring("""
S -> N L
N -> N N | '1' | '2' | '3'
L -> L L | 'A' | 'B' | 'C'
""")

N -> N N为例:第一个N可以在解析句子时被“吃掉”变成1,留下下一个N继续制作另一个 N -> N N.

但是这会导致很多可能的解析,为了更有效的东西你可能想要这样的东西:

grammar = CFG.fromstring("""
S -> N L
N -> '1' N | '2' N | '3' N | '1' | '2' | '3'
L -> 'A' L | 'B' L | 'C' L | 'A' | 'B' | 'C'
""")

普通版。问题中的语言:“一个或多个数字后跟一个或多个字母”或(1,2,3)+(A,B,C)+是一种常规语言,因此我们可以用[=19=来表示它]:

grammar = CFG.fromstring("""
S -> N
N -> '1' N | '2' N | '3' N | '1' | '2' | '3' | L
L -> 'A' L | 'B' L | 'C' L | 'A' | 'B' | 'C'
""")

尝试所有三个,看看不同输入的解析是什么样的!