Morpheus v.0.4 (Михаил Быков, OSSDEVCONF-2016)

Материал из 0x1.tv

Аннотация

Докладчик
Михаил Быков.jpg
Михаил Быков

Морфей ставит целью облегчение чтения текста и понимания автора. Он по сути — простая автоматизация работы со словарем и грамматическими справочниками.

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

В идеале Морфей — программа, которая при клике на слово должна дать ответ на вопрос «что значит это слово» так, как ответил бы автор. В тексте Аристотеля, как ответил бы Аристотель, в тексте Панини — как ответил бы Панини. Это, разумеется, недостижимая цель. Она, однако, позволяет резко ограничить и очертить, и упростить задачу. Вдобавок в случае Санскрита есть источники, позволяющие точно синтезировать, создать, породить любое слово. Это работы древних грамматиков — Панини, Патанджали, etc — огромный корпус текстов. Морфей ставит себе ровно обратную задачу — по конкретной форме слова определить его (древние) морфологические характеристики и словарное значение. Кстати, отсутствие этой задачи — абсолютное отсутствие даже упоминания о такой задаче во всем огромном корпусе древней санскритской грамматики — само по себе кричащий о природе санскритского слова факт.

Используемая и описываемая здесь технология годится для любого языка.

Видео

on youtube

Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.


Расширенные тезисы

Морфей использует только 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

Это будет выполнено в следующих версиях Морфея.

Цель разработки

Здесь, на конференции в Калуге, хочется отметить, что моя цель в разработке этой свободной программы — создать не конкретный сервис, а дешевую технологию разработки подобного класса программ, для любого языка. Для этого необходимо иметь только лишь одну вещь — релевантный массив тестов. (И, очевидно, словари). Не обязательно иметь тесты, отображающие все вычурные тонкости теорий современного языкознания. Но необходимо отобразить в тестах все часто встречающиеся и характерные случаи речи и письма. Может быть, для ограниченных ситуаций, на ограниченном словаре, и т. д. Вдобавок полученные модули могут быть в дальнейшем как угодно улучшаться и развиваться, и заменяться на необходимые для более тонких задач. Мне кажется, пришло время разработки подобной программы для любого окружающего нас языка. По-моему, это как раз задача для сообщества разработчиков открытого софта, и не только программистов.

Нужно еще отметить, что составление массива тестов для произвольного языка может быть не очень дешевой задачей, но она в любом случае необходима. Составление свободного и доступного массива тестов для любого распространенного языка есть отдельная необходимая задача для составителей официальных корпусов национальных языков. По-моему, еще не осознанная. Что бы ни являлось результатом их работы, релевантный массив тестов является уже результатом и абсолютно необходимой основой для любой разработки и оставляет руки свободными для всех сторонних разработчиков. Однако пока мы этого нигде не видим.

Морфей для Китайского языка (Михаил Быков, OSSDEVCONF-2017)!.jpg

Примечания и отзывы


Plays:53   Comments:0