[Skolkovo Robotics 2015 Day 2] Владимир Веселов Bot and humans...

Post on 21-Jul-2015

141 views 2 download

Transcript of [Skolkovo Robotics 2015 Day 2] Владимир Веселов Bot and humans...

Взаимодействие робота и человека

автор: Веселов В.В., к.т.н

Skolkovo Robotics International Conference

March 20-22, 2015

Методы взаимодействия робота и человека

• речь

• текст

• звуковые сигналы

• световые сигналы

• жесты

Чатбот, виртуальный собеседник

это компьютерная программа, которая создана для имитации речевого поведения человека при общении с одним или несколькими пользователями

https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA

План• Известные чатботы

• Элиза

• Алиса

• Rose

• Cleverbot

• HeX

• Fred

• Eugene Goostman

• Построение русскоговорящего чатбота• архитектура

• поиск ответа

• обработка контекста

• диалоги

• планировщик

Модель чатбота

Текст (вопрос) Текст (ответ, действие)Чатбот

Модель програмиста

Програмист

Текст (емейл, задание, документ)

Текст (код, решение)

Кофе Сарказм (побочный продукт)

Алан Мэтисон Тьюринг (1912-1954)

Тест Тьюринга

"I believe that in about fifty years' time it will be possible, to programme computers, with a storage capacity of about 10^9, to make them play the imitation game so well that an average interrogator will not have more than 70 per cent chance of making the right identification after five minutes of questioning."

Turing, A.M. (1950). Computing machinery and intelligence. Mind, 59, 433-460.

Loebner Prize

http://www.loebner.net/Prizef/loebner-prize.html

Eliza• автор - Джозеф Вейзенбаум (1923-

2008)

Eliza: Hello, I am Eliza.I am afraid.Eliza: How long have you been afraid.Since midterms.Eliza: Tell me more...User: I am afraid that I will fail my course.Do you enjoy being afraid that you will fail your course?

Eliza (source)

