如何使用链接语法分析器作为语法检查器

时间:2016-07-23 19:33:21

标签: python parsing nlp grammar link-grammar

Abiword使用link grammar parser作为简单的语法检查程序。我想用Python复制这个功能。

存在记录不佳的Python绑定,但我不知道如何使用它们来模仿Abiword中的语法检查程序。

(我对实际的解析结果不感兴趣。我只需要知道一个句子是否用链接语法解析器解析好,如果不能解析哪些单词无法链接。)

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我无法帮助您使用Python绑定模仿AbiWord的语法检查能力,但我至少可以帮助您构建它并查看其功能。

使用MS Visual Studio构建(32位体系结构)

我通常会说“实现这一目标的最佳方法”是按照readme file中的大量说明在Linux机器上构建Link Grammar库和Python绑定。但是,根据您的comment above判断,Linux可能不是一个选项,并且您似乎希望坚持使用Visual Studio而不是使用例如Cygwin

依赖关系

正则表达式

正如自述文件中所述,Link Grammar库依赖于某种形式的POSIX兼容的正则表达式库 - 在Linux上,这是烘焙的。但是,在Windows中,您必须(或者更确切地说)选择要使用的库的实现。幸运的是,the port provided by GnuWin的2.7版本与Link Grammar 5.3.11(在%LINK_GRAMMAR%\msvc14下找到)提供的Visual Studio解决方案/项目文件非常吻合。

但是,您必须确保Visual Studio构建宏GNUREGEX_DIR指向您将正则表达式库解压缩到的目录(例如D:\Program Files (x86)\GnuWin32)。但请注意,这些构建宏与Windows环境变量相同:尽管在Windows 10下设置了一个名为GNUREGEX_DIR的环境变量,但Visual Studio却在我更改Link Grammar项目文件中构建宏的定义之前,使用此变量,即在%LINK_GRAMMAR%\msvc14\Local.props行中:

<GNUREGEX_DIR>$(HOMEDRIVE)$(HOMEPATH)\Libraries\gnuregex</GNUREGEX_DIR>

<GNUREGEX_DIR>$(GNUREGEX_DIR)</GNUREGEX_DIR>

SWIG

要创建Python绑定,您需要在系统上使用SWIG。但是,为了使Visual Studio项目Python2.vcxproj定义的构建版本能够找到SWIG可执行文件,您需要将相应的目录添加到Windows路径,例如, D:\Program Files (x86)\swigwin-3.0.10

与正则表达式库一样,您需要配置VS项目才能找到您的Python目录,例如如果您设置了相应的环境变量,请将<PYTHON2>C:\Python27</PYTHON2>中的Local.props更改为<PYTHON2>$(PYTHON2)</PYTHON2>

建筑

一旦Visual Studio找到了所有上述库,构建过程就非常轻松了:只需构建项目Python2,如果你打开了VS解决方案文件(LinkGrammar.sln),那么应该自动构建它所依赖的项目LinkGrammarLinkGrammarExe

解析共享库

构建可执行文件后,您仍然需要确保找到正则表达式共享库(DLL):为了做到这一点,包含所需库的目录(在本例中为regex2.dll)应该在你的道路上。将目录添加到全局路径可能最简单,例如在使用上面提到的GnuWin库并指向它的环境变量%GNUREGEX_DIR%\bin"的情况下GNUREGEX_DIR

使用Python运行

现在您已经测试了Windows可执行文件的运行并且已经构建了Python绑定,您可以将它们导入到Python脚本中。为了确保正确导入它们并且SWIG已正确定位相应的DLL,Link Grammar自述文件提到运行可执行脚本make-check.py以使用Link Grammar加载和运行脚本:

make-check [PYTHON_FLAG] PYTHON_OUTDIR [script.py] [ARGUMENTS]

其中OUTDIR是编写Python绑定的目录,例如Win32\Debug\Python2。然而不幸的是,尽管版本5.3.11的自述文件中提到了这个文件,但它实际上并不存在于the "stable" version 5.3.11 distributable中 - 尽管有a version of it in the GitHub master repository。但是,您可以从Git存储库中获取该文件,然后在5.3.11 distributable的msvc14目录中使用它。但是,如上所述,此脚本要求regex2.dll位于Windows路径上:如果尚未将其添加到全局路径,则必须在运行时将其添加到Python可执行文件可访问的路径中脚本。

C API与Python API

我自己没有使用过Link Grammar解析器,因此无法帮助您,但您仍然可以通过查看项目{C}的C代码来了解如何使用它们。您可以先查看LinkGrammarExe中的主要功能:

link-parser\link-parser.c

在VS项目构建的简单CLI程序中,它只检查sent = sentence_create(input_string, dict); ... num_linkages = sentence_parse(sent, opts); ,如果其值为num_linkages,则显示0,用户可以将其解释为含义这句话是不合语法的。当然可以调整此行为以接受评分较低的分析,找到不适合的单词等,因此您可以首先使用C API探索功能。稍后,如果您真的想要使用Python绑定,那么Python方法的命名方式与它们的C对应方式类似 - 请参阅文件No complete linkages found

clinkgrammar.py