Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2012, 23:01   #1
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Радость Как улучшить чат-бота? Свежие идеи

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

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

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

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

Получает текст и пробегается по базе кейвордов, определяет первичную тематики и по этой тематике ищет что бы зделать. Или ищет другую тему сумежную с этой или выдает готовый результат.
Реализовано на стравнении текстов и 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);

Как видите оно здесь еще и определяет о ком идет речь в тексте.
dem66 вне форума Ответить с цитированием
Старый 27.02.2012, 23:09   #2
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Сообщение

Вот алгоритм поиска темы:

Запрос получается 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/

Жду пожеланий, идей.
Вложения
Тип файла: zip chat.sql.zip (2.0 Кб, 106 просмотров)

Последний раз редактировалось dem66; 27.02.2012 в 23:13.
dem66 вне форума Ответить с цитированием
Старый 28.02.2012, 02:46   #3
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

чтобы сделать более-менее толкового бота, сперва надо плотно подойти к изучению частей речи великого и могучего русского языка, понять как они между собой связаны, понять как влияют знаки препинания на окраску предложения, учесть падежи, словообороты и сокращения, применяемые в интернете (ибо целевая аудитория для бота в инете тусит)... наверняка есть еще куча нюансов, о которых стоит расспросить лингвистов, профессионально занимающихся разбором речи.
Без этих знаний, максимум что ты сможешь сделать, это заставить бота отвечать общими фразами, реагируя на определенные слова. Потому "накидать за выходные" не получится - либо штудируй вопрос и продумывай алгоритм, прежде чем браться за написание кода, либо ограничься фразами типа "привет, пока, пошел на ***" и не парься.
Как вариант, Эллочке-людоедке хватало 30 слов, чтобы выразить ними любую мысль... в википедии даже описано как их надо применять, потому половина алгоритма уже есть =)
Mortimoro вне форума Ответить с цитированием
Старый 28.02.2012, 03:06   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Класс ))
................................... ..
Цитата:
<Человек> как дела ?
<Камилла> Плохо
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 28.02.2012, 09:42   #5
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Хотите чтобы бот обучался?

Здесь нужна обратная связь, а не нейросети. То есть должна быть оценка ответа бота (типа: нормально/плохо ответил). В базе надо отмечать ошибки. Именно ошибки, неправильные ответы.
Виталий Желтяков вне форума Ответить с цитированием
Старый 28.02.2012, 16:38   #6
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Класс ))
................................... ..

А вы на настроение смотрели. Конечно довести до того чтоб оно ушло в минус а потом спрашивать как дела
dem66 вне форума Ответить с цитированием
Старый 28.02.2012, 16:44   #7
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
То есть должна быть оценка ответа бота (типа: нормально/плохо ответил). В базе надо отмечать ошибки. Именно ошибки, неправильные ответы.
Пожалуста по подробнее.

###### К ОСТАЛЬНЫМ ######
Ну а если подумать что по сути что собой являет таже нейро сеть? Те же цыклы, условия, и прочая ересть, тот же алгоритм просто называется красиво.

Тут главное придумать как бот должен отдать ответ. Что он должен выполнить, а то для какждого варианта (ну как например в тех же функциях что выше
Тоесть:
PHP код:
if(preg_match("|ДАВАЙ|"$str)){ 
        
$Desytvie "ПРЕДЛОЖЕНИЕ"
    }elseif(
preg_match("|ХОЧУ|"$str)){ 
        
$Desytvie "ПРЕДЛОЖЕНИЕ"
    } 
Придумывать реализацию не айс.)

Вот самая идея нужна а реализацыя уже не проблема
dem66 вне форума Ответить с цитированием
Старый 28.02.2012, 20:45   #8
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

у когото есть идеи? хоть какието. не проходите мимо
dem66 вне форума Ответить с цитированием
Старый 28.02.2012, 21:13   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от dem66 Посмотреть сообщение
у когото есть идеи? хоть какието. не проходите мимо
Так читать же невозможно - ни текст, ни код..
Идея есть - учить вам нужно и русский язык, и PHP.
Andkorol вне форума Ответить с цитированием
Старый 28.02.2012, 21:34   #10
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

ну ну. тема закрыта. с к--ми разговаривать
dem66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мечты о форуме и сайтах клуба Alar О форуме и сайтах клуба 1652 18.12.2019 17:55
Как улучшить код kirza Общие вопросы Delphi 10 19.01.2011 18:14
Создание чат-бота для онлайн игры mrlasking Фриланс 1 22.11.2010 19:31
Как улучшить макрос? Highlander Microsoft Office Excel 1 23.01.2010 12:15
Как улучшить fps ? minatavr84 Компьютерное железо 2 26.03.2009 23:59