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

标签 parsing nlp text-processing text-parsing text-analysis

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

附注我们已经知道如何使用斯坦福解析器进行多线程,因此我们不会从这个角度寻找答案。

最佳答案

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

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

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

据我所知,斯坦福解析器目前没有实现这种修剪技术;我怀疑您会发现它非常有效。

无耻的插件 BUBS Parser实现了这种方法以及一些其他优化,从而实现了每秒大约 2500-5000 个单词的吞吐量,通常精度至少等于我用斯坦福解析器测量的精度。显然,如果您使用斯坦福管道的其余部分,内置解析器已经集成良好且方便。但如果您需要提高速度,BUBS 可能值得一看,它确实包含一些示例代码来帮助将引擎嵌入到更大的系统中。

内存常见子字符串 关于您对预先分析已知名词短语或其他具有一致结构的经常观察到的序列的想法:几年前我对类似的想法做了一些评估(在跨大型语料库共享公共(public)子结构的背景下,在解析大规模数据时)并行架构)。初步结果并不令人鼓舞。在我们查看的语料库中,没有足够长的重复子串,因此值得这样做。而且前面提到的单元闭合方法通常会使这些子字符串的解析成本非常低。

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

关于parsing - 通过修剪句子来减少斯坦福解析器的解析时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341007/

相关文章:

parsing - 制作语法 LL(1)

c++ - RapidXML 使用先前的属性值访问单个属性值?

python - NLTK 命名实体识别数据集中的列

machine-learning - 用于命名实体识别的 NLTK

python - 用于编辑 csv 文件或 Python 的 Sed 脚本

javascript - 解析 DateTime 值会呈现不同时区的不同日期 - JS

c - 如何检查特定字符是否按相同顺序出现?

Python 词干提取(使用 pandas 数据框)

python - WordNet 有 "levels"吗? (自然语言处理)

python - NER 标记器的替代品用于长的、异构的短语?