["* i remember *", [

• "Do you often think of (2) ?",

• "Does thinking of (2) bring anything else to mind ?",

• "What else do you recollect ?",

• "Why do you remember (2) just now ?",

• "What in the present situation reminds you of (2) ?",

• "What is the connection between me and (2) ?",

• "What else does (2) remind you of ?"

• ]

https://github.com/isaacs/node-eliza/blob/master/elizabot.js

ALICE• автор: Richard S. Wallace

• http://www.alicebot.org/downloads/programs.html

Пандоработс

Rosette (ChatScript)

автор: Брюс Уилкокс

http://chatscript.sourceforge.net/D

ocumentation/ChatScript_Tutorial

.pdf

http://sourceforge.net/projects/ch

atscript/files/

Cleverbot/ Jabberwacky• автор: Роло Карпентер

• статистический алгоритм

• "самообучение"

FRED

• автор: Робби Гарнер

HeX

• автор: Джейсон Хатченс

• https://github.com/jasonhutchens/megahal - самообучающийся чатбот

• Как пройти Тест Тьюринга с помощью обмана http://www.nyu.edu/gsas/dept/philo/courses/mindsandmachines/Papers/hutchens96how.pdf

Elbot

• автор: Фред Робертс

Eugene Goostman 2001• http://princetonai.com

Команда Густмана сегодня (слева направо):И. Быковских, С. Уласень, В.Веселов, А. Адащик

Eugene Goostman• User: hi

• Eugene: Hi. I hope you'll enjoy our conversation!

• User: I hope so

• Eugene: My hopes also! Let's continue. And I forgot to ask you wher you are from...

• User: I am from Spain

• Eugene: Spain? Hope it's a good place to live.

• User: Yes it is

• Eugene: I am glad you agreed. Some another topic?

• User: There are the best climate of the world

• Eugene: And yes, do you make a secret of your name? I still don't know it!

• User: My name is Orio!

• Eugene: Orio? I don't really kown such a name, but OK - Let's be friends!

• User: It's not an English name

• Eugene: No? Well, it is up to you … Could you tell me about your job, but the way?

• User: I am studing at university

Создаем своего чатботаУчим робота говорить

Архитектура

Препроцессор Процессор Постпроцессор

Память

Структура базы знаний

Знания о собеседнике

Общие знания:ЭнциклопедияОпределения

ГеографияПолитика

ЛитератураБиологияФизика

Цитатник...

Знания о себеИмя

ОткудаСемья

ДиалогиПриветствиеПрощание

Что ты любишь?

РешателиКакого цвета?

Сколько будет?

Планировщик, управление беседой

Ответы по умолчанию

Специализированные знания, сервисы

Пре-процессор

• Коррекция ошибок1. Создаем таблицу замены

извени=извинипирвет=привет

2. Разбиваем текст на слова3. Проверяем есть ли слово в таблице автозамены4. Делаем замену5. Генерим фразу

• Проверка наличия смысла1. Создаем словарь2. Разбиваем на слова3. Проверям есть ли слово в словаре4. Если слова нет, оцениваем близость к словарным словам с такой же длиной

• Исправление ошибок - лучше не надо

Аналитический и синтетический языки A hunter saw a bear - Охотник увидел медведяA bear saw a hunter - Медведь увидел охотникаA bear hunter saw - охотник на медведей увидел ...A hunter bear saw - медведь-охотник увидел ...

Охотник увидел медведяОхотник медведя увидел Увидел медведя охотникУвидел охотник медведя Медведя охотник увиделМедведя увидел охотник

Процессор. Поиск ответа

1. Регулярные выражения

* (привет|как дела) *

2. Lexer

3. Поиск по словам

Поиск по словамСтруктура данных

Правило 0: {

Входы : [ "я хотел бы купить билеты", "мне нужен авиа билет”,”где купить билеты?”],

Ответ : ["куда вы хотите лететь?“]

},

Правило 1: {

Входы : [ "где моя посылка?“],

Ответ : ["у вас есть номер заказа?“]

} ,

Правило 2: [

Входы : [ "где ближайший банкомат?“],

Ответ : [“где вы сейчас находитесь?”]

}

Правило 3: {

Входы : [ “default“],

Ответ : [“я вас не совсем понял, давайте лучше поговорим о погоде”]

}

Поиск ответаСтруктура данных

Правило 0: {

Входы : [ "я хотел бы купить билеты", "мне нужен авиа билет”,”где купить билеты?”],

Ответ : ["куда вы хотите лететь?“]

},

Правило 1: {

Входы : [ "где моя посылка?“],

Ответ : ["у вас есть номер заказа?“]

} ,

Правило 2: [

Входы : [ "где ближайший банкомат?“],

Ответ : [“где вы сейчас находитесь?”]

}

Правило 3: {

Входы : [ “default“],

Ответ : [“я вас не совсем понял, давайте лучше поговорим о погоде”]

}

купить

билет

где

посылка

билеты

банкомат

Правило 0, вход 0 Правило 0, вход 2

Правило 0, вход 1

Правило 0, вход 0 Правило 0, вход 2

Правило 1, вход 0 Правило 2, вход 0

Правило 1, вход 0

Правило 2, вход 0

default Правило 3, вход 0

Поиск ответакупить

билет

где

посылка

билеты

банкомат

Правило 0, вход 0 Правило 0, вход 2

Правило 0, вход 1

Правило 0, вход 0 Правило 0, вход 2

Правило 1, вход 0 Правило 2, вход 0

Правило 1, вход 0

Правило 2, вход 0

Вес слова = 1 / количество входов

Пример:

Где мне найти банкомат?

Расчет весов:Правило 1, вход 0 = 1 / 2 = 0.5Правило 2, вход 0 = 1 / 2 + 1 = 1.5

Ответ - где вы сейчас находитесь?

default Правило 3, вход 0 Правило 2: [Входы : [ "где ближайший банкомат?“],Ответ : [“где вы сейчас находитесь?”]

}

Процессор. Матчер

Текст (вопрос) Текст (ответ)Матчер

Обработка контекста

• Как определить что / кого означают местоимения – он, она, оно, это?

- Где ты живешь?

- В Москве

- Это большой город?

- ?

Обработка контекстаПравило 0: {

Входы : [“ты откуда?”],

Ответы : ["я из Москвы“],

Действие: function {

chatbot.context = “Москва”;

}

},

Правило 1: {

Входы : [ “какое население Москвы?“,”Москва большой город?”],

Контекстные Входы : [это большой город?“, “население”],

Контекст: “Москва”,

Ответ : [“Население Москвы составляет около 12,5 миллионов человек по данным 2014 года“]

}

Общий матчерКонтекстный

матчерМосква

Контекстный матчерСемья

Контекстный матчер

Друг Петя

- Ты откуда?- Я из Москвы

chatbot.context = “Москва”- Это большой город?- Население Москвы составляет около 12,5

миллионов человек по данным 2014 года

Диалоги Купить авиа

билеты?

Смена темы

Куда?

Когда?

Сколько билетов?

Нет Да

Ответ получен, аэропорт назначения не распознан

Передумал

Ответ получен, аэропорт назначения распознан

Ответ получен, дата распознана

Ответ получен, дата не распознана

Передумал

Ответ получен, количество пассажиров известно

Заказ билета

Ответ получен, количество пассажиров неизвестно

Передумал

Программируем диалог

Общий матчерКонтекстный

матчерМосква

Контекстный матчерСемья

Контекстный матчер

Друг Петя

Диалоговый матчер 1

Диалоговый матчер 2

Диалоговый матчер N

1. Если находимся в режиме диалога, делаем поиск соответствующим диалоговым матчером

2. Если контекст задан, то ищем в контекстном матчере3. Если не нашли – тогда используем общий матчер4. Default

Программируем диалогПравило 0: {

Входы : [“Хочу в отпуск”],

Ответы : [«Хотите заказать билет на самолет?“],

Действие: function {

chatbot.dialogueId = “КупитьБилетыДаНет”;

}

}

Правило 1: {

Входы : [ “да“,”купить”],

dialogueId: “КупитьБилетыДаНет”,

Ответ : [“Где хотите отдохнуть?“]

Действие: function {

chatbot.dialogueId = “КупитьБилетыКуда”;

}

}

Правило 2: {

Входы : [ “нет“,”не сейчас”],

dialogueId: “КупитьБилетыДаНет”,

Ответ : [“Может книжку почитать?“]

}

Извлечение данных из фразы

chatbot.question = “меня зовут Джон”;

var myRegexp = /меня зовут (.*)/g;

var match = myRegexp.exec(chatbot.question);

chatbot.memory.username = match[1];

chatbot.response = "Привет " + chatbot.memory.username + "!";

Куда лететь?var chatbot = new Object();

сhatbot.memory = new Object();

chatbot.question = "хочу полететь в Санкт Петербург";

var desitinationRegex = /.* в (Москву|Одессу|Нью Йорк|Санкт Петербург)/g;

var match = desitinationRegex.exec(chatbot.question);

chatbot.memory.airTicket_destination= match[1];

chatbot.response = "Когда вы хотите лететь в " + chatbot.memory.airTicket_destination + "?";

Человек: хочу полететь в Санкт ПетербургЧатбот: Когда вы хотите лететь в Санкт Петербург?

Куда лететь?var Правило3 = {

Входы : [ "хочу лететь в","Москву","Одессу","Нью Йорк",

"Санкт Петербург" , “default”],

dialogueId: "КупитьБилетыКуда",

Действие: function () {

var destinationRegex =

/.* в (Москву|Одессу|Нью Йорк|Санкт Петербург)/g;

var match = destinationRegex.exec(chatbot.question);

if (match != null) {

chatbot.memory.airTicket_destination= match[1];

chatbot.response = "Когда вы хотите лететь в " +

chatbot.memory.airTicket_destination + "?";

chatbot.dialogueId = "КупитьБилетыКогда";

} else {

chatbot.dialogueId = "КупитьБилетыКуда";

chatbot.response = "Не совсем вас понял. Уточните куда вы хотите лететь.";

}

}

}

Человек: хочу полететь в Санкт ПетербургЧатбот: Когда вы хотите лететь в Санкт Петербург?

Классы, объекты, онтологии, таксономии

Класс: МлекопитающееКоличество ног: не больше четырех

Класс: Собака Класс: Кошка

Чатботы работающие на онтологиях:ChatSriptEviSiri

Что больше, кто быстрее?

• Кто быстрее - кролик или черепаха?

• Что больше – яблоко или дыня?

Класс Размер, м Сокрость, км/ч Вес, кг

Кролик 0.3 20 2

Черепаха 0.2 0.07 0.5

Яблоко 0.1 0 0.1

Дыня 0.6 0 2

Что больше, кто быстрее?

Человек: что больше яблоко или дыня

Робот: яблоко меньше чем дыня

Человек: кто быстрее кролик или

черепаха

Робот: кролик быстрее чем черепаха

Человек: кто быстрее кролик или волк

Робот: не знаю

MyClass.prototype = {

compareTo: function(compareWith, propertyName) {

if (compareWith instanceof MyClass) {

if (this[propertyName] >

compareWith[propertyName]) {

return 1;

} else if (this[propertyName] <

compareWith[propertyName]) {

return -1;

}

return 0;

}

}

}

var database = new Object;

database["кролик"]=new MyClass("кролик",0.3,20,2);

database["черепаха"]=new

MyClass("черепаха",0.2,0.07,0.5);

database["яблоко"]=new MyClass("яблоко",0.1,0,0.1);

database["дыня"]=new MyClass("дыня",0.6,0,2);

Используем подход Элизы

chatbot.question = “я думаю об искусстве”;

var myRegexp = / я думаю об (.*)/g;

var match = myRegexp.exec(chatbot.question);

chatbot.memory.think_about = match[1];

chatbot.response = “Мне не интересно что ты

думаешь о “ +

chatbot.memory.think_about;

Сколько будет дважды два?

1. Заменяем числительные

expression = expression.replace(/дважды/g, '2 *');

expression = expression.replace(/трижды/g, '3 *');

expression = expression.replace(/один/g, '1');

expression = expression.replace(/два/g, '2');

expression = expression.replace(/умножить/g, '*');

expression = expression.replace(/прибавить/g, '+');

2. Фильтруем, оставляем цифры и операции

3. Пробуем вычислить

Сколько будет дважды два?

Вопрос: приветОтвет: Не могу посчитатьВопрос: сколько будет дважды два?Ответ: 2*2 = 4Вопрос: два плюс три умножить на два?Ответ: 2+3*2 = 8

Какой сегодня день?var weekday = new Array(7);

weekday[0] = "воскресенье";

weekday[1]= "понедельник";

weekday[2] = "вторник";

weekday[3] = "среда";

weekday[4] = "четверг";

weekday[5] = "пятница";

weekday[6] = "суббота";

var whatIsTheDayTodayExp = /.*какой сегодня

день(|\?).*/g;

function whichDayToday() {

var match = whatIsTheDayTodayExp.test(question);

if (match) {

var today = new Date();

var weekdayToday = weekday[today.getDay()];

return new Response(70, “Сегодня – “ +

weekdayToday);

}

return 0;

}

function Response(score, response) {

this.score = score;

this.response = response;

}

Постпроцессор

Эмоции

1. Создаем правила для эмоций по словам, выражениям, знакам препинания, смайликам

2. Анализируем ответ чатбота с помощью матчера

3. Если необходимо, анализируем фразу пользователя

4. Меням изображение (либо махаем руками, моргаем, мигаем лампочками)

5. Можно использовать динамическую функцию:X(n) = X (n-1) * w, 0<=w<1

Планировщик

Событие:

Ответ не найден

Раз в день

Случайно, но не чаще чем раз в 5 минут

Действие:

Предложить тему разговора

Рассказать новость

Рассказать шутку

Поинтересоваться планами

Напомнить о планах на сегодня

Планировщик

Сменить тему

Поэзия

Пушкин Лермонтов

Профессия

Интересно ли быть?

Тестирование

• Ручные тесты обычно никто не выполняет (максимум 1-2 раза)

• Тестирование – ответственность программиста, в первую очередь, а не тестировщика

• Тесты должны быть автоматизированы

Средства тестирования -

• JUnut

• Cucumber

• Selenium

• JMeter

Анализ логов

• Оценка качества беседы• Создаем обучащий набор данных• Создаем проверочный набор данных• Создаем модель• Проверяем на проверочном наборе• Исправляем модель, если необходимо• Периодическая проверка модели

• Методы• Principal Component Analysis, Partial Least Square• Neural Networks• Bayesian Networks• Правила

Заключение

• Что мы узнали?

• Чему научились?

• Линк на примеры:

• https://github.com/goostmangroup/pushkin

• https://github.com/vladimirveselov/howtobuild_chatbot_examples

• Линк на курс: https://www.kursoteka.ru/course/716

• Нужно ли организовать тест Тьюринга в России для русскоговорящих роботов?

Демо - Пушкин

Вопросы?