Новый алгоритм ассоциирования и конвертации - 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 - это константы. Так как в этом предложении есть глагол-константа, то указывать другие глаголы - нет смысла. В будущем можно указать функции для других наклонений и времён этого же глагола.
Словосочетание с аргументными словами из других гиперонимов и/или отличными константами - это уже совсем другое словосочетание, его можно смело использовать для новых функций.
Пути преобразования предложений
- "montru dolaran cambion de rusia banko" - исходное предложение
- "montru '61.46' " - вызвали функцию CurrenciesLoader.GetCourse('dolar', 'rusi') для получения состояния.
- Вызываем функцию $ToUser(61.46) с передачей ей состояния объекта.
- "montru tablan lampon en dormcxambro"
- "montru 'вкл' " - вызвана функция smart_home.LightStatus('tabl', 'dormcxambr') для получения статуса
- Вызываем функцию $ToUser('вкл') с передачей ей состояния объекта.'
- "sxaltu tablan lampon en dormcxambro"
- Вызываем функцию smart_home.LightOn('tabl', 'dormcxambr') с передачей ей аргументов.
- "montru dolaran cambion de rusia banko, ke tabla lampo en dormcxambro estas 'вкл'" - исходное предложение
- "montru '61.46', ke 'вкл' estas 'вкл' " - вызвали функцию CurrenciesLoader.GetCourse('dolar', 'rusi') для получения состояния. Вызвали функцию smart_home.LightStatus('tabl', 'dormcxambr') для получения состояния.
- Если " 'вкл' estas 'вкл' ", то вызываем функцию $ToUser(61.46) с передачей ей состояния объекта.
- "montru adreson de computilo kaj euxran cambion de belarusia banko"
- "montru '192.168.0.101' kaj '70.76' " - вызваны smart_home.showAddress('computil') и CurrenciesLoader.GetCourse('euxro', 'belarusi')
- $ToUser(192.168.0.101, 70.76)
- " dolaro estas holonimo de monero "
- " dolaro estas sinonimo de bakso "
Все дефолтные функции должны принимать неограниченное количество аргументов. Все словосочетания должны иметь краткую формулу, по которой оно будет искаться в БД.
Первый вариант формулизации словосочетаний.
Цель формулизации словосочетаний: поиск равного словосочетания в базе данных для извлечения ассоциированных с ним функций. Пока используются только именные словосочетания.
Требования и особенности:
- в словосочетания могут входить аргументные слова, являющиеся переменными, но входящие в конкретные абстрактные множества.
- некоторые значения (например, падеж и часть речи) первого дополнения в словосочетании являются переменными - такие значения зависят от положения в предложении.
- словосочетания в предложении могут иметь переменное кол-во обстоятельств и определений, а также разный порядок слов.
Алгоритм формулизации:
- Строка словосочетания преобразуется в объект предложения в процессе графематического анализа. Затем выполняются остальные стандартные лингвистические анализы, и из объекта предложения вынимается ассоциативный массив (словарь) с полученными характеристиками каждого члена предложения.
- Создаётся копия словосочетания, в которую переносятся значимые характеристики слов - падеж (кроме первого), член предложения (кроме первого), часть речи, обстоятельства и определения.
- В обстоятельства и определения переносится член предложения.
- Словосочетание конвертируется в json-строку с отсортированными ключами. К полученной строке применяется встроенная в Python функция hash().
Полученное число можно использовать для сравнения и поиска в базе данных. Код алгоритма уже написан, необходимо теперь добавить возможность указания аргументных слов.
Первый вариант преобразования предложений от пользователей
Второй вариант формулизации словосочетаний.
Словосочетание перед добавлением в базу превращается в регулярное выражение, которое используется для сравнения при поиске со словосочетанием, извлечённым из предложения от пользователя. Следовательно, функция формулизации должна иметь два режима: превращение в регулярное выражение и превращение в строку-копию. Регулярное выражение должно позволить учитывать аргументные слова и однородные члены.