Abiword 使用链接语法分析器作为简单的语法检查器。我想用 Python 复制这个功能。
存在记录不充分的 Python 绑定,但我不知道如何使用它们来模仿 Abiword 中的语法检查器。
(我对实际的解析结果不感兴趣。我只需要知道一个句子是否用链接语法解析器解析好,如果不是,哪些词不能链接。)
实现这一目标的最佳方法是什么?
我无法帮助您使用 Python 绑定来模仿 AbiWord 的语法检查能力,但我至少可以帮助您构建它并检查它的功能。
我通常会说“实现这一目标的最佳方法”是按照其自述文件中的大量说明在 Linux 机器上构建 Link Grammar 库和 Python 绑定。但是,从您上面的评论来看,Linux 可能不是一个选项,而且您似乎希望坚持使用 Visual Studio 而不是使用Cygwin。
如自述文件中所述,Link Grammar 库依赖于某种形式的 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
名为文件,即在以下行中:%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 目录,例如<PYTHON2>C:\Python27</PYTHON2>
,如果您设置了相应的环境变量,请更改Local.props
为。<PYTHON2>$(PYTHON2)</PYTHON2>
一旦 Visual Studio 可以找到上述所有库,构建过程就非常轻松:只需构建项目Python2
,如果您打开了 VS 解决方案文件 ( LinkGrammar.sln
),它应该会自动构建项目LinkGrammar
和项目LinkGrammarExe
,这取决于它。
构建可执行文件后,您仍然需要确保可以找到正则表达式共享库 (DLL):为此,包含所需库的目录(在本例中为regex2.dll
)应该在您的路径中。将目录添加到全局路径可能是最简单的方法,例如%GNUREGEX_DIR%\bin"
在使用上面提到的 GnuWin 库的情况下,环境变量GNUREGEX_DIR
指向它。
现在您已经测试了 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 版本的自述文件中提到了这个文件,但事实上,它并没有出现在“稳定”版本 5.3.11 可分发中——尽管GitHub 主文件中有它的一个版本存储库。但是,您可以简单地从 Git 存储库中获取该文件,然后在msvc14
5.3.11 可分发的目录中使用它。但是,如上所述,此脚本要求它regex2.dll
位于 Windows 路径中:如果尚未将其添加到全局路径中,则必须在运行脚本时将其添加到 Python 可执行文件可访问的路径中。
我自己并没有大量使用 Link Grammar 解析器,因此无法帮助您,但是您仍然可以通过查看项目的 C 代码来了解如何使用它们LinkGrammarExe
。您可以从查看 main 函数开始link-parser\link-parser.c
:
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