Пишу чат-бота. Подкиньте идеи по улучгению

Discussion in 'PHP' started by mirasoft, 27 Feb 2012.

  1. mirasoft

    mirasoft Banned

    Joined:
    1 Nov 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Добрый вечер форумчанам.
    Вот предложили мне занятся проэктом чат-бота, на выходных накидал небольшой код.

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

    Но все это както приметивно. Хотелось бы чтоб бот начал сам обучатся или чтото подобное. Былобы здорово еслибы он начал сам задавать вопросы. Ктото сталкивался с написанием нейросетей? С гугла толку мало, все предлагаюк крадратики решать.

    Сейчасм бот работает так:

    Получает текст и пробегается по базе кейвордов, определяет первичную тематики и по этой тематике ищет что бы зделать. Или ищет другую тему сумежную с этой или выдает готовый результат.
    Реализовано на стравнении текстов и 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'1time()+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);
    }
    Как видите оно здесь еще и определяет о ком идет речь в тексте.
     
    1 person likes this.
  2. mirasoft

    mirasoft Banned

    Joined:
    1 Nov 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Вот алгоритм поиска темы:

    Запрос получается 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(0count($text)-1)];
        }
        return 
    $otvet;
    }
    Также он определяет время суток, как отвечать на ТЫ или ВЫ и т.д

    Бот понимает комлименты, обзывания(может и послать, чаще так и поступает), и от этого зависит его настроение, от настроения зависят некоторые ответы.

    Вот дам базы данных:

    Скачать

    Там хранятся ключевые слова тем, сами темы, варианты ответов на некоторые темы и прочее.

    Пример можно посотреть здесь http://kamillabot.16mb.com/

    Жду пожеланий, идей.
     
  3. mirasoft

    mirasoft Banned

    Joined:
    1 Nov 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    у когото есть идеи? хоть какието. не проходите мимо
     
  4. Га-Ноцри

    Га-Ноцри Elder - Старейшина

    Joined:
    16 Oct 2011
    Messages:
    329
    Likes Received:
    177
    Reputations:
    76
    Идея искусственного интеллекта давно терзает пытливые умы. Рад, что молодому поколению не чужда тяга к самообразованию и познаниям.

    Бегло пробежавшись по твоему коду - единственный недостаток, и пожалуй, самый главный, это архитектурный и концептуальный, на мой скромный взгляд - в основе своей ты используешь ветвящуюся управляющую директиву else...if. Но подумай, что будет, когда ты захочешь обогатить словарный запас своего бота? Верно, чем большее разнообразие в ответах своего бота ты захочешь увидеть, тем больше тебе тупо придется добавлять директив с уже заданным набором фраз, а значит сразу же возникнут проблемы с масштабируемостью проекта, поддержкой многих с строчек кода и в конечном итоге к трате вычислительных ресурсов.

    Так что единственный совет, который приходит на ум - откажись от такой структуры кода и обрати взор на более гибкие возможности языка PHP. Например, ООП.

    Структуриованое(процедурное) программирование потихоньку уходить в небытие.

    Как вариант, попробуй написать абстрактный класс(если честно, твердо не уверен, что такая возможность есть в PHP, сужу по "крестам"), который будет наследовать несколько классов, в зависимости от исходных данных - мужчина/женщина, день/ночь, например, и выдавать ответы, в зависимости от исходных данных.

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

    Погугли три основных кита ООП - наследование, полиморфизм, инкапсуляция, и, я уверен, ты найдешь ответы на свои вопросы и получишь пищу для размышления.
     
    #4 Га-Ноцри, 29 Feb 2012
    Last edited: 29 Feb 2012
  5. mirasoft

    mirasoft Banned

    Joined:
    1 Nov 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0

    Знаю, в этом и проблема. Ну вобще большая часть слов березтяс из базы данных. там все ответы, ключевые слова. Моя аська 471881773.

    Есть-есть.

    Ну ничего нового там не придумали :(

    Также тема обсуждается здесь Как улучшить чат-бота? Свежие идеи
     
    #5 mirasoft, 29 Feb 2012
    Last edited: 29 Feb 2012
  6. Ty4ka

    Ty4ka New Member

    Joined:
    9 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    А исходники можешь выложить? Мне было бы интересно покопаться, может что и переделать :)
     
  7. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    База маловата....

     
  8. Kirillik

    Kirillik New Member

    Joined:
    18 Mar 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    я предлагаю использовать уже накопленный опыт общения для обучения бота, то есть:

    1. парсим логи чатов, форумы, IRC и т.п.
    2. настраиваем алгоритм общения бота так, чтобы он максимально выдавал общение похожее на логи
    3. PROFIT :)
     
  9. Ty4ka

    Ty4ka New Member

    Joined:
    9 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Вот если подробнее распишешь алгоритм, то да... А так я даже не представляю как это будет выглядить.

    На фразу "Всем привет" будет постоянно выдавать "и тебе привет"? Ну это слишком уныло и база будет много весит :)
     
  10. winter_silence

    winter_silence New Member

    Joined:
    22 Nov 2008
    Messages:
    21
    Likes Received:
    4
    Reputations:
    0
    Был раньше прикольный IM плагин Болтун, из него можно базу фраз потянуть, mind.dat, открывается в блокноте. Бот самообучается, жаль только его разработку подзабросили.
    если не понимает что нужно ответить, спрашивает у пользователя вариант ответа и записывает его в свою базу.

    Жаль разработку плагина подзабросили.


    Когда то выкладывал логи бота в действии :) http://forum.antichat.ru/showthread.php?p=2571597#post2571597

    Самого бота можно скачать тут
    addons.miranda-im.org/details.php?action=viewfile&id=470