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

How to use the link grammar parser as a grammar checker

A​​biword 使用 link grammar parser 作为简单的语法检查器。我想用 Python 复制此功能。

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

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

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

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

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

我通常会说 "the best method to achieve this" 是在 Linux 机器上按照 [=] 中的详细说明构建 Link 语法库和 Python 绑定43=].

依赖项

正则表达式

如自述文件中所述,Link 语法库依赖于某种形式的 POSIX 兼容正则表达式库 — 在 Linux 上,这是内置的。但是,在 Windows 中,您可以(或者更确切地说必须)选择要使用的库的实现。幸运的是,the port provided by GnuWin 的 2.7 版与 Link 语法 5.3.11(在 %LINK_GRAMMAR%\msvc14 下找到)提供的 Visual Studio solution/project 文件配合得很好。

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

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

<GNUREGEX_DIR>$(GNUREGEX_DIR)</GNUREGEX_DIR>

痛饮

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

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

建筑物

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

正在解析共享库

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

运行 Python

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

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

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

C API 对比 Python API

我自己并没有经常使用 Link 语法分析器,因此无法在这方面帮助您,但是您仍然可以通过查看项目的 C 代码了解如何使用它们 LinkGrammarExe。可以先看看link-parser\link-parser.c:

中的main函数
sent = sentence_create(input_string, dict);

...

num_linkages = sentence_parse(sent, opts);

在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