Создание ИИ методом «глокой куздры». Интеллектуальная одиссея

Захотелось мне написать разговаривающую программу. Очень захотелось, позарез.

Конечно, мне далеко до профессиональных программистов, и лингвистом я тоже не являюсь, но системное мышление имеется, и чувство языка на месте. Тем более что тематикой ИИ давно интересуюсь, даже пару-тройку постов накатал в свое время. Отчего не реализовать познания в программном коде? Ну и попробовал, насколько смог.

Знакомьтесь, Ваня Разумный.

qeaushc_ua4rijqj_mp-wuiphym.png


Ниже находится описание проблем, возникших передо мной на этом хоженом-перехоженом пути, и способов их преодоления.

По поводу результата оговорюсь сразу: целью был не программный код, а формулировка принципов искусственного мышления, функционирующего НЕ на основе физической реальности, как биологические организмы, а на основе СИНТАКСИСА. Поклонники теста Тьюринга, нейронных сетей и машинного обучения могут не беспокоиться.

Внимание, материал объемный.

Ушат холодной воды


Чтобы не было беспочвенных ожиданий с последующими ехидными скриншотами в комментариях, сразу продемонстрирую Ваню Разумного в непрезентабельном виде. Вот, закачал начало «Емели» и попробовал поспрашивать — в точности как на уроках литературы в начальных классах.

Оригинальный текст:

Жил-был старик. У него было три сына: двое умных, третий — дурачок Емеля. Те братья работают, а Емеля целый день лежит на печке, знать ничего не хочет.
Один раз братья уехали на базар, а бабы, невестки, давай посылать его:
— Сходи, Емеля, за водой.
А он им с печки:
— Неохота…
— Сходи, Емеля, а то братья с базара воротятся, гостинцев тебе не привезут.
— Ну, ладно.
Слез Емеля с печки, обулся, оделся, взял ведра да топор и пошел на речку. Прорубил лед, зачерпнул ведра и поставил их, а сам глядит в прорубь. И увидел Емеля в проруби щуку.

Диалог:

nnlphjk8yqhkk_tjo6rd6wmgs_8.png


Однако, текст можно адаптировать — так, допустим:

Старик имел трех сыновей. Первый сын был умным. Второй сын был умным. Третий сын был дураком. Емеля — третий сын старика. Емеля хороший.
Старшие сыновья работают целый день, а Емеля лежит на печи.
Однажды братья уехали на базар. Невестки говорят Емеле:
— Сходи за водой.
Емеля отвечает с печки:
— Не пойду за водой.
Невестки говорят:
— Братья гостинцев тебе не привезут.
— Ну, ладно.
Емеля слез с печки, обулся, оделся, взял ведра и топор. Потом Емеля пошел на речку.
Емеля прорубил лед и зачерпнул ведра. И увидел Емеля в проруби щуку. Щука — это рыба. Емеля поймал щуку.

После адаптации выходит поприличней:

awyvfunkdzg7zbljjvdshat4mcw.png


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

Перехожу непосредственно к описанию интеллектуальной одиссеи.

Теоретическое обоснование


Рассуждал я следующим образом.

В чем главная проблема ИИ? В том, что компьютер не может понимать значений слов, соответственно быть «разумным». При этом считается, что люди разумны, поскольку понимают произносимые собеседником слова.

На самом деле ни черта люди не разумны. Слово само по себе означает не больше, чем составляющие его буквы (по сути, кривые линии) или звуки (колебания воздуха). Смысл возникает лишь в качестве отношений между буквами-звуками как элементами членораздельной речи, за счет устойчивых ассоциаций, в том числе за счет связей с миром визуальных восприятий. Например, собеседник указывает на предмет и говорит: «Это дерево». И ты понимаешь, что данный предмет называется деревом.

Чат-боту (под которым договоримся понимать ИИ, занимающийся исключительно разговорами) нельзя указать на предмет и сказать: «Это дерево», — за счет отсутствия у чат-бота глаз, то есть видеокамеры. Объяснять возможно лишь на словах, а как объяснишь, если человеческой речи он и не разумеет?!

По счастью, отношения между элементами речи определены, и довольно жестко: за них отвечает синтаксис. Следовательно, любой текст, построенный по законам синтаксиса, содержит в себе некоторый, закрепленный в синтаксисе смысл. Та самая вынесенная в заголовок «глокая куздра», знаменитая и непревзойденная по наглядности — которая, как оказалось, давно пристегнута к компьютерным исследованиям.

Из воспоминаний одного товарища о далеких 70-х:

