使用递归文法的 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'
""")
尝试所有三个,看看不同输入的解析是什么样的!
我一定是遗漏了一些关于递归定义的非终结符的基本知识,但我想做的就是识别正则表达式之类的东西,其中一系列数字后跟一系列字母。
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'
""")
尝试所有三个,看看不同输入的解析是什么样的!