?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Entries by tag: процедурный API

Использование API грамматического движка с Python через ctypes
kelijah
К сожалению, принесенный из садика ежегодный ротавирус убивает время, поэтому выложу просто пример на питоне для создания движка, загрузки словаря и распознавания слова под 64-битной виндовой Анакондой:
Python ctypes + solarix grammar engine...Collapse )

Graceful cancellation для парсинга
kelijah
Для Win-версии сделал давно запланированную вещь - прекращение анализа с возврат  в пользовательский код из процеду sol_MorphologyAnalysis sol_SyntaxAnalysis в случае, когда затраченное время превышает заданный лимит (устанавливается аргументом вызова).

Вещь вроде бы простая, но реализовать ее долго не получалось красиво и правильно.

Проблема заключается вот в чем.

Если на вхо парсера попадает сложное предложение, он начинает долго перебирать варианты анализа. Прервать его "снаружи" невозможно. Когда меня пользователи спрашивали, разумно ли использовать thread termination в том или ином виде для убийства таких подвисших парсингов, я объяснял, что категорически нельзя. Так как внутри парсера много разных кэшей и буферов с ленивой инициализацией, обложенных мьютексами, то внезапное уничтожение потока анализа скорее всего оставит все это хозяйство в неопределенном состоянии.

Теперь ситуация станет получше. Когда прикладной код вызывает sol_MorphologyAnalysis или sol_SyntaxAnalysis с указанным ненулевым таймаутом, то парсер после исчерпания указанного
лимита времени считает, что все проверки правилах проваливаются. Это приводит к достаточно быстрому выходу из глубоких рекурсий, причем  без порчи внутренних структур или  залоченных мьютексов.

Под Win тесты вроде бы прошли без подвохов. Осталось проверить реализацию под Linux и можно отправлять в релиз.

Прошли основные тесты для версии 11
kelijah
Для платформ Win 32bit и 64bit собрал все компоненты (компилятор словаря, DLL движка и прочее) и прогнал тесты:

1. Морфологический разбор для ~4500 предложений и построение синтаксических деревьев для ~1300 предложений на русском языке. Многопоточный вариант - 11 потоков одновременно выполняют вызовы sol_MorphologyAnalysis и sol_SyntaxAnalysys для одного загруженного экземпляра словаря.

2. Аналогично для английского словаря. Примерно 5200 предложений для морфологического анализа, около 5000 предложений для синтаксического разбора, и многопоточный тест.

Что еще осталось.

1. Сборка и тесты на Linux.

2. Проверить, нет ли утечек памяти. После совершенного полного переписывания движка это безусловно необходимо. Хотя катастрофических утечет нет, это видно по динамике размера рабочего набора при выполнении анализа тестового корпуса.

Неполный синтаксический разбор
kelijah
Причесал код в анализаторе, который отвечает за поведение в случае, когда анализатор не может распознать структуру предложения целиком.

Визуализация и пояснения...Collapse )

Небольшое обновление
kelijah
Собрал и залил на сайт:

Ознакомительная версия SDK (Win32, 16 Мб). Для использования нового алгоритма синтаксического анализа нужно при вызове sol_SyntaxAnalysis указать для аргумента SyntacticFlags значение 2.

Morphology (Win, 18 Мб, описание) - оконная программа для тестирования морфологического анализатора. Написана с использованием Qt, использует dll из ознакомительной версии грамматического словаря.

Исходный текст файла grammar_engine_api.cpp (160 Кб) с кодом экспорта процедурного API - просто для информации.

Еще немного живой воды в PHP модуль
kelijah
Добавил в PHP модуль расширения php_gren горстку функций для сегментации, токенизации и морфологического анализа.

Тестовая страница http://178.64.252.139:8080/test.php

Для поддержки биндинга добавил в компилятор словаря генерацию php-констант для ID некоторых сущностей словаря в файл _sg_api.php.

Оптимистичный план: в следующей версии 11 добавить в SDK словаря php binding, обеспечивающий основные функции. Может быть даже с сишным исходником php_gren.c.

Туманно и неопределенно: сделать ООП-интерфейс, чтобы убрать за приличный фасад страшненький процедурный API. Это же касается и C# обертки, там для некоторых функций сделаны удобные обертки, скрывающие манипуляции со StringBuilder'ами, но конечно полноценные классы с поддержкой IEnumerable для перечисления элементов в результатах токенизации или морфоанализа были бы очень к месту.

Изменения в API токенизатора текста и прочие мелочи
kelijah
Будет много мелких и средних изменений:

Read more...Collapse )

PHP модуль грамматического словаря: проба
kelijah
Попробовал начать делать модуль расширения для PHP, который дает возможность использовать вызовы процедурного API.

Как можно убедиться по ссылке http://178.64.252.139:8080/test.php, модуль подает признаки жизни - подключается к словарной базе и выдает номер версии DLL, а также число словарных статей.

Упс, SQL хранилище оказалось быстрее бинарных файлов
kelijah
Тест русского морфологического анализатора, примерно 2600 предложений, реализация с хранением словаря в MySQL дает ~150 секунд, реализация с хранением словаря в локальных файлах ~180 секунд.

Другими словами,

(а) затраты на подкачку словарных статей и правил разбора из базы данных через libmysql.dll с пересечением границ процессов + затраты на десериализацию некоторых объектов + более эффективный поиск слов в лексиконе

оказываются в итоге меньше, чем

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

2 миллиона грамматических форм - это как бы уже не шутки, эффективность индексного поиска начинает сказываться.

Ленивая подгрузка статей, внешняя токенизация
kelijah
Добавил в процедурный API версии функций sol_LoadDictionaryEx и sol_CreateGrammarEngineEx, отличающиеся от "старых" дополнительным целочисленным аргументом - управляющие флаги.


Read more...Collapse )