Глокая куздра
В июле 2012 г. ко мне в Концепт пришел эксперт и сказал «Глокая куздра». Я его понял. Это был знак причастности к общему когда-то семантическому полю.…
«Глокая куздра штеко будланула бокра и кудлачит бокренка».
В 70е годы искусственным интеллектом занимались в ВЦ АН СССР, в ИПУ АН СССР и нескольких др. институтах. В том числе было направление, которое занималось машинным переводом. Проблема не решалась годами, семантическая неоднозначность не давала перевести смысл без контекста. Было не понятно, как формализовать контекст в компьютерной программе. И вот Д.А. Поспелов /наверно/ распространил пример, иллюстрирующий трудность этого перевода. Он взял фразу, которая состоит из бессмысленных слов, но вместе с тем по строю предложения и звучанию слов создает совершенно ясные одинаковые ассоциации у совершенно разных людей. Этот эффект понимания не мог быть достигнут машиной. Действительно, Глокая куздра — этакая злая коза — она, ясное дело, сильно боднула козла и что-то несусветное творит с козленком… Семинары по машинному переводу проходили и в ИПУ, и я встречал на доске такое вот оглавление: «Глокая куздра. Семинар пройдет в 14.00 в 425 ауд.».

Справка. Автор этой фразы — известный языковед, академик Лев Владимирович Щерба. Корни входящих в нее слов созданы искусственно, суффиксы и окончания позволяют определить, к каким частям речи относятся эти слова и вывести значение фразы. В книге Л.В. Успенского «Слово о словах» приведен ее общий смысл: «Нечто женского рода в один прием совершило что-то над каким-то существом мужского рода, а потом начало что-то такое вытворять длительное, постепенное с его детенышем».
Источник kuchkarov.livejournal.com/13035.html


На основе «глокой куздры» можно построить полноценный диалог.

— Кто будланул бокра?
— Куздра.
— Кто кудлачит бокренка?
— Тоже куздра.
— Какая она?
— Глокая.
— Как будланули бокара?
— Штеко.

Такой ИИ — вполне себе свободно общающийся — окажется не в состоянии понимать значения употребляемых им слов: будет не в курсе, ни что такое «штеко», ни кто такой «бокр», ни каким образом возможно кудлачить. Но разве по этой причине можно посчитать, что ИИ неразумен, а человек, совершенное биологическое создание, «разумеющее» семантику собственных выражений, полноценно, в отличие от ИИ, мыслит? Полноте…

Люди не видят предметов, а наблюдают панораму цветных точек — по сути, хаотичную. Предметы образуются не во внешнем мире, а в человеческом мозгу, за счет увязывания цветных точек воедино, в отдельные совокупности. Это означает, что мы существуем в некоем иллюзорном мире, который в известном смысле нами же и сконструирован.

Читал, что какое-то первобытное племя не видит самолетов в небе — просто не видит, и все. Еще читал, что индейцы не замечали подошедших к берегам кораблей Колумба, потому что… просто не замечали. А заметили после того, как им объяснили, как надо смотреть — то есть каким образом увязывать цветные пиксели в конкретные предметы. Я этим псевдогеографическим байкам верю: такие зрительные парадоксы представляются мне правдоподобными.

У человека нет оснований считать, что его мышление устроено каким-то особенным образом, посему принцип «глокой куздры» — единственная возможность сделать разумным кого-то, будь то чат-бот или человек. Использовать можно различный инструментарий, но принципиальная схема является безусловной. Я так считал до начала работы и не переменил своего мнения по ее окончании.

Библиотеки


Поставив задачу, принялся гуглить по поводу подходящих библиотек для C#.

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

а) определять морфологические признаки словоформы,
б) возвращать словоформу с требуемыми морфологическими признаками?

Лексикон ограничен, количество признаков тоже. И вещь такая полезная, обиходная… Не тут-то было!

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

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

Пример синтаксического разбора парсера Solarix



мама мыла грязную раму.


мама
0
мама
СУЩЕСТВИТЕЛЬНОЕ
ПАДЕЖ:ИМ|ЧИСЛО:ЕД|РОД:ЖЕН|ОДУШ:ОДУШ|ПЕРЕЧИСЛИМОСТЬ:ДА|ПАДЕЖВАЛ:РОД


