高效的上下文无关语法解析器,最好是Python友好的
nlp
nltk
python
4
0

我需要为我的一个项目解析一小部分英语,描述为具有(1级)特征结构的无上下文语法( 示例 ),并且我需要有效地做到这一点。

现在,我正在使用NLTK的解析器,该解析器可以生成正确的输出,但是速度很慢。对于我大约450条相当模糊的非词典规则和50万条词汇条目的语法,解析简单的句子可能需要2到30秒的时间,具体取决于结果树的数量。词法条目对性能几乎没有影响。

另一个问题是,在一开始加载(25MB)语法和词典可能需要一分钟的时间。

从我的文献中可以发现,用于解析此类语法(Earley或CKY)的算法的运行时间应与语法大小成线性关系,与输入令牌列表的大小呈立方关系。我在NLTK方面的经验表明,歧义是影响性能最大的因素,而不是语法的绝对大小。

因此,现在我正在寻找CFG解析器来代替NLTK。我一直在考虑PLY,但是我无法确定它是否支持CFG中的功能结构(在我的情况下是必需的),而我所看到的示例似乎在进行大量过程解析,而不仅仅是指定语法。谁能给我展示一个既支持要素结构又使用声明式语法的PLY示例?

我也可以使用其他可以有效完成我所需要的解析器。 Python接口是可取的,但不是绝对必要的。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

除了工具...

您可能从理论上还记得有定义相同语言的无穷语法。有一些标准可以对语法进行分类,并确定哪种语言是给定语言的“规范”或“最小”语法,但是最后,“最佳”语法是一种对手头的任务和工具更方便的语法(请记住将CFG转换为LL和LR语法?)。

然后,您可能不需要庞大的词典来解析英语句子。关于一个单词,用德语或拉丁语(甚至西班牙语)这样的语言有很多了解,但在很多情况下却不是任意的和含糊的英语。您应该能够摆脱小型词典,该词典仅包含到达句子结构所必需的关键词。无论如何,选择的语法无论大小如何,都可以通过工具可以直接使用它的方式进行缓存(即,可以跳过语法分析)。

鉴于此,最好看一下其他人已经在使用的更简单的解析器。文献中一定有成千上万个。研究不同的方法可以让您评估自己的方法,并可能导致您采用别人的方法。

最后,正如我已经提到的,解释自然语言更多是关于人工智能而不是解析。因为结构决定含义,而意义决定结构,所以您必须同时使用两者。自80年代以来,我在文献中曾看到过一种方法,就是让不同的专业人士在“ 黑板 ”上解决问题。通过这种方法,语法分析和语义分析同时进行。

收藏
评论

一定要看看Pyparsing 。这是我遇到的最Python化的解析实现,从纯粹的学术角度来看,这是一个很棒的设计。

我同时使用ANTLRJavaCC在本地大学教授翻译和编译器理论。它们既好又成熟,但是我不会在Python项目中使用它们。

就是说,与编程语言不同,自然语言更多地是关于语义而不是语法,因此跳过自定义语法(自顶向下,回溯,无限制)的现有解析工具的学习曲线可能会更好。前瞻性)词法分析器和解析器,并花费大量时间来编写代码,以弄清已解析但模棱两可的自然语言语句的含义。

收藏
评论

我建议使用bitpar,这是一种用C ++编写的非常高效的PCFG解析器。我已经为此编写了基于外壳的Python包装器,请参见https://github.com/andreasvc/eodop/blob/master/bitpar.py

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号