Pull to refresh

Создание простого интерактивного помощника

Reading time 3 min
Views 55K

Привет, Хабр! Вдохновившись последними достижениями в области прикладного ИИ и личных помощников (Siri, Google Now и им подобные), я решил написать под себя помощника, пусть и не такого продвинутого как коммерческие аналоги, зато со своим блекджеком и своей изюминкой.

Знакомьтесь, Сузи





Главная изюминка моего псевдо-ИИ заключается в очень простой реализации и быстром обучении большому количеству фраз. Достигается это следующим образом:



Логика Сузи



В папке с исполняемым файлом есть (на данный момент) три файла: sinonims.txt, faq.txt, и phrases.txt. Они заполняются мною, в дальнейшем планирую добавить функцию заполнения голосом и/или какое ни будь подобие самообучения.

sinonims.txt
— база исходных слов их замен
привет=hi
здравствуй=hi
хай=hi

дела=state
жизнь=state
...


faq.txt
— база вопрос-ответ. Ответ может содержать текст, команду или переменную
*hi*={&hi}, {%name}
*как*state*={&state}

*off*debug*={@dbg0}{&ok}

В правой части содержится маска, под которую подставляется текст с синонимами, в левой ответ. Спец символы "@", "%" и "&" указывают на то, что нужно вставить вместо конструкции — команду, переменную или фразу соответственно.

phrases.txt
— база частых фраз в нескольких вариантах
hi1=здравствуйте
hi2=приветствую

state1=хорошо
state2=нормально
state3=все в норме
...


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

Пример обработки запроса

Исходный текст: привет, как дела -> Очищаем строку, заменяем синонимы по словарю: hi как state -> Смотрим под какие маски он попадает: *hi* и *как*state* -> Парсим ответ: заменяем {&hi} и {&state} случайным образом на варианты, присутствующие в базе фраз, а {%name} на переменную curusr -> Результат: приветствую, Сэр все в норме (Вы, наверное, могли подумать, что Сузи не очень грамотная, но грамотность ей не нужна, в моих планах прикрутить к ней распознавание речи и TTS, а в этом случае ей не понадобится ставить знаки препинания и писать слова с заглавных букв)



Внутренности Сузи



Процедура инициализации
procedure init;
var
  path: string;
begin
  canspeak := true;
  path := extractfilepath(application.ExeName) + '\brains\'; //Путь к базам
  faq := tstringlist.Create; // Создание и загрузка массивов данных
  words := tstringlist.Create;
  words.LoadFromFile(path + 'phrases.txt');
  faq.LoadFromFile(path + 'faq.txt');
  sins := tstringlist.Create;
  sins.LoadFromFile(path + 'sinonims.txt');
  curusr := 'dysha'; // Текущий пользователь
  name := sino(curusr); // Имя из логина по базе синонимов
  say('Инициализация завершена');
  say('Моя база знаний на данный момент позволяет распознавать ' +
    inttostr(faq.Count * sins.Count) + ' выражений и выводить ' +
    inttostr(faq.Count * words.Count));
end;


Процедура парсинга
procedure parce(s: string);
var
  p, o, i, t, i1: Integer;
  t1: string;
  str: tstringlist;
begin
  str := tstringlist.Create;
  said := false;
  s := ansilowercase(s); // Очистка строки
  trim(s);
  stringtowords(s, str); 
  s := '';
  for i := 0 to str.Count - 1 do // Цикл замены слов на синонимы
    s := s + sino(str[i]) + ' ';
  delete(s, length(s), 1);
  s := answ(s); // Парсинг синонимов на предмет команд или переменных, они там встречаются, например, я={%cname}
  d(s); // Отладочный вывод
  tparce := s;
  rootcmdparce; // Поиск в тексте внутренних команд
  faqparce; // Поиск ответа по маске
end;


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

Заключение


Планов относительно Сузи у меня много, я хочу добавить к ней распознавание и синтезирование речи (но это занятие долгое, а времени мало — сессия, студенты и им сочувствующие поймут), возможность запоминать то, что говорит оператор, анализировать это, сохранять напоминания, заметки. Всю эту систему я хочу поставить на отдельную машину, благо на даче их валяется куча, прикрутить хорошую колонку к ней, микрофон, датчик движения, релешки через com-порт, чтоб я мог зайти в комнату и сказать: «Сузи, закрой дверь, вруби кондиционер и поставь мою любимую песню» или что то в этом роде… Ах, как это круто, черт побери.

Пока искал картинку для топика, наткнулся на это, кто знает, тот поймет.


UPD
Выкладываю исходники с exeшником: docs.google.com/file/d/0B1vVuifL615WVzNmQllOUGEwd00/edit?usp=sharing. Если найдутся те, кто до заполнит базы, буду очень благодарен, если Вы мне их скинете. За возможное наличие быдлокода прошу понять и простить.
Tags:
Hubs:
+13
Comments 31
Comments Comments 31

Articles