мыла
1
мыть
ГЛАГОЛ
НАКЛОНЕНИЕ:ИЗЪЯВ|ВРЕМЯ:ПРОШЕДШЕЕ|ЧИСЛО:ЕД|РОД:ЖЕН|МОДАЛЬНЫЙ:0|ПЕРЕХОДНОСТЬ:ПЕРЕХОДНЫЙ|ПАДЕЖ:ВИН|ПАДЕЖ:ТВОР|ПАДЕЖ:ДАТ|ВИД:НЕСОВЕРШ|ВОЗВРАТНОСТЬ:0


грязную
2
грязный
ПРИЛАГАТЕЛЬНОЕ
СТЕПЕНЬ:АТРИБ|КРАТКИЙ:0|ПАДЕЖ:ВИН|ЧИСЛО:ЕД|РОД:ЖЕН


раму
3
рама
СУЩЕСТВИТЕЛЬНОЕ
ПАДЕЖ:ВИН|ЧИСЛО:ЕД|РОД:ЖЕН|ОДУШ:НЕОДУШ|ПЕРЕЧИСЛИМОСТЬ:ДА|ПАДЕЖВАЛ:РОД


.
4
.
ПУНКТУАТОР







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

Получив вожделенное, засучил рукава.

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

В начале было слово


В соответствии с реализованной мной концепцией, в качестве первичного элемента имеем слова с известными нам морфологическими признаками.

Морфологические признаки слов возвращает парсер Solarix — казалось бы, проблем нет. Однако проблемы имеются в связи с тем, что некоторые словосочетания имеют общую нераздельную семантику, в связи с чем должны восприниматься ИИ в качестве единого элемента.

Я насчитал четыре вида подобных словосочетаний:

1. Фразеологические обороты,
К сожалению, парсер их не возвращает.
Слесарь бил баклуши.
Для парсера «бить баклуши» — для разных слова, хотя семантическая основа тут одна, и воспринимать словосочетание необходимо так, как его воспринимает наш мозг: слитно.

2. Имена собственные,
Александр Сергеевич Пушкин.
Ясно, что это единый указатель на единственный предмет, хотя отдельные составляющие его слова могут быть использованы в других указателях.

3. Поговорки, пословицы, афоризмы.
Они, как правило, также представляют собой единое смысловое поле.
Старый конь борозды не портит.

4. Составные служебные слова (вследствие чего, из-за того что, по причине и т.п.)
Парсер возвращает некоторые из них слитно, другие — нет.

5. Просто устойчивые словосочетания типа «книжного магазина». Не приставишь любое прилагательное к существительному «магазин», хотя бы соответствующие изделия в нем и продавались. Никто не скажет «макаронный магазин», даже если в магазине торгуют исключительно макаронами.

Составные слова — независимо от их типа — необходимо обрабатывать так, как если бы они были единой слитной конструкцией… Но как узнать, какие словосочетания относятся к данной группе?

Наиболее очевидное — посредством прямого на то указания:

9v9l7ojszxvq9p2ivzxkrsr7fu8.png


Более сложный, применимый лишь к именам, вариант — определение фразеологизмов по заглавным буквам:

  • некоторые имена собственные, в частности ФИО, имеют все заглавные буквы
  • другие собственные имена лишь начинаются с заглавной буквы (например, Аральское море).


Ясно, что определять составные слова возможно по их повторяемости, но это затруднительно. Более простым и действенным способом могло бы стать использование словарей, однако со словарями вышла незадача: использовать их в рамках реализованной концепции не удалось (на что посетую в конце поста).

Субъект — Действие — Объект


Слова определены, их свойства зафиксированы, что дальше? Дальше необходимо определить костяк фразы: любой разработчик ИИ наверняка приходил к тому же выводу.

Вот фраза:
Плотник выстругал доску.
Что можно о ней сказать, ориентируясь исключительно на синтаксис?

Можно сказать, что:

1. Субъект (существительное именительного падежа) — то, что выполняет действие.
2. Объект (существительное не именительного падежа) — то, на что направлено действие.
3. Само действие — глагол.

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

Было:
Плотник выстругал доску.
Стало:
Доска выстругана плотником.

Иначе говоря, залог делает фразу инвариантной.

bhihfm8axuabbkm0mfxumba4zca.png


В некоторых случаях инвариантность фразы практически неопределима, к сожалению.

Имеем высказывание:
Спички лежат в коробке.
Его можно переформулировать:
Коробок содержит спички.
Содержание обеих фраз идентично, однако выражаемые глаголами действия формально разнонаправленны (в первом случае спички воздействуют на коробок, во втором случае — наоборот), при этом залоги обоих глаголов активные.

