Abiword はリンク文法パーサーを単純な文法チェッカーとして使用します。この機能を Python で複製したいと思います。
十分に文書化されていない Python バインディングが存在しますが、それらを使用して Abiword の文法チェッカーを模倣する方法がわかりません。
(実際の解析結果には興味がありません。リンク文法パーサーで文が正しく解析されるかどうか、そうでない場合はどの単語をリンクできないかを知る必要があるだけです。)
これを達成するための最良の方法は何ですか?
Python バインディングを使用して AbiWord の文法チェック機能を模倣することはできませんが、少なくとも AbiWord を構築してその機能を確認することはできます。
通常、「これを達成するための最良の方法」は、Linux マシン上で Link Grammar ライブラリと Python バインディングをビルドすることであり、readme ファイルの詳細な指示に従っていると言えます。ただし、上記のコメントから判断すると、Linux はオプションではない可能性があり、たとえばCygwinを使用するよりも Visual Studio を使用することに固執したいようです。
readme に記載されているように、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環境変数と同じではないことに注意してください。ファイル、つまり次の行にあります。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
.
正規表現ライブラリと同様に、Python ディレクトリを見つけることができるように VS プロジェクトを構成する必要があります。たとえば、対応する環境変数が設定されている場合はに変更<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 の readme には、Link Grammarmake-check.py
を使用してスクリプトをロードおよび実行するための実行可能スクリプトの実行について言及されています。
make-check [PYTHON_FLAG] PYTHON_OUTDIR [script.py] [ARGUMENTS]
whereOUTDIR
は、Python バインディングが書き込まれたディレクトリです (例: Win32\Debug\Python2
. 残念ながら、このファイルはバージョン 5.3.11 の readme に記載されていますが、実際には配布可能な「安定した」バージョン 5.3.11には存在しません — GitHub マスターにそのバージョンがあるにもかかわらずリポジトリ。ただし、その 1 つのファイルを Git リポジトリから取得してmsvc14
、5.3.11 配布可能ファイルのディレクトリで使用することはできます。ただし、前述のように、このスクリプトはregex2.dll
Windows パス上にある必要があります。グローバル パスに追加されていない場合は、スクリプトを実行するときに Python 実行可能ファイルにアクセスできるパスに追加する必要があります。
私自身は Link Grammar パーサーをあまり使用していないため、その点については役に立ちませんが、 project の 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