Добрый вечер форумчанам. Вот предложили мне занятся проэктом чат-бота, на выходных накидал небольшой код. Сейчас программа может определить тематику написаного текста, и попытатся подобрать из базы ответ. Но все это както приметивно. Хотелось бы чтоб бот начал сам обучатся или чтото подобное. Былобы здорово еслибы он начал сам задавать вопросы. Ктото сталкивался с написанием нейросетей? С гугла толку мало, все предлагаюк крадратики решать. Сейчасм бот работает так: Получает текст и пробегается по базе кейвордов, определяет первичную тематики и по этой тематике ищет что бы зделать. Или ищет другую тему сумежную с этой или выдает готовый результат. Реализовано на стравнении текстов и fulltext поиске. Вот функция генерациии ответа: PHP: function Otvet($str){ $okom = Okom($str); //echo $okom."<BR>"; $thems1 = Thems($str); $thems2 = NULL; if(!empty($thems1)){ $thems2 = Thems($thems1); } $result = $thems1."; ".$thems2; //echo $result."<BR>"; $Desytvie = Desytvie($str); $n=NULL; $otvet = NULL; //echo $thems1."<BR>"; if($okom=="BOT"){ if($Desytvie=="ПРЕДЛОЖЕНИЕ"){ if($thems1=="ДРУЖБА" && !isset($_COOKIE['drug'])){ $otvet = VARIANT_OTVETA($thems1); setcookie('drug', 1, time()+99999, "/"); }elseif($thems1=="ДРУЖБА" && isset($_COOKIE['drug'])){ $otvet = "Мы ведь уже друзья"; }else{ $otvet = VARIANT_OTVETA($thems1); } }elseif($Desytvie=="ВОПРОС"){ $otvet = VARIANT_OTVETA($thems1); }elseif($Desytvie=="МАТЕМАТИКА"){ Clear($str); }else{ $otvet = VARIANT_OTVETA($thems1); } }elseif($okom=="MY"){ if($thems1=="ИМЯ" || $thems1=="ИМЯ КЛИЕНТА"){ $otvet = Rand_MY_name(); $n=1; }elseif($thems1=="СОХРАНИТЬ ИМЯ КЛИЕНТА"){ if(CheckUser("ИМЯ")!=1){ $orm = new ORM('info'); $orm->name = "Имя"; $orm->data = $str; $orm->session = $_COOKIE['userid']; $orm->prior = Prioriter(); $orm->flush(); $otvet = VARIANT_OTVETA($thems1); }else{ $otvet = "Я знаю"; } }elseif($thems1=="СТРАНА КЛИЕНТА"){ //echo"приятно познакомится"; $otvet = VARIANT_OTVETA($thems1); }elseif($thems1=="ВОЗРАСТ КЛИЕНТА"){ //echo"приятно познакомится"; $otvet = VARIANT_OTVETA($thems1); CheckUser(); }else{ } } if(preg_match("|ПРИВЕТ|isU", $str)){ $otvet = Privet('1')." ".$otvet; }elseif(preg_match("|ПРИВЕТИК|isU", $str)){ $otvet = Privet('1')." ".$otvet; }elseif(preg_match("|ХАЙ|isU", $str)){ $otvet = Privet('1')." ".$otvet; }elseif(preg_match("|ЗДРАСТВУЙТЕ|isU", $str)){ $otvet = Privet('3')." ".$otvet; }elseif(preg_match("|ЗДРАСТВУЙ|isU", $str)){ $otvet = Privet('2')." ".$otvet; }elseif(preg_match("|ПРИВЕТСТВУЮ|isU", $str)){ $otvet = Privet('2')." ".$otvet; } return mb_ucfirst($otvet,$n); } Как видите оно здесь еще и определяет о ком идет речь в тексте.
Вот алгоритм поиска темы: Запрос получается SELECT SQL_CALC_FOUND_ROWS * FROM themes n WHERE MATCH (text) AGAINST ("исходный текст, обработаный текст") LIMIT 0,1 исходный текст - тот что прислал юзер. обработаный текст - тот что отдал PhpMorphy PHP: function Thems($text){ $morphy = NULL; $morphy = Morphy($text); $morphy = iconv("CP1251","UTF-8", $morphy); $orm = new ORM('themes'); $where = array( array( "type"=>"MATCH", "col"=>"text", "val"=>"\"".$text.', '.$morphy."\"" ) ); $orm->Where($where); $orm->Limit("0,1"); $orm->Select("SQL_CALC_FOUND_ROWS *"); $result = $orm->find_all(); return $result[0]['themes']; } Эта часть определяет кому адресовано сообщение: PHP: function Okom($str){ if(preg_match("|ОН|", $str)){ $komu = "MAN"; }elseif(preg_match("|ОНА|", $str)){ $komu = "WOMAN"; }elseif(preg_match("|ТЕБЕ|", $str)){ $komu = "BOT"; }elseif(preg_match("|ТЕБЯ|", $str)){ $komu = "BOT"; }elseif(preg_match("|МНЕ|", $str)){ $komu = "MY"; }elseif(preg_match("|ЕЙ|", $str)){ $komu = "WOMAN"; }elseif(preg_match("|ЕМУ|", $str)){ $komu = "MAN"; }elseif(preg_match("|С ТОБОЙ|", $str)){ $komu = "BOT"; }elseif(preg_match("|С НЕЙ|", $str)){ $komu = "WOMAN"; }elseif(preg_match("|С НИМ|", $str)){ $komu = "MAN"; }elseif(preg_match("|ТЫ|", $str)){ $komu = "BOT"; }elseif(preg_match("|Я|", $str)){ $komu = "MY"; }else{ $komu = "BOT"; } return $komu; } Думает что от него требуют: PHP: function Desytvie($str){ if(preg_match("|ДАВАЙ|", $str)){ $Desytvie = "ПРЕДЛОЖЕНИЕ"; }elseif(preg_match("|ХОЧУ|", $str)){ $Desytvie = "ПРЕДЛОЖЕНИЕ"; }elseif(preg_match("|БУДЕМ|", $str)){ $Desytvie = "ВОПРОС"; }elseif(preg_match("|СКОЛЬКО БУДЕТ|", $str)){ $Desytvie = "МАТЕМАТИКА"; }elseif(preg_match("|СКАЖИ|", $str)){ $Desytvie = "ВОПРОС"; }elseif(preg_match("|СКОЛЬКО|", $str)){ $Desytvie = "ВОПРОС"; }elseif(preg_match("|\?|", $str)){ $Desytvie = "ВОПРОС"; }else{ $Desytvie = "БЕСЕДА"; } return $Desytvie; } Думает над вариантом ответа: PHP: function VARIANT_OTVETA($str){ $orm = new ORM('deystviya'); $where = array( array( "type"=>"AND", "col"=>"name", "val"=>"\"".$str."\"", "uslov"=>"=" ) ); $orm->Where($where); $orm->Limit("0,1"); $result = $orm->find_all(); $text = explode(';', $result[0]['text']); if(count($text)==1){ $otvet = $text[0]; }else{ $otvet = $text[mt_rand(0, count($text)-1)]; } return $otvet; } Также он определяет время суток, как отвечать на ТЫ или ВЫ и т.д Бот понимает комлименты, обзывания(может и послать, чаще так и поступает), и от этого зависит его настроение, от настроения зависят некоторые ответы. Вот дам базы данных: Скачать Там хранятся ключевые слова тем, сами темы, варианты ответов на некоторые темы и прочее. Пример можно посотреть здесь http://kamillabot.16mb.com/ Жду пожеланий, идей.
Идея искусственного интеллекта давно терзает пытливые умы. Рад, что молодому поколению не чужда тяга к самообразованию и познаниям. Бегло пробежавшись по твоему коду - единственный недостаток, и пожалуй, самый главный, это архитектурный и концептуальный, на мой скромный взгляд - в основе своей ты используешь ветвящуюся управляющую директиву else...if. Но подумай, что будет, когда ты захочешь обогатить словарный запас своего бота? Верно, чем большее разнообразие в ответах своего бота ты захочешь увидеть, тем больше тебе тупо придется добавлять директив с уже заданным набором фраз, а значит сразу же возникнут проблемы с масштабируемостью проекта, поддержкой многих с строчек кода и в конечном итоге к трате вычислительных ресурсов. Так что единственный совет, который приходит на ум - откажись от такой структуры кода и обрати взор на более гибкие возможности языка PHP. Например, ООП. Структуриованое(процедурное) программирование потихоньку уходить в небытие. Как вариант, попробуй написать абстрактный класс(если честно, твердо не уверен, что такая возможность есть в PHP, сужу по "крестам"), который будет наследовать несколько классов, в зависимости от исходных данных - мужчина/женщина, день/ночь, например, и выдавать ответы, в зависимости от исходных данных. Очевидные плюсы - простота в поддержке кода, модульность, и возможность "на лету" изменять варианты ответов, даже при большом их разнообразии. Погугли три основных кита ООП - наследование, полиморфизм, инкапсуляция, и, я уверен, ты найдешь ответы на свои вопросы и получишь пищу для размышления.
Знаю, в этом и проблема. Ну вобще большая часть слов березтяс из базы данных. там все ответы, ключевые слова. Моя аська 471881773. Есть-есть. Ну ничего нового там не придумали Также тема обсуждается здесь Как улучшить чат-бота? Свежие идеи
я предлагаю использовать уже накопленный опыт общения для обучения бота, то есть: 1. парсим логи чатов, форумы, IRC и т.п. 2. настраиваем алгоритм общения бота так, чтобы он максимально выдавал общение похожее на логи 3. PROFIT
Вот если подробнее распишешь алгоритм, то да... А так я даже не представляю как это будет выглядить. На фразу "Всем привет" будет постоянно выдавать "и тебе привет"? Ну это слишком уныло и база будет много весит
Был раньше прикольный IM плагин Болтун, из него можно базу фраз потянуть, mind.dat, открывается в блокноте. Бот самообучается, жаль только его разработку подзабросили. если не понимает что нужно ответить, спрашивает у пользователя вариант ответа и записывает его в свою базу. Жаль разработку плагина подзабросили. Когда то выкладывал логи бота в действии http://forum.antichat.ru/showthread.php?p=2571597#post2571597 Самого бота можно скачать тут addons.miranda-im.org/details.php?action=viewfile&id=470