«Лежать» и «содержать» — это даже не антонимы, а нечто такое, чему в лингвистике, насколько я понимаю, нет названия. А если нет названия, то и словарей подобных терминологических пар быть не может: затруднение, с которым ИИ неминуемо столкнется при попытке «осмыслить» поступившую информацию.

Совместное употребление триады не обязательно: любой из названных элементов может во фразе отсутствовать.
Бегемот двинулся.
Вечер.
Светало.

И наоборот, элементы могут присутствовать в предложении во множественном числе, например:
Вася и Петя подрались.

Что касается множественности, то после долгих размышлений и переделок мной были установлены следующие правила обработки:

1. Субъект в предложении присутствует всегда. При отсутствии субъекта в исходный текст вставляется заглушка, обозначающая существительное.
Светало.
Преобразуем в:
[Noun] светало. Иначе говоря: Что-то светало.

2. Действие может отсутствовать при отсутствии объекта. При наличии объекта вставляется заглушка, обозначающая глагол.
Шаг в бездну.
Преобразуем в:
Шаг [verb] в бездну. Можно трактовать как: Шаг [направлен] в бездну.

3. Объект в предложении может отсутствовать. Никакой заглушки при этом не применяется.
Он поехал.
Увеличивать фразу до «Он поехал [noun]» нет смысла, ведь едут не обязательно куда-то: термин может обозначать начало движения.

4. Субъект и объект могут быть множественными. Фраза при этом не разделяется.
Множественные субъекты:
Мальчик и девочка смотрели телевизор.
Множественные объекты:
Охотник добыл лося и кабана.

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

Свойства элементов


Свойства основных элементов (то есть существительных и глаголов) — это в основном их морфологические признаки: род, падеж, лицо, число, переходность, возвратность, модальность и другое — все то, что возвращает парсер Solarix. Плюс прочие, не рассматриваемые лингвистикой. Я использовал характеристики не вполне канонические: отрицание, закавыченность, знак препинания (который посчитал свойством предыдущего слова) и т.п.

Некоторые из названных свойств единичны (например, род: не бывает слов одновременно мужского и женского родов), другие множественны. К множественным свойствам относятся, к примеру, число и дата. Можно сказать »5 лошадок», а можно: «Не меньше 3 и не больше 7 лошадок»: во втором случае оба числительных относятся к одному слову, тем самым являются его множественными свойствами.

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

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

Разделение предложений на секторы


Выше был упомянут случай, требующий разделения предложения на части (пример с дворником). Этот случай не единственный — встречаются другие.

Самое очевидное: сложносочиненные и сложноподчиненные предложения.

Юноша улыбнулся, и девушка улыбнулась в ответ.
Купальщик плюхнулся в воду, которая была холодна.

Разделяем на:
Юноша улыбнулся. Девушка улыбнулась в ответ.
Купальщик плюхнулся в воду. Вода была холодна.

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

Автомобиль, развернувшись на месте, врезался в отбойник.
Развернувшийся на месте автомобиль врезался в отбойник.

Разделяем:
Автомобиль развернулся на месте. Автомобиль врезался в отбойник.

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

Конечная конструкция у всех трех исходных вариантов примера идентична.

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

Такой пример:
Хорошо гулять по осеннему лесу.
Что тут разделять, когда все слитно и компактно? Немного озадачивает отсутствие субъекта, поскольку, как мы договорились, субъект должен выражаться существительным, а здесь он… наречие что ли? Ан нет, разделение необходимо!
[Noun] гулять по осеннему лесу. Хорошо. В смысле: Кто-то гуляет по осеннему лесу. Это хорошо.

Выше было сказано, что падежи служат для различения субъектов и объектов: падеж субъектов — именительный, тогда как падеж объектов — не именительный. Профессиональные лингвисты со мной вряд ли согласятся: им известна уйма случаев, когда объекты пребывают в не именительном падеже, как и субъекты.

Коттедж — это жилище.
Не только субъект, но и объект в именительном падеже. Исключение, скажете вы? Можно сослаться на исключение, однако логичней посчитать указанную конструкцию двумя фразами, объединенными особым свойством. Я называю такие фразы, полученные посредством разделения предложения на части, секторами.

Суть в том, что один сектор является определением другого (или даже множества предыдущих секторов. Ввиду сложности данного функционала я даже не пытался его реализовать).

q9tnqlydc03or7rulcyj4ej6hde.png

Здесь второй сектор является определением первого. И никаких тебе объектов в именительном падеже!

Главное, конечно, то, что свойствами могут обладать не только отдельные элементы, но и секторы.

