четверг, 7 января 2016 г.

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

Попытался между делом написать код на PHP под правила языка, описанные в одной из предыдущих статей.

Работа ещё не завершена, но что-то уже прорисовывается. Можно нащупать проблемные места и сделать доработки. Код выложен на GitHub.

Код разделён на две части: сетевая (графовая) база данных и правила синтаксиса. Называются, соответственно, - graph и syntax.

Сетевая база предоставлет средства для извлечения и изменения связей узлов, а также позволяет прикреплять к узлам некоторый набор данных. После нескольких мучительных дней терзаний понял, что этот набор данных является значимой сущностью на более высоких слоях абстракции. Представление его в виде объекта с интерфейсом приводило к усложнению кода. Сначала было два варанта строка для хранения слов и строка для хранения ссылок на файл. (Да-да... Члены предложения могут быть и файлами. И кусками кода, если уж на то пошло.) И эти два интерфейса стали расползаться из глубин хранилища наверх до самого ГУЯ. Вобщем, теперь у узла может быть два значения NULL или строка. Интерпретация строки выполняется за пределами хранилища. Файл можно хранить в виде JSON-чика, в котором указан тип данных и ссылка или путь к файлу. Данные привязываются к узлу в момент создания и не могут быть изменены. По хэшу строки всегда можно найти, привязанный к ней узел. Узлы не удаляются. Причина тому в том, что свзи в базе однонаправленные, и для удаления некоторых узлов пришлось бы долго обходить, возможно, миллионы имеющихся узлов. Ради упрощения и ускорения действует принцип - слово не воробей, вылетит не поймаешь. На самом низком уровне связи хранятся в виде папок и ссылок файловой системы. Простенькие штучки на бесплатном сервере Cloud9 занимают где-то 0,1 секунды. Не плохо бы попробовать замерить на SSD и на машинке помощнее. На нижнем уровне хранилища можно будет задействовать Redis или подключиться к другой базе. Была идея выложить эти папочки со связями узлов в открытый доступ, чтобы можно было скармливать внешним системам как статику.

Правила синтаксиса определяют какие типы узлов могут быть увязаны. Вспомогательная подсистема обеспечивает наличие узлов-признаков типа. Другая подсистема предоставляет возможность запоминать последовательность узлов. В основной системе присутствуют следующие типы:

clause
Простое предложение. Содержит одно единственное сказуемое, обозначающее описываемое действие, и несколько уточняющих членов.

complimnet
Член предложения (кроме сказуемого). Привязывается через валентность к сказуемому и вопросам от него.

argument
Валентность сказуемого. Связывает сказуемое с вопросами, которые можно от него задать.

predicate
Сказуемое. Связано через валентность с вопросительными словами и всевозможными ответами на них в разных предложениях. Буквы сказуемого хранятся в специализированных узлах - словах.

question
Вопросительное слово. Берёт на себя функции падежных окончаний и много ещё чего, поскольку употребляем по новым правилам только начальные формы слов. Вопрос связан с ответом через валентнось и второстепенный член предложения. Буквы, как и в случае со сказуемым, содержаться в узлах-словах.

answer
Ответ.

word
Слово. Одно и то же слово может содержать ссылку на сказуемое, вопрос и ответ. В английском, например, одно и тоже слово может обозначать как действие, так и предмет. Или ещё для такого случая: "важно не сколько, а как".

Отсутствуют пока что узлы типа reference, которые позволят в качестве ответов использовать подчинённые предложения.

Вся система спроектирована таким образом, чтобы исключить дублирование на лексическом и близких к нему уровнях. Если предложения создаются по-новой, так что в системе может быть несколько одинаковых предложений, то до уровня члена предложения (compliment) узлы не дублируются.

Схема связей такова:


Комментариев нет:

Отправить комментарий