Новый алгоритм ассоциирования и конвертации - shyzik93/ManSPy GitHub Wiki

Внимание!

Эти идеи только реализуются в виде исходного кода в отличии от предыдущей версии ФАСИФа, поэтому они до конца ещё не продуманы, некоторые моменты имеют несколько "размытых" вариантов.

Основная идея

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

Новая идея расширяет возможности программы и делает её более гибкой. Идея заключается в нескольких вариантах ассоциирования:

  • словосочетание ассоциируется с функцией. В этом случае функция используется для получения состояния словосочетания (объекта, конкретизированного словосочетанием). Например, это могут быть "курсы валют", "свет в зале". Кроме этого, ассоциируется функция изменения состояния - такая функция будет вызываться в случае использования соответствующего сказуемого и словосочетания. Например, "включи свет в прихожей" - вызовет одну функцию, а "включи телевизор" - другую.
  • глагол ассоциируется с функцией - в этом случае функция принимает состояния словосочетаний и производит с ними какие-либо действия. Например, глаголы "покажи", "выведи на монитор", "напечатай на принтере" и т. д. Функция, вероятно, должна принимать информацию о словосочетании.

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

Далее - подробная и более запутанная теория.

Словосочетание, его состояние и ассоциирование. Глагол

Словосочетание - https://ru.m.wikipedia.org/wiki/Словосочетание Цитата из вышеприведённой ссылки: "Словосочета́ние — это соединение двух или нескольких самостоятельных слов, связанных по смыслу и грамматически, служащее для расчленённого обозначения единого понятия (предмета, ка­чества, действия и др.)." Другими словами, словосочетание - это несколько взаимосвязанных членов, обозначающих единое понятие. Единое понятие - это и есть объект (абстрактный или вещественный). Объекты могут закрепляться как за словами, так и за словосочетаниями (выделенный из множества объект, более конкретизированный).

Состояние словосочетания - это состояние объекта, закреплённого за словосочетанием. Для получения состояния используется конкретная для данного словосочетания безглагольная функция. Состояние некоторых объектов нельзя менять (курс валюты), а некоторых - можно (лампа). Состояния могут быть самые разные, но пока будем считать, что есть основное состояние. Все типы состояний имеют различный приориритет в зависимости от обстоятельства и других причин (не обязательно указанных в предложении, но также полученные из других источников - датчиков, пользователей, книг)

Примеры состояний:

  • "курс доллара по российскому банку" - 62.75 рублей;
  • "настольный светильник в комнате" - включена / выключена (определяется уровенем напряжения на её входе, уровенем фактического излучаемого света (в люменах)), светимость (уровень излучения света).
  • "адрес компьютера" - ip, mac, 192.168.0.101, aa:bb:cc:dd:ee:ff
  • "синоним такого-то слова" - ?

Глаголы могут ассоциироваться с функциями:

  • дефолтными - действуют для всех словосочетаний. Нужная функция вызывается в зависимости от обстоятельства или его отсутствия. ("свистни", "свистни в соседней комнате" - обстоятельство места). По сути, ассоциируются с комбинацией глагол - обстоятельство. Обстоятельство может отсутствовать.
  • конкретными - определяются при ассоциировании со словосочетанием. Вызываются определённым глаголом с определённым словосочетанием. По сути, ассоциируются с комбинацией глагол - словосочетание.
  • безглагольные - получают состояние словосочетания. Не имеют ассоциаций с глаголом. Ассоциируются лишь со словосочетанием.

Примеры

ФАСИФы можно прописывать как в одном файле, так и в нескольких файлах. Файлы с ФАСИФами должны лежать в папке МД ("ManSPy/Action"). Каждый ФАСИФ имеет заголовок, указывающий на тип ассоциирования. Заголовок начинается с символов "#:". Между любыми строками допускается более одного переноса. Каждый ФАСИФ состоит из блоков, а те - из заголовка и тела. Иногда тело может отсутствовать. Тело имеет отступ в 4 пробела в начале строки. Комментарии начинаются с символа "#" (кроме "#:"). Функции бывают двух типов: встроенные ("$ИмяФункции") и внешние ("ИмяМодуля/ИмяФункции").

##Ассоциации "функция и глагол"

#:Verb                                        # заголовок ФАСИФа
$ToUser                                     # заголовок блока - здесь функция
    Esperanto: montri                # глаголы в начальной форме
    Russian: показывать
    English: to print                    # максимум - два слова (частица и глагол)

##Ассоциации "функция и глагол-обстоятельство"

montru на очках Google - GoogleGlass.ShowOnGoogleGlass

Можно сделать, чтобы, если использован глагол без указанных обстоятельств, функция выбиралась исходя из тех обстоятельств, которые определены программой "на ходу", например, через датчики, вебкамеру, микрофон, историю переписки и т. д.

##Ассоциации "функция и словосочетание, функция и глагол-словосочетание "

Для обдумывания ;) :

