通过修剪句子来减少斯坦福解析器的解析时间

Cutting down on Stanford parser's time-to-parse by pruning the sentence

我们已经知道,Stanford Parser 的解析时间会随着句子长度的增加而增加。我有兴趣找到创造性的方法来修剪句子,以便在不影响准确性的情况下减少解析时间。例如我们可以用单词名词替换已知的名词短语。类似地,是否可以有一些其他聪明的方法来预先猜测子树,比方说,使用 POS 标签信息?我们有大量的非结构化文本可供我们使用。所以我们希望学习一些可以最终减少解析时间的通用模式。在这方面对公开文献的一些参考也将受到高度赞赏。

P.S。我们已经知道如何使用 Stanford Parser 进行多线程处理,因此我们不会从那个角度寻找答案。

您要求 'creative' 方法 - Cell Closure 修剪方法可能值得一看。请参阅 Brian Roark、Kristy Hollingshead 和 Nathan Bodenstab 的系列出版物。论文:1 2 3。基本的直觉是:

  • CYK解析图中的每个单元格'covers'一定范围(例如句子的前4个词,或第13-18个词等)
  • 有些词 - 特别是在某些上下文中 - 非常 不太可能成为多词句法成分的开头;其他人同样不太可能结束选民。例如,单词 'the' 几乎总是在名词短语之前,而且它会结束成分几乎是不可思议的。
  • 如果我们可以训练机器学习的分类器以非常高的精度识别此类单词,那么我们就可以识别出只会参与解析的单元格,将这些单词放在极不可能的句法位置。 (请注意,此分类器可能会使用线性时间词性标注器或其他高速预处理步骤。)
  • 通过 'closing' 这些单元格,我们可以显着降低渐近和平均情况的复杂性 - 理论上,从三次复杂性一直到线性;实际上,我们可以在不损失精度的情况下达到大约 n^1.5。

在许多情况下,与穷举搜索相比,这种修剪实际上 略微提高了 准确性,因为分类器可以合并 PCFG 无法获得的信息。请注意,这是一种简单但非常有效的粗到细修剪形式,只有一个粗阶段(与 Berkeley Parser 中的 7 阶段 CTF 方法相比)。

据我所知,Stanford Parser 目前没有实现这种修剪技术;我想你会发现它非常有效。

无耻外挂 BUBS Parser 实现了这种方法以及一些其他优化,因此实现了每秒大约 2500-5000 个单词的吞吐量,通常准确度至少等于我用 Stanford Parser 测量的准确度。显然,如果您正在使用 Stanford 流水线的其余部分,那么内置解析器已经很好地集成并且很方便。但如果您需要提高速度,BUBS 可能值得一看,它确实包含一些示例代码以帮助将引擎嵌入到更大的系统中。

记忆公共子串 关于您对预分析已知名词短语或其他具有一致结构的经常观察到的序列的想法:几年前我对类似的想法进行了一些评估(在大型语料库中共享公共子结构的情况下,在大规模解析时并行架构)。初步结果不是 encouraging.In 我们查看的语料库,只是没有足够长的重复子串,不值得。并且前面提到的单元格闭合方法通常使这些子串无论如何解析起来都非常便宜。

但是,如果您的目标域涉及大量重复,您可能会得出不同的结论(也许它对具有大量复制粘贴样板的法律文件有效?或者从各种来源或重新发布编辑?)