Как использовать синтаксический анализатор ссылок как средство проверки грамматики

Abiword использует синтаксический анализатор ссылок как простой инструмент проверки грамматики. Я хотел бы дублировать эту функцию с Python.

Существуют плохо документированные привязки Python, но я не знаю, как их использовать для имитации проверки грамматики в Abiword.

(Меня не интересуют фактические результаты анализа. Мне нужно только знать, правильно ли предложение анализирует синтаксический анализатор ссылок и, если нет, то какие слова не могут быть связаны.)

Каков наилучший метод для достижения этой цели?

1 ответ

Решение

Я не могу помочь вам имитировать возможности AbiWord по проверке грамматики, используя привязки Python, но я, по крайней мере, могу помочь вам построить его и проверить его функциональность.

Сборка с MS Visual Studio (32-битная архитектура)

Обычно я бы сказал, что "лучший способ добиться этого" - это создать библиотеку грамматики ссылок и привязки Python на компьютере с Linux, следуя подробным инструкциям в их файле readme. Однако, судя по вашему комментарию выше, Linux может не подходить, и, похоже, вы хотите использовать Visual Studio, а не Cygwin.

зависимости

Regex

Как указано в файле readme, библиотека грамматики ссылок зависит от той или иной формы POSIX-совместимой библиотеки регулярных выражений - в Linux она встроена. Однако в Windows вы можете (или, скорее, должны) выбрать реализацию библиотеки для использования. К счастью, версия 2.7 порта, предоставляемого GnuWin, прекрасно работала с файлами решений / проектов Visual Studio, предоставленными Link Grammar 5.3.11 (находится в %LINK_GRAMMAR%\msvc14).

Однако вы должны убедиться, что макрос сборки 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>

SWIG

Чтобы создавать привязки Python, вам нужно иметь SWIG в вашей системе. Однако для сборки, определенной проектом Visual Studio Python2.vcxproj чтобы найти исполняемый файл SWIG, необходимо добавить соответствующий каталог в путь Windows, например D:\Program Files (x86)\swigwin-3.0.10,

Как и в случае с библиотекой regex, вам нужно настроить проект 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 указывая на это.

Работает с Python

Теперь, когда вы проверили, что исполняемый файл Windows работает и привязки Python созданы, вы можете импортировать их в скрипт Python. Чтобы гарантировать, что они правильно импортированы и SWIG правильно разместил соответствующие библиотеки DLL, в readme Link Grammar упоминается о запуске исполняемого скрипта make-check.py загрузить и запустить ваш скрипт, используя грамматику ссылок:

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

где OUTDIR каталог, в который были записаны ваши привязки Python, например Win32\Debug\Python2, К сожалению, однако, несмотря на то, что этот файл упоминается в readme для версии 5.3.11, он фактически отсутствует в "стабильной" распространяемой версии 5.3.11 - несмотря на то, что в мастере GitHub есть его версия хранилище. Однако вы можете просто получить этот один файл из репозитория Git и затем использовать его в msvc14 каталог вашего 5.3.11 распространяемого. Как указано выше, однако, этот скрипт требует, чтобы regex2.dll быть на пути Windows: если он не был добавлен к глобальному пути, вам нужно будет добавить его к пути, доступному для исполняемого файла Python при запуске сценария.

C API против Python API

Я сам почти не использовал синтаксический анализатор Link Grammar и поэтому не могу вам помочь, но вы все еще можете понять, как их использовать, взглянув на код C для проекта. LinkGrammarExe, Вы можете начать с рассмотрения основной функции в link-parser\link-parser.c:

sent = sentence_create(input_string, dict);

...

num_linkages = sentence_parse(sent, opts);

В простой программе CLI, созданной проектом VS, она просто проверяет 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
Другие вопросы по тегам