Morpheus v.0.4 (Михаил Быков, OSSDEVCONF-2016)
Материал из 0x1.tv
Содержание
Аннотация
- Докладчик
- Михаил Быков
Морфей ставит целью облегчение чтения текста и понимания автора. Он по сути — простая автоматизация работы со словарем и грамматическими справочниками.
Морфей не ставит своей целью изучение источника и автоматизацию и облегчение такого изучения. Изучение источника (лингвистика, современная наука вообще) и понимание источника — противоположные активности. Понимать автора — значит дать слово автору, а не современному исследователю.
В идеале Морфей — программа, которая при клике на слово должна дать ответ на вопрос «что значит это слово» так, как ответил бы автор. В тексте Аристотеля, как ответил бы Аристотель, в тексте Панини — как ответил бы Панини. Это, разумеется, недостижимая цель. Она, однако, позволяет резко ограничить и очертить, и упростить задачу. Вдобавок в случае Санскрита есть источники, позволяющие точно синтезировать, создать, породить любое слово. Это работы древних грамматиков — Панини, Патанджали, etc — огромный корпус текстов. Морфей ставит себе ровно обратную задачу — по конкретной форме слова определить его (древние) морфологические характеристики и словарное значение. Кстати, отсутствие этой задачи — абсолютное отсутствие даже упоминания о такой задаче во всем огромном корпусе древней санскритской грамматики — само по себе кричащий о природе санскритского слова факт.
Используемая и описываемая здесь технология годится для любого языка.
Видео
Расширенные тезисы
Морфей использует только Javascript, на сервере это node.js, база данных CouchDB также использует JS. Веб — сам себе JS. Код можно посмотреть здесь: https://github.com/mbykov
Морфей основан на трех базовых модулях,
- relax.js
- взаимодействие с CouchDB
- shiva-sutras.js
- создание удобных подмножеств символов
- sandhi.js
- разбиение и объединение строк согласно правилам sandhi
Алгоритм
Процесс обработки сложного слова — samAsa схематически такой (модули подробно описаны в документации на гитхабе):
- запрос-словоформа очищается от влияния соседних слов и преобразуется в стандартную форму, например, анусвара М
заменяется на словарную форму -m, (outer-sandhi.js)
- слово разбивается на цепочки-chains вероятных «чешуек-flakes» (vigraha.js);
- по словарю выделяются несклоняемые flake, — либо indeclinable-avyaya, либо готовые формы (a.k.a. termins)
- несклоняемые выделяются в отдельный массив, и из всех flakes остаются потенциально склоняемые
- для каждой склоняемой flake восстанавливается вероятная словарная форма
- отдельно для глаголов (tiNanta.js):
- и имен (subanta.js)
- образуется массив запросов к словарю, queries
- запрос несет в себе морфологическую информацию, (стем, окончание, тип окончания, часть речи, etc)
- образуется массив уникальных строк — стемов: stems
- массив stems проверяется на наличие в словарях
- из всех flakes выбираются обнаруженные в словаре, нужные flakes, теперь они называются, в соответствии с традицией, padas
- из всех queries выбираются соответсвующие найденным padas,
- из всех chains выделяются лишь те, которые состоят из найденных padas,
- им присваются веса, чтобы более правдоподобные шли в начале
- сейчас вес полагается равным произведению кубов длин padas, приведенному к кубу длины исходного сложного слова — samAsa
- результат отображается в консоли, на экране, etc
Описание основных модулей
в идеале, каждый модуль должен иметь два метода — синтезирующий словоформу по правилам Панини, и анализирующий - восстанавливающий словарную форму слова. Сейчас в Морфее этому условию удовлетворяет только sandhi.js
- shiva-sutras.js
- модуль конструирует произвольные необходимые наборы символов (звонкие согласные, долгие гласные, etc). Это вспомогательный модуль, позволяющий полностью разделить данные и код.
- sandhi.js
- имеет два метода, .del(samAsa, second) и .add(first, second) и набор взаимно дополнительных тестов
- vigraha.js
- разделение сложного слова — samAsa — на цепочки вероятных чешуек-flakes. Идея заимствована у SpamAsassin-a. Слово раскладывается на все возможные комбинации, входящие в массив частей от любого символа до любого следующего за ним. Невозможные чешуйки отбрасываются. Затем из них с помощию рекурсивной функции составляются вероятные цепочки-chains. Это очень ресурсозатратная процедура. Слово длиной 50 символов может давать 150 тысяч вероятных комбинаций. В зависимости от сложности и неоднозначности разбиений с учетом сандхи.
Я пока не знаю другой свободной программы, кроме Морфея, выполняющую эту работу, а было бы полезно, например, для немецкого или русского.
В качестве тестов vigraha.js я использую разложение всех сложных слов Бхагавад-Гиты, доступное в авторитетном источнике в сети. [1], [2]
И дополнительные, составленные вручную наборы тестов, всего около 800 тестов.
- tiNanta.js
- анализ морфологии глагола.
Модуль основан на результатах работы dr. Dhaval Patel \& dr. Sivakumari Katuri из Хайдарабадского университета. Их программа 'SanskritVerb' как раз является синтезирующей частью, порождающей около 245 тысяч словоформ. Которые являются тестами для модуля.
- subanta.js
- анализ морфологии имен.
Пока всего 1717 тестов, найденных вручную в сети.
И tiNanta.js, и subanta.js построены по одинаковому принципу: они создают набор проверяемых характерных окончаний на лету, прямо из набора тестов. Для конкретного теста, имеющего все формы склонения-спряжения, высчитывается общий stem, и набор окончаний. Некоторые наборы окончаний встречаются часто. Обычно они отображены в стандартных грамматиках. А в некоторых полученный stem равен вообще пустой строке. В это случае тест становится автоматически обработкой т. н. исключения. После чего тесты обязаны автоматически сходиться, и, очевидно, сходятся. (В tiNanta.js есть еще порождение соответствий корня-dhatu и всех его стемов. И проверка на присутствие полученного корня-dhatu в списке корней - DhatuPatha. Это отдельная тема).
В процессе отображения в вебе используются вспомогательные модули
- akshara.js
- простой редактор
- salita.js
- конвертер nagari в транслитерации SLP1 и IAST для удобства работы в консоли
- sanote.js
- преобразование традиционной морфологической нотации в европейскую и vise versa
Cловари
Морфей пока что использует 4 словаря.
- словари Monier-Williams и Apte [3], [4] в редакции группы волонтеров под руководством того же dr.Dhaval Patel [5].
- словарь TS — termins. Терминами я здесь назвал конечные формы, сложные по строению, но очень часто встречающиеся в тексте. В основном это формы местоимений, числительные (пока отключено), и, возможно, любые исключения. Термины — потому что не требуют дальнейшего анализа.
- словарь словоформ Бхагавад-Гиты [6]. Этот словарь содержит конечные словоформы, как словарь TS, но не имеет морфологической расшифровки. Это просто удобство, особенно для начинающих изучать язык. Эти словоформы часто встречаются в любых текстах.
- Всего словари содержат около 250 тысяч словарных статей.
В версии 0.4 пока не сделано
- анализ слов с суффиксами (kridanta и taddhita),
- сложных глагольных форм, таких как интенситивы, дезидеративы, etc
- звательного падежа
- типа сложных слов samAsa
Это будет выполнено в следующих версиях Морфея.
Цель разработки
Здесь, на конференции в Калуге, хочется отметить, что моя цель в разработке этой свободной программы — создать не конкретный сервис, а дешевую технологию разработки подобного класса программ, для любого языка. Для этого необходимо иметь только лишь одну вещь — релевантный массив тестов. (И, очевидно, словари). Не обязательно иметь тесты, отображающие все вычурные тонкости теорий современного языкознания. Но необходимо отобразить в тестах все часто встречающиеся и характерные случаи речи и письма. Может быть, для ограниченных ситуаций, на ограниченном словаре, и т. д. Вдобавок полученные модули могут быть в дальнейшем как угодно улучшаться и развиваться, и заменяться на необходимые для более тонких задач. Мне кажется, пришло время разработки подобной программы для любого окружающего нас языка. По-моему, это как раз задача для сообщества разработчиков открытого софта, и не только программистов.
Нужно еще отметить, что составление массива тестов для произвольного языка может быть не очень дешевой задачей, но она в любом случае необходима. Составление свободного и доступного массива тестов для любого распространенного языка есть отдельная необходимая задача для составителей официальных корпусов национальных языков. По-моему, еще не осознанная. Что бы ни являлось результатом их работы, релевантный массив тестов является уже результатом и абсолютно необходимой основой для любой разработки и оставляет руки свободными для всех сторонних разработчиков. Однако пока мы этого нигде не видим.
Примечания и отзывы
Plays:48
Comments:0