dolara: monero # аргументные слова
rusia: lando, nacio # после точки с запятой можно указать другое слово из другой абстр. группы.
dolara cambio de rusia banko - CurrenciesLoader.GetCourse # получение состояния

tabla: meblara; *
dormcxambro: cxambro # banko и lampo - это константные слова
tabla lampo en dormcxambro - smart_home.LightStatus # получение состояния
                           - smart_home.LightOn (sxaltu)# изменение состояния. Нужно указать дополнительный аргумент - новое сотостояние.

adreso de computilo - smart_home.showAddress

Состоит из трёх блоков - назначение функций, описание аргументов функций, описание аргументных слов + словосочетание.

#:WordCombination # заголовок ФАСИФа

getCondition: CurrencyLoader/GetCourse  # Назначение: ИмяМодуляБезРасширения/ИмяФункции

currency y ;  Esperanto ; Russian
    USD      ;  dolara   ; доллара
    RUB      ;  rubla    ;
    EUR      ;  eura     ;
    UAH      ;  grivna   ;
country n ;  Esperanto
    Russia  ;  rusia
    Belarus ;  belarusia
    Ukraine ;  ukrainia
#country n #- если не требуется замена значения аргумента, тогда в функцию будут передаваться корни глаголов

Esperanto
    dolaran: monero # аргументное слова: абстрактные группы через запятую
    rusia: lando
    dolara cambio de rusia banko
Russian
    доллара: валюта
    русскому: страна, национальность
    курс доллара согласно русскому банку

##Ассоциации "функция и предложение" (с константным глаголом)

dolaro: monero; * # то есть можно подставлять любое слово из любой абстр. группы
bakso: monero; *
dolaro estas sinonimo de bakso
# estas и sinonimo - это константы. Так как в этом предложении есть глагол-константа, то указывать другие глаголы - нет смысла. В будущем можно указать функции для других наклонений и времён этого же глагола.

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

Пути преобразования предложений


  1. "montru dolaran cambion de rusia banko" - исходное предложение
  2. "montru '61.46' " - вызвали функцию CurrenciesLoader.GetCourse('dolar', 'rusi') для получения состояния.
  3. Вызываем функцию $ToUser(61.46) с передачей ей состояния объекта.

  1. "montru tablan lampon en dormcxambro"
  2. "montru 'вкл' " - вызвана функция smart_home.LightStatus('tabl', 'dormcxambr') для получения статуса
  3. Вызываем функцию $ToUser('вкл') с передачей ей состояния объекта.'

  1. "sxaltu tablan lampon en dormcxambro"
  2. Вызываем функцию smart_home.LightOn('tabl', 'dormcxambr') с передачей ей аргументов.

  1. "montru dolaran cambion de rusia banko, ke tabla lampo en dormcxambro estas 'вкл'" - исходное предложение
  2. "montru '61.46', ke 'вкл' estas 'вкл' " - вызвали функцию CurrenciesLoader.GetCourse('dolar', 'rusi') для получения состояния. Вызвали функцию smart_home.LightStatus('tabl', 'dormcxambr') для получения состояния.
  3. Если " 'вкл' estas 'вкл' ", то вызываем функцию $ToUser(61.46) с передачей ей состояния объекта.

  1. "montru adreson de computilo kaj euxran cambion de belarusia banko"
  2. "montru '192.168.0.101' kaj '70.76' " - вызваны smart_home.showAddress('computil') и CurrenciesLoader.GetCourse('euxro', 'belarusi')
  3. $ToUser(192.168.0.101, 70.76)

  1. " dolaro estas holonimo de monero "

  1. " dolaro estas sinonimo de bakso "

Все дефолтные функции должны принимать неограниченное количество аргументов. Все словосочетания должны иметь краткую формулу, по которой оно будет искаться в БД.

Первый вариант формулизации словосочетаний.

Цель формулизации словосочетаний: поиск равного словосочетания в базе данных для извлечения ассоциированных с ним функций. Пока используются только именные словосочетания.

Требования и особенности:

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

Алгоритм формулизации:

  1. Строка словосочетания преобразуется в объект предложения в процессе графематического анализа. Затем выполняются остальные стандартные лингвистические анализы, и из объекта предложения вынимается ассоциативный массив (словарь) с полученными характеристиками каждого члена предложения.
  2. Создаётся копия словосочетания, в которую переносятся значимые характеристики слов - падеж (кроме первого), член предложения (кроме первого), часть речи, обстоятельства и определения.
  3. В обстоятельства и определения переносится член предложения.
  4. Словосочетание конвертируется в json-строку с отсортированными ключами. К полученной строке применяется встроенная в Python функция hash().

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

Первый вариант преобразования предложений от пользователей

Второй вариант формулизации словосочетаний.

Словосочетание перед добавлением в базу превращается в регулярное выражение, которое используется для сравнения при поиске со словосочетанием, извлечённым из предложения от пользователя. Следовательно, функция формулизации должна иметь два режима: превращение в регулярное выражение и превращение в строку-копию. Регулярное выражение должно позволить учитывать аргументные слова и однородные члены.