NLTK 正则表达式和 CFG
Posted
技术标签:
【中文标题】NLTK 正则表达式和 CFG【英文标题】:NLTK Regular Expressions and CFGs 【发布时间】:2013-03-24 00:24:36 【问题描述】:在 NLTK 的文档中举例说明的“正则表达式”和来自相同的 CFG 之间是否存在实际的权力差异?肯定应该有,因为有不规则的上下文无关语言,但我找不到 CFG 方法胜过正则表达式的具体示例。
http://nltk.org/book/ch07.html
【问题讨论】:
【参考方案1】:来自 RegexpParser 的文档:
子句的模式是按顺序执行的。一个较早的 模式可能会引入一个块边界,以防止以后 模式从执行。有时一个单独的模式会 匹配输入的多个重叠范围。与 更一般地,正则表达式替换,分块器将 确定可能的第一个匹配项,然后继续寻找匹配项 在这个结束之后。
语法的子句也是按顺序执行的。一个级联 块解析器是一种具有多个子句的解析器。最大深度 由这个块解析器创建的解析树与 语法中的子句数。
也就是说,每个子句/模式都被执行一次。因此,一旦您需要后面的子句的输出与前面的子句匹配,您就会遇到麻烦。
一个实际的例子是,可以将本身可能是一个完整句子的东西用作更大句子中的子句的方式:
猫发出咕噜声。
他听到猫发出咕噜声。
她看到他听到猫发出咕噜声。
我们可以从上面的文档中了解到,当您构造 RegexpParser 时,您正在为此类句子的“深度”设置任意限制。上下文无关语法没有“递归限制”。
文档中提到您可以使用循环来缓解这种情况——如果您通过合适的语法运行两三四次,您可以获得更深层次的解析。您可以添加外部逻辑来多次循环您的语法,或者直到无法解析更多内容为止。
但是,正如文档还指出的那样,此解析器的基本方法仍然是“贪婪的”。对于固定或可变数量的步骤,它会这样进行:
一步完成尽可能多的分块。 使用上一步的输出作为下一步的输入,然后重复。这是幼稚的,因为如果早期步骤出错,这将破坏整个解析。
想一个“花园小径句”:
那匹马跑过谷仓摔倒了。
还有一个类似的字符串但完全不同的句子:
那匹马跑过谷仓。
可能很难构造一个能够解析这两个句子的 RegexpParser,因为该方法依赖于正确的初始分块。一个正确的初始分块可能是另一个不正确的初始分块,但是直到您处于解析逻辑的后期阶段,您才能知道“您在哪个句子中”。
例如,如果“谷仓倒塌”在早期被分块,解析将失败。
当你最终得到一个“糟糕”的解析时,你可以添加外部逻辑来回溯,看看你是否能找到一个更好的。但是,我想您会发现,解析算法的更多重要部分在您的外部逻辑中,而不是在 RegexpParser 中。
【讨论】:
以上是关于NLTK 正则表达式和 CFG的主要内容,如果未能解决你的问题,请参考以下文章
NLTK 正则表达式标记器在正则表达式中不能很好地处理小数点