Помимо цели, я использовал такие свойства секторов, как:

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

Склейка


Как принято именовать данную сущность у лингвистов, понятия не имею. Может быть, соединительное слово?

Итак, склейки служат для связи между секторами. Попросту говоря, это служебные слова типа «поэтому», «когда», «вследствие чего», «ввиду того что» и т.п.

Допустим, имеем сложноподчиненное предложение со склейкой «поэтому».
Ветер подул, поэтому листва зашелестела.
Ясно, что две части связаны между собой как причина и следствие: об этом свидетельствует склейка «поэтому».

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

Названная проблема не решаема для чат-бота в принципе: физическая реальность — одно, вербальная сфера — другое. Элементная база разная (под элементной базой я понимаю способ восприятия реальности: для чат-бота это письменная речь).

Валидность


Некоторые фразы оказываются некорректными. Ясно, что если выдать ИИ откровенную белиберду, он не поймет.

ggxjzslr_aesuctvcfayv9iczng.png


Однако даже фраза, выстроенная на первый взгляд в соответствии с правилами синтаксиса, может оказаться бракованной вследствие разных нюансов, к примеру:

lqq0sndyi_8jky-d3vrmygbopug.png


Вы, что ли, способны такую фразу воспринять? Если да, примите поздравления, потому что я при попытке осмысления впадаю в ступор: мозг отказывает. При этом упрощенные варианты воспринимаются обыденно:
Петя не пошел в кино.
Петя пошел не в кино.
Не Петя пошел в кино.

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

Очевидно, что инвалидные фразы необходимо беспощадно отбраковывать при обработке.

Основные признаки инвалидных фраз, в моей интерпретации:

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

Вставка недостающих слов. Замена ссылок


Предложение формализовано, пора записывать? Рано. Требуется вставить недостающие слова и заменить ссылки.

Возьмем для примера диалог:
— Петров, как здоровье?
— Нормальное.
— А у жены?
— Тоже.

Формализация требует восполнения недостающего, приблизительно так:
— Как здоровье Петрова?
— Здоровье Петрова нормальное.
— А как здоровье у жены Петрова?
— Здоровье у жены Петрова тоже нормальное.

После этого — не раньше — можно приступать к обработке текста с последующей записью в базу.

Вот и она — база, со всеми свойствами, также вспомогательными и справочными таблицами.

kw0jnvtzdrdvm1pfrc9uvjak8uw.png


Иерархическая структура:

1. Беседа (сеанс связи с собеседником).
2. Сообщение (текст, который выдает собеседник зараз).
3. Предложение (информационная единица сообщения).
4. Сектор (часть предложения).
5. Слово.

Не Бог весть что, особенно для читателей здешнего ресурса… Но я ж дилетант, мучился долго.

Общение


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

Методом проб и ошибок вырисовалась схема.

rugpzwasatd5istsy87nf5ze02a.png


Принудительный ответ — это, к примеру, когда предложение инвалидное или собеседник установил, что на такую-то фразу нужно отвечать таким-то образом.

6wwkiibxdoavu_uwx45a8ienbag.png


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

xorg_27lqp6wssgoea4t5luujym.png


Что сказала-то? Любой человек, услышав подобное, первым делом уточнит, что имеется в виду.

Достоверность — соответствие тому, что записано в памяти. Если кто-то слышит «Гагарин не летал в космос», а в его памяти записано обратное, он опять-таки попросит (должен попросить) разъяснений.

iaumsw4rsti_-av8ayyqbdmc5io.png


Естественная реакция.

При необходимости отвечать стандартно Ваня Разумный осуществляет выбор из типового набора ответов случайным образом.

Надо сказать, что с типовыми сообщениями я особо не заморачивался по причине того, что добиться полного сходства с человеческой реакцией невозможно по определению. Допустим, чат-бот выдает стандартное «Я согласен». Можно, подобрав синонимичные сообщения, возвращать их рандомно:
Точно так.
Ты прав.
Верно говоришь.
Твоя правда.

и т.п.

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

Да на уровне синтаксиса нельзя даже отличить отрицательный ответ от положительного!
Возьмем два привычных для нас альтернативных ответа на один и тот же вопрос:
Еще как!
Вот еще!

Первый из ответов означает «Да», а второй — «Нет». Определить значения по синтаксису нет никакой возможности.

Типы предложений


Основную роль в диалоге играют типы предложений:

1. Распоряжение.
2. Утверждение.
3. Вопрос.

