除了工具...
您可能从理论上还记得有定义相同语言的无穷语法。有一些标准可以对语法进行分类,并确定哪种语言是给定语言的“规范”或“最小”语法,但是最后,“最佳”语法是一种对手头的任务和工具更方便的语法(请记住将CFG转换为LL和LR语法?)。
然后,您可能不需要庞大的词典来解析英语句子。关于一个单词,用德语或拉丁语(甚至西班牙语)这样的语言有很多了解,但在很多情况下却不是任意的和含糊的英语。您应该能够摆脱小型词典,该词典仅包含到达句子结构所必需的关键词。无论如何,选择的语法无论大小如何,都可以通过工具可以直接使用它的方式进行缓存(即,可以跳过语法分析)。
鉴于此,最好看一下其他人已经在使用的更简单的解析器。文献中一定有成千上万个。研究不同的方法可以让您评估自己的方法,并可能导致您采用别人的方法。
最后,正如我已经提到的,解释自然语言更多是关于人工智能而不是解析。因为结构决定含义,而意义决定结构,所以您必须同时使用两者。自80年代以来,我在文献中曾看到过一种方法,就是让不同的专业人士在“ 黑板 ”上解决问题。通过这种方法,语法分析和语义分析同时进行。
0
我需要为我的一个项目解析一小部分英语,描述为具有(1级)特征结构的无上下文语法( 示例 ),并且我需要有效地做到这一点。
现在,我正在使用NLTK的解析器,该解析器可以生成正确的输出,但是速度很慢。对于我大约450条相当模糊的非词典规则和50万条词汇条目的语法,解析简单的句子可能需要2到30秒的时间,具体取决于结果树的数量。词法条目对性能几乎没有影响。
另一个问题是,在一开始加载(25MB)语法和词典可能需要一分钟的时间。
从我的文献中可以发现,用于解析此类语法(Earley或CKY)的算法的运行时间应与语法大小成线性关系,与输入令牌列表的大小呈立方关系。我在NLTK方面的经验表明,歧义是影响性能最大的因素,而不是语法的绝对大小。
因此,现在我正在寻找CFG解析器来代替NLTK。我一直在考虑PLY,但是我无法确定它是否支持CFG中的功能结构(在我的情况下是必需的),而我所看到的示例似乎在进行大量过程解析,而不仅仅是指定语法。谁能给我展示一个既支持要素结构又使用声明式语法的PLY示例?
我也可以使用其他可以有效完成我所需要的解析器。 Python接口是可取的,但不是绝对必要的。