Morpheus v.0.4 (Михаил Быков, OSSDEVCONF-2016) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) (→Видео) |
StasFomin (обсуждение | вклад) (→Расширенные тезисы) |
||
== Расширенные тезисы == Морфей использует только Javascript, на сервере это node.js, база данных CouchDB также использует JS. Веб --- сам себе JS. Код можно посмотреть здесь: \url{https://github.com/mbykov} Морфей основан на трех базовых модулях, \begin{itemize} \item[-] ;relax.js: --- взаимодействие с CouchDB \item[-] ;shiva-sutras.js: --- создание удобных подмножеств символов \item[-] ;sandhi.js: --- разбиение и объединение строк согласно правилам sandhi \end{itemize} \section{1. алгоритм} === Алгоритм === Процесс обработки сложного слова --- samAsa схематически такой (модули подробно описаны в документации на гитхабе): \begin{itemize} \item[-]* запрос-словоформа очищается от влияния соседних слов и преобразуется в стандартную форму, например, анусвара М заменяется на словарную форму -m, <latex> %\textlatin{[930?]}\textlatin{[93E?]}\textlatin{[92E?]}\textlatin{[902?]} %={\textgreater} \textlatin{[930?]}\textlatin{[93E?]}\textlatin{[92E?]}\textlatin{[92E?]}\textlatin{[94D?]}, etc (outer-sandhi.js); \item[-]</latex> * слово разбивается на цепочки-chains вероятных <<«чешуек<<{}-flakes» (<tt>vigraha.js</tt>); \item[-]* по словарю выделяются несклоняемые flake''flake'', --- либо indeclinable-avyaya, либо готовые формы (a.k.a. termins) \item[-]* несклоняемые выделяются в отдельный массив, и из всех flakes''flakes'' остаются потенциально склоняемые \item[-]* для каждой склоняемой flake''flake'' восстанавливается вероятная словарная форма \item[-]* отдельно для глаголов (<tt>tiNanta.js</tt>): \item[-]* и имен (<tt>subanta.js</tt>) \item[-]* образуется массив запросов к словарю, queries \item[-]* запрос несет в себе морфологическую информацию, (стем, окончание, тип окончания, часть речи, etc) \item[-]* образуется массив уникальных строк --- стемов: stems \item[-]* массив stems проверяется на наличие в словарях \item[-]* из всех flakes''flakes'' выбираются обнаруженные в словаре, нужные flakes''flakes'', теперь они называются, в соответствии с традицией, padas \item[-]''padas'' * из всех queries''queries'' выбираются соответсвующие найденным padas''padas'', \item[-]* из всех chains''chains'' выделяются лишь те, которые состоят из найденных padas''padas'', \item[-]* им присваются веса, чтобы более правдоподобные шли в начале \item[-]* сейчас вес полагается равным произведению кубов длин padas''padas'', приведенному к кубу длины исходного сложного слова - samAsa \item[-]* результат отображается в консоли, на экране, etc \end{itemize} \section*{2. описание === Описание основных модулей:} === в идеале, каждый модуль должен иметь два метода --- синтезирующий словоформу по правилам Панини, и анализирующий - восстанавливающий словарную форму слова. Сейчас в Морфее этому условию удовлетворяет только <tt>sandhi.js 2.a --- </tt> ;shiva-sutras.js : модуль конструирует произвольные необходимые наборы символов (звонкие согласные, долгие гласные, etc). Это вспомогательный модуль, позволяющий полностью разделить данные и код. 2.b --- ;sandhi.js : имеет два метода, <tt>.del(samAsa, second)</tt> и <tt>.add(first, second)</tt> и набор взаимно дополнительных тестов 2.d --- ;vigraha.js : разделение сложного слова --- samAsa --- на цепочки вероятных чешуек-flakes. Идея заимствована у SpamAsassin-a. Слово раскладывается на все возможные комбинации, входящие в массив частей от любого символа до любого следующего за ним. Невозможные чешуйки отбрасываются. Затем из них с помощию рекурсивной функции составляются вероятные цепочки-chains. Это очень ресурсозатратная процедура. Слово длиной 50 символов может давать 150 тысяч вероятных комбинаций. В зависимости от сложности и неоднозначности разбиений с учетом сандхи. Я пока не знаю другой свободной программы, кроме Морфея, выполняющую эту работу, а было бы полезно, например, для немецкого или русского. В качестве тестов <tt>vigraha.js</tt> я использую разложение всех сложных слов Бхагавад-Гиты, доступное в авторитетном источнике в сети. [1],~[2http://sanskritdocuments.org/doc_giitaa/bhagvadnew.html?lang=sa} \item \url{], [http://sanskritdocuments.org/doc_giitaa/bgwords.html?lang=sa] И дополнительные, составленные вручную наборы тестов, всего около 800 тестов. 2.c --- ;tiNanta.js: --- анализ морфологии глагола. Модуль основан на результатах работы dr. Dhaval Patel \& dr. Sivakumari Katuri из Хайдарабадского университета. Их [http://sanskritworld.in/sanskrittool/SanskritVerb/tiGanta.html программа 'SanskritVerb' [3] как раз является синтезирующей частью, порождающей около 245 тысяч словоформ. Которые являются тестами для модуля. 2.d --- ;subanta.js: --- анализ морфологии имен. Пока всего 1717 тестов, найденных вручную в сети. 2.c-d. иИ tiNanta.js, и subanta.js построены по одинаковому принципу: они создают набор проверяемых характерных окончаний на лету, прямо из набора тестов. Для конкретного теста, имеющего все формы склонения-спряжения, высчитывается общий stem, и набор окончаний. Некоторые наборы окончаний встречаются часто. Обычно они отображены в стандартных грамматиках. А в некоторых полученный stem равен вообще пустой строке. В это случае тест становится автоматически обработкой т.н. исключения. После чего тесты обязаны автоматически сходиться, и, очевидно, сходятся. (В tiNanta.js есть еще порождение соответствий корня-dhatu и всех его стемов. И проверка на присутствие полученного корня-dhatu в списке корней - DhatuPatha. Это отдельная тема). 2.e вВ процессе отображения в вебе используются вспомогательные модули \begin{itemize} \item[-] ;akshara.js: --- простой редактор \item[-] ;salita.js: --- конвертер nagari в транслитерации SLP1 и IAST для удобства работы в консоли \item[-] ;sanote.js: --- преобразование традиционной морфологической нотации в европейскую и vise versa \end{itemize} \section{3. --- словари} === Cловари === Морфей пока что использует 4 словаря. 3.a ---* словари Monier-Williams и Apte [4], [5http://www.sanskrit-lexicon.uni-koeln.de} \item \url{], [https://github.com/sanskrit-lexicon] в редакции группы волонтеров под руководством того же dr.Dhaval Patel [6]. 3.b ---https://github.com/drdhaval2785]. * словарь TS --- termins. Терминами я здесь назвал конечные формы, сложные по строению, но очень часто встречающиеся в тексте. В основном это формы местоимений, числительные (пока отключено), и, возможно, любые исключения. Термины - — потому что не требуют дальнейшего анализа. 3.c ---* словарь словоформ Бхагавад-Гиты [2http://sanskritdocuments.org/doc_giitaa/bgwords.html?lang=sa]. Этот словарь содержит конечные словоформы, как словарь TS, но не имеет морфологической расшифровки. Это просто удобство, особенно для начинающих изучать язык. Эти словоформы часто встречаются в любых текстах. * Всего словари содержат около 250 тысяч словарных статей. \section{4. в=== В версии 0.4 пока не сделано:} \begin{itemize} \item[-] === * анализ слов с суффиксами (kridanta и taddhita), \item[-]* сложных глагольных форм, таких как интенситивы, дезидеративы, etc \item[-]* звательного падежа \item[-]* типа сложных слов samAsa \end{itemize} Это будет выполнено в следующих версиях Морфея. \section{5. цель=== Цель разработки} === Здесь, на конференции в Калуге, хочется отметить, что моя цель в разработке этой свободной программы --- создать не конкретный сервис, а дешевую технологию разработки подобного класса программ, для любого языка. Для этого необходимо иметь только лишь одну вещь --- релевантный массив тестов. (И, очевидно, словари). Не обязательно иметь тесты, отображающие все вычурные тонкости теорий современного языкознания. Но необходимо отобразить в тестах все часто встречающиеся и характерные случаи речи и письма. Может быть, для ограниченных ситуаций, на ограниченном словаре, и т.д. Вдобавок полученные модули могут быть в дальнейшем как угодно улучшаться и развиваться, и заменяться на необходимые для более тонких задач. Мне кажется, пришло время разработки подобной программы для любого окружающего нас языка. По-моему, это как раз задача для сообщества разработчиков открытого софта, и не только программистов. Нужно еще отметить, что составление массива тестов для произвольного языка может быть не очень дешевой задачей, но она в любом случае необходима. Составление свободного и доступного массива тестов для любого распространенного языка есть отдельная необходимая задача для составителей официальных корпусов национальных языков. По-моему, еще не осознанная. Что бы ни являлось результатом их работы, релевантный массив тестов является уже результатом и абсолютно необходимой основой для любой разработки и оставляет руки свободными для всех сторонних разработчиков. Однако пока мы этого нигде не видим. \section{Ссылки} {\scriptsize \begin{enumerate} \item \url{} \item \url{} \item \url{} \item \url{} \end{enumerate} } == Примечания и отзывы == <!-- <blockquote>[©]</blockquote> --> <references/> [[Category:OSSDEVCONF-2016]] [[Category:Open-source]] [[Category:Draft]] |
Версия 22:55, 9 октября 2016
Содержание
Аннотация
- Докладчик
- Михаил Быков
Морфей ставит целью облегчение чтения текста и понимания автора. Он по сути — простая автоматизация работы со словарем и грамматическими справочниками.
Морфей не ставит своей целью изучение источника и автоматизацию и облегчение такого изучения. Изучение источника (лингвистика, современная наука вообще) и понимание источника — противоположные активности. Понимать автора — значит дать слово автору, а не современному исследователю.
В идеале Морфей — программа, которая при клике на слово должна дать ответ на вопрос «что значит это слово» так, как ответил бы автор. В тексте Аристотеля, как ответил бы Аристотель, в тексте Панини — как ответил бы Панини. Это, разумеется, недостижимая цель. Она, однако, позволяет резко ограничить и очертить, и упростить задачу. Вдобавок в случае Санскрита есть источники, позволяющие точно синтезировать, создать, породить любое слово. Это работы древних грамматиков — Панини, Патанджали, etc — огромный корпус текстов. Морфей ставит себе ровно обратную задачу — по конкретной форме слова определить его (древние) морфологические характеристики и словарное значение. Кстати, отсутствие этой задачи — абсолютное отсутствие даже упоминания о такой задаче во всем огромном корпусе древней санскритской грамматики — само по себе кричащий о природе санскритского слова факт.
Используемая и описываемая здесь технология годится для любого языка.
Видео
Расширенные тезисы
Морфей использует только Javascript, на сервере это node.js, база данных CouchDB также использует JS. Веб --- сам себе JS. Код можно посмотреть здесь: https://github.com/mbykov
Морфей основан на трех базовых модулях,
- relax.js
- взаимодействие с CouchDB
- shiva-sutras.js
- создание удобных подмножеств символов
- sandhi.js
- разбиение и объединение строк согласно правилам sandhi
Алгоритм
Процесс обработки сложного слова --- samAsa схематически такой (модули подробно описаны в документации на гитхабе):
- запрос-словоформа очищается от влияния соседних слов и преобразуется в стандартную форму, например, анусвара М
заменяется на словарную форму -m,
- слово разбивается на цепочки-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
Это будет выполнено в следующих версиях Морфея.
Цель разработки
Здесь, на конференции в Калуге, хочется отметить, что моя цель в разработке этой свободной программы --- создать не конкретный сервис, а дешевую технологию разработки подобного класса программ, для любого языка. Для этого необходимо иметь только лишь одну вещь --- релевантный массив тестов. (И, очевидно, словари). Не обязательно иметь тесты, отображающие все вычурные тонкости теорий современного языкознания. Но необходимо отобразить в тестах все часто встречающиеся и характерные случаи речи и письма. Может быть, для ограниченных ситуаций, на ограниченном словаре, и т.д. Вдобавок полученные модули могут быть в дальнейшем как угодно улучшаться и развиваться, и заменяться на необходимые для более тонких задач. Мне кажется, пришло время разработки подобной программы для любого окружающего нас языка. По-моему, это как раз задача для сообщества разработчиков открытого софта, и не только программистов.
Нужно еще отметить, что составление массива тестов для произвольного языка может быть не очень дешевой задачей, но она в любом случае необходима. Составление свободного и доступного массива тестов для любого распространенного языка есть отдельная необходимая задача для составителей официальных корпусов национальных языков. По-моему, еще не осознанная. Что бы ни являлось результатом их работы, релевантный массив тестов является уже результатом и абсолютно необходимой основой для любой разработки и оставляет руки свободными для всех сторонних разработчиков. Однако пока мы этого нигде не видим.