Самое элементарное из всех — распоряжение. Ваня Разумный пытается по действию понять, чего хочет собеседник: если может исполнить, то исполняет, в противном случае сообщает об отказе.
Ну что чат-бот может исполнить? Сказать о чем-то, выполнить команду.

ujh6ljfrlmqrk10cdvtsvfqjxmw.png


Ничего стоящего внимания.

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

В ответ, найдя в базе утвердительное предложение со словом «космонавт», можно выдать:
Космонавты храбрые.

А можно поискать по объекту, возвратив что-нибудь вроде:
Марс — это красная планета.

Но нет гарантий, что в базе не отыщется неподходящая фраза, типа:
Планетолет вез на Марс мусорные контейнеры.

Подобрать критерии?… Но какие??? После долгих раздумий я установил, что в качестве ответного утверждения по теме ИИ должен выдать фразу, обозначающую личное отношение к предмету:
Я не летал на Марс.
Опять-таки, если подобная фраза отыщется в базе.

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

Вопросы


Вопросы подразделяются на два подтипа, которые для себя я обозначил как общие и специальные.

Общие вопросы — без вопросительного слова, допускающие ответы «Да» или «Нет».

-il4bfbbx8vxjl3vqswdk6sm8yq.png


Специальные вопросы требуют в каждом случае индивидуального ответа, тут простым «Да» или «Нет» не отделаешься.
Сколько на Земле людей?
Почему слоны большие?
Кто такой Наполеон?

Пришлось систематизировать вопросительные слова. Каждому вопросительному слову — которых, по счастью, все же немного, — ставился в соответствие тип. Получился список вида:
Вещь: что?
Имя: кто?
Место: куда? где?
Прилагательное: какой?
Наречие: как?
Число: сколько?
Дата: когда?
Причина: почему?
И так далее.

При отсутствии вопросительного слова вопрос общий.

При общем вопросе Ваня Разумный ищет ответы не только непосредственно на него, но в случае отрицательного ответа и на все специальные вопросы, сгенерированные по основному общему. Цель — выдать в качестве ответа альтернативный сектор.

rrmqbnakpgaykaunftdh8dcyhly.png


Ответы


Поиск ответа осуществляется, вестимо, по шаблонам:

  1. Берем слово, со всеми морфологическими признаками, и ищем секторы, в которых указанная словоформа присутствует. Так по всем словам вопросительной фразы.
  2. Затем находим пересечение результатов, полученных по каждому слову. Сектор, являющийся пересечением, является ответом. Если секторов несколько, выбираем какой больше понравится.


Установив сектор-ответ, можем выдать собеседнику «Да», или «Нет», или «А черт его знает», –, но это по общему вопросу.

Если вопрос специальный, делаем все то же самое, с единственным отличием. Для вопросительного слова ищем лишь его морфологические признаки, без самого слова.

Допустим, спросили:
Кто выстрелил?
Для «выстрелил» ищем «выстрелить» с заданными морфологическими признаками, а для «кто» — любое слово с заданными морфологическими признаками. Сектор, в котором присутствуют оба слова, и будет ответом.

В некоторых случаях (на самом деле, во многих) единичный поиск по вопросительному слову с заданными морфологическими признаками не сработает, поэтому искать приходится многократно.

Спрашиваем:
Какой мальчик?
«Какой» — вопросительное слово для прилагательного, то есть в общем случае Ваня должен искать прилагательное. Если в базе для данного существительного находится прилагательное, выдается соответствующий ответ.

5fmnp3utfms5tqhbjco2np5sb5e.png


В иной ситуации ответом может послужить не только прилагательное, но и нечто другое, например причастие.

jyttxcbtwx-abmkzgedisgtahwe.png


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

3qle497lyqowbp7tle2xetvzkgw.png


Более сложный, связанный с поиском субъекта, вариант подмены шаблона:

5bia5pxo5h-bl08yp99nnh6pj2k.png


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

Обратите внимание: один результат может оказаться ответом сразу на несколько вопросительных подтипов.

2jr5nfomvaifc83_msjcxlvmhhg.png


На последний вопрос ответа не находится — Ваня соответственно и не отвечает.

Последовательный поиск по связанным секторам


Допустим, у чат-бота спрашивают:
Куда глупый Петя пошел?

На самом деле вопрос разбивается на два связанных сектора:
Куда Петя пошел? Петя глупый?
При этом не факт, что оба ответа окажутся положительными или отрицательными: вполне можно представить, что Петя пошел в магазин, но при этом Петя совершенно не глупый.

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

© Habrahabr.ru