Abiword使用link grammar parser作为简单的语法检查程序。我想用Python复制这个功能。
存在记录不佳的Python绑定,但我不知道如何使用它们来模仿Abiword中的语法检查程序。
(我对实际的解析结果不感兴趣。我只需要知道一个句子是否用链接语法解析器解析好,如果不能解析哪些单词无法链接。)
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
我无法帮助您使用Python绑定模仿AbiWord的语法检查能力,但我至少可以帮助您构建它并查看其功能。
我通常会说“实现这一目标的最佳方法”是按照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>
要创建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
。
现在您已经测试了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可执行文件可访问的路径中脚本。
我自己没有使用过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