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

Nem*_*XXX 6 python grammar parsing nlp link-grammar

Abiword使用链接语法解析器作为简单的语法检查器.我想用Python复制这个功能.

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

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

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

err*_*ist 2

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

使用 MS Visual Studio 构建(32 位架构)

我通常会说“实现此目的的最佳方法”是按照自述文件中的详细说明在 Linux 计算机上构建链接语法库和 Python绑定然而,从您上面的评论来看,Linux 可能不是一个选择,而且您似乎想坚持使用 Visual Studio 而不是使用Cygwin等。

依赖关系

正则表达式

正如自述文件中所述,链接语法库依赖于某种形式的 POSIX 兼容正则表达式库 - 在 Linux 上,这是内置的。但是,在 Windows 中,您可以(或者更确切地说必须)选择要使用的库的实现。幸运的是, GnuWin 提供的移植版本 2.7与 Link Grammar 5.3.11 提供的 Visual Studio 解决方案/项目文件(可在 参考资料下找到%LINK_GRAMMAR%\msvc14)配合得很好。

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

<GNUREGEX_DIR>$(HOMEDRIVE)$(HOMEPATH)\Libraries\gnuregex</GNUREGEX_DIR>
Run Code Online (Sandbox Code Playgroud)

<GNUREGEX_DIR>$(GNUREGEX_DIR)</GNUREGEX_DIR>
Run Code Online (Sandbox Code Playgroud)

斯威格

为了创建 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项目LinkGrammar和。LinkGrammarExe

解决共享库问题

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

使用Python运行

现在您已经测试了 Windows 可执行文件确实运行并且 Python 绑定已经构建,您可以将它们导入到 Python 脚本中。为了确保它们被正确导入并且 SWIG 已正确找到适当的 DLL,链接语法自述文件提到运行可执行脚本make-check.py以使用链接语法加载和运行脚本:

make-check [PYTHON_FLAG] PYTHON_OUTDIR [script.py] [ARGUMENTS]
Run Code Online (Sandbox Code Playgroud)

其中OUTDIR是写入 Python 绑定的目录,例如Win32\Debug\Python2. 然而不幸的是,尽管这个文件在版本 5.3.11 的自述文件中提到,但事实上,它并不存在于“稳定”版本 5.3.11 的可分发版本中——尽管GitHub master 中有一个版本存储库。不过,您可以简单地从 Git 存储库获取该文件,然后在msvc145.3.11 发行版的目录中使用它。但是,如上所述,该脚本要求regex2.dll位于 Windows 路径上:如果尚未将其添加到全局路径中,则必须在运行脚本时将其添加到 Python 可执行文件可访问的路径中。

C API 与 Python API

我自己没有太多使用链接语法解析器,因此无法为您提供帮助,但您仍然可以通过查看项目的 C 代码来了解如何使用它们LinkGrammarExe。您可以首先查看以下中的 main 函数link-parser\link-parser.c

sent = sentence_create(input_string, dict);

...

num_linkages = sentence_parse(sent, opts);
Run Code Online (Sandbox Code Playgroud)

在VS项目构建的简单CLI程序中,它只是简单地检查num_linkages,如果其值为0,则显示No complete linkages found,用户可以将其解释为该句子不符合语法。当然可以调整此行为以接受较低分的解析、查找不适合的单词等,因此您可以首先使用 C API 探索功能。稍后,如果您确实想使用 Python 绑定,则 Python 方法的命名方式与其 C 对应项类似 - 请参阅该文件clinkgrammar.py

def sentence_parse(sent, opts):
    return _clinkgrammar.sentence_parse(sent, opts)
    sentence_parse = _clinkgrammar.sentence_parse
Run Code Online (Sandbox Code Playgroud)