Основой любой экспертной системы есть база знаний. В нашем случаи базой знаний будет служить база данных MySQL. По этому рассмотрим модель данных. База данных будет состоять из двух таблиц:
1. Таблица вопросов - служит для всевозможных вопросов, которые может задать пользователь.
2. Таблица ответов - служит для ответов на вопросы пользователей.

Данные таблицы имеют связь один ко многим - для одного ответа может быть множество вопросов. Для того, что-бы пользователь мог вести диалог с экспертной системой, будем использовать якоря. Например представим такой диалог:
Пользователь: Ты играешь в компьютерные игры?
Экспертная система: Да, я обожаю играть в игры. А ты любишь играть?

Далее пользователь может ответить “да, люблю” или “нет, не люблю”. На эти ситуации необходимая разная реакция экспертной системы, а привязка должна быть конкретно к этому вопросу, поэтому необходимо использовать якоря.
На следующем изображении изображена модель данных:


После создания модели данных можно переходить к созданию интерфейса экспертной системы. Система должна иметь поле ввода, для вопросов пользователя и текстовое поле для выдачи ответа на вопрос. Также система должна иметь скрытое поле якоря. Верстка формы может иметь следующий вид:

Интерфейс экспертной системы может иметь следующий вид:

После создания модели данных и интерфейса, можно переходить к серверной части: связь системы с базой данных и выполнение к ней запросов. Для подключения базы данных можно использовать следующую функцию:

function connectDB()
{
 $host='localhost'; // хост
 $dbase='expert'; // имя базы данных
 $user='root'; // пользователь
 $pswd=''; // пароль пользователя
 $mysqli = mysql_connect($host, $user, $pswd) or die("Не соединяется с mysql");
 mysql_select_db($dbase) or die("Не подключается к базе");
 return $mysqli;
}
Функция для получения ответа и якоря может иметь следующий вид:

function select($good, $yakor, $query) // Запрос для получения ответа и якоря
{
 $mysqli = connectDB();
 mysql_query("SET NAMES utf8");
 $res = mysql_query($query);
 return $res;
}
Функция для возврата ответа может иметь следующий вид:

function res_answer($res) //Возвращаем ответ
{
 $answer = 0;
 while ($row = mysql_fetch_array($res))
 {
 $answer= $row['answers'];
 }

 if($answer==null)
 $answer=0;
 return $answer;
}
Для возврата якоря, функция аналогичная возврату ответа. Запрос для получения возможного ответа на вопрос пользователя может иметь следующий вид:

$query="SELECT answers.answers,answers.yakor FROM questions,answers 
WHERE answers.id=questions.id_answer 
AND questions.yakor='$yakor' AND MATCH(questions) AGAINST('$good')";
Обработчик, который будет собирать данные из формы и выдавать ответ, а так-же вызов функций может иметь следующий вид:

require_once "functions.php";
$yakor=0;
$answer='Я Expert! Отвечу на ваши вопросы о кафедре ИВМ';
try // обработчик исключений
{
 if (isset($_POST['submit'])) // Если данные из текстового поля переданы
 {
 $questions = htmlspecialchars($_POST['questions']); // Записываем данные в переменную
 $yakor = htmlspecialchars($_POST['yakor']);
 if($yakor==null)
 {
 $yakor=0;
 }
 $questions = substr($questions, 0, 50); //обрезаем вопрос до 50
// убираем лишние символы(!@@#$%&*()_ и т.д.):
 $questions = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $questions); 
//разрешим искать только по словам, которые длиннее двух букв:
 $good = trim(preg_replace("/\s(\S{1,2})\s/", " ", ereg_replace(" +", " ", " $questions "))); 
 $good = ereg_replace(" +", " ", $good); // сжимаем двойные пробелы
 if($questions!=null)
 {
 if($yakor==0) // запрос ==
 {
 $query="SELECT answers.answers,answers.yakor FROM questions,answers 
WHERE answers.id=questions.id_answer 
AND questions.yakor='$yakor' AND questions LIKE ('$good')";
 }
 if($yakor!=0) // запрос %%
 {
 $query="SELECT answers.answers,answers.yakor FROM questions,answers
WHERE answers.id=questions.id_answer 
AND questions.yakor='$yakor' AND MATCH(questions) AGAINST('$good')";
 }
 $res = select($good, $yakor,$query); // вызываем ф-цию запроса
// вызываем ф-цию для получения ответа, записываем ответ в переменную:
 $answer = res_answer($res); 
 if($answer==null)
 {
 $answer=0;
 }
 $res = select($good, $yakor, $query);
// вызываем ф-цию для получения якоря, записываем якорь в переменную:
 $yakor = res_yakor($res); 
 if($answer==null)
 {
 $query="SELECT answers.answers,answers.yakor FROM questions,answers 
WHERE answers.id=questions.id_answer 
AND questions.yakor=0 AND questions LIKE ('$good')";
 $res = select($good, $yakor,$query);// вызываем ф-цию запроса
// вызываем ф-цию для получения ответа, записываем ответ в переменную:
 $answer = res_answer($res); 
 if($answer==null)
 {
 $answer=0;
 }
 $res = select($good, $yakor, $query);
// вызываем ф-цию для получения якоря, записываем якорь в переменную:
 $yakor = res_yakor($res); 
 }
 }
 if($answer==null)
 {
 $answer="Я не знаю ответ, возможно вы некорректно ввели данные";
 }
 $hi = null; //если данные переданы обнуляем приветствие
 $bad = "Извините. Вопрос задан не корректно!"; // Переменная, если в базе ничего не нашли; } }
 }
}
catch(Exception $e)
{
 echo $e;
}
Пример работы
Например, на вопрос: “Где находится кабинет кафедры?” получим следующий ответ:

Вы можете скачать | zip- архив готового примера, а также задать ваши вопросы автору материала: связаться с автором примера.


 Похожие публикации
2015-11-24 • Просмотров [ 428 ]