3

NLTK 的文档所举例的“正则表达式”和来自相同的 CFG 之间是否存在实际的权力差异?肯定应该有,因为有不规则的上下文无关语言,但我找不到 CFG 方法胜过正则表达式的具体示例。

http://nltk.org/book/ch07.html

4

1 回答 1

5

从 RegexpParser 的文档中:

子句的模式按顺序执行。较早的模式可能会引入阻止稍后模式执行的块边界。有时,单个模式将匹配输入的多个重叠范围。与更普遍的正则表达式替换一样,分块器将识别可能的第一个匹配项,然后在该匹配项结束后继续寻找匹配项。

语法的子句也是按顺序执行的。级联块解析器是具有多个子句的解析器。该块解析器创建的解析树的最大深度与语法中的子句数相同。

也就是说,每个子句/模式都执行一次。因此,一旦您需要后一个子句的输出与前一个子句匹配,您就会遇到麻烦。

一个实际的例子是,可以将本身可能是一个完整句子的东西用作更大句子中的子句的方式:

猫发出咕噜咕噜的叫声。

他听到猫发出咕噜声。

她看到他听到猫发出咕噜咕噜的声音。

正如我们从上面的文档中所读到的,当您构造 RegexpParser 时,您正在为此类句子的“深度”设置任意限制。上下文无关语法没有“递归限制”。

文档提到您可以使用循环来减轻这种情况——如果您通过合适的语法运行两到三或四次,您可以获得更深入的解析。您可以添加外部逻辑来多次循环您的语法,或者直到无法解析更多内容。

但是,正如文档还指出的那样,此解析器的基本方法仍然是“贪婪的”。对于固定或可变数量的步骤,它会这样进行:

  • 一步完成尽可能多的分块。
  • 使用上一步的输出作为下一步的输入,然后重复。

这是幼稚的,因为如果早期步骤出错,这将破坏整个解析。

想一个“花园小径句”:

马跑过谷仓跌倒了。

还有一个类似的字符串,但完全不同的句子:

那匹马跑过谷仓。

构建一个解析这两个句子的 RegexpParser 可能会很困难,因为该方法依赖于正确的初始分块。一个正确的初始分块可能是另一个不正确的初始分块,但是在解析逻辑处于后期阶段之前,您无法知道“您在哪个句子中”。

例如,如果“谷仓倒塌”在早期被分块,解析将失败。

当你最终得到一个“糟糕”的解析时,你可以添加外部逻辑来回溯,看看你是否能找到一个更好的。但是,我想您会发现,解析算法的更多重要部分在您的外部逻辑中,而不是在 RegexpParser 中。

于 2013-04-02T17:14:19.267 回答