Настройка Program-O чатбота – полезные трюки

23.02.2018
By

Program-O – проект Elizabeth Perreau и Dave Morton ( PHP AIML MySql Charbot).

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

Минусы – много багов и отсутствие документации. Зато можно задавать вопросы на гитхабе, которые отвечаются достаточно быстро.

Работает с PHP > 5.3.3

У меня становилась лишь версия 2.6.5 ( и то – для настройки корректного вывода русского языка пришлось сильно переработать несколько функций, которые некорректно работали с выводом русских букв., кроме того, добавил теги, с использованием которых можно выводить <img> и другие полезные штуки в веб-интерфейс).

Установить чатбота просто – переписать разархивированную копию с гитхаба и сделать права доступа на папки install и config на запись. После инсталляции зайти в админпанель чатбота, настроить его и персонализировать. Затем удалить директорию install.

Перед первым запуском чатбота необходимо создать базу MySql, которую затем указать при инсталляции.

как получить ответ в JSON:

http://agronom.ehsm.ru/chatbot/conversation_start.php?say=test&bot_id=2

в одной системе может быть несколько разных ботов  – вызов бота – bot_id = номер бота

вопрос боту – say=вопрос

ответ бота

{"convo_id":"f6e714264571b50e8791bae1b7bc4161",
"usersay":"test",
"botsay":"No information about Your request",
"data":{"aiml_id":"-1",
         "bot_id":"2",
         "pattern":"no results",
         "thatpattern":"",
         "topic":"",
         "score":261,
         "track_score":"current bot, no topic to match, no thatpattern to match, common word match: no, uncommon word match: results"}}

вот так выглядит ответ на русском на строку запросаhttp://agronom.ehsm.ru/chatbot/conversation_start.php?say=%D0%B1%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B8%20%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D1%84%D0%B5%D0%BB%D1%8F&bot_id=1

{"convo_id":"c762400a24fdf09bd125548337489a66",
"usersay":"\u0431\u043e\u043b\u0435\u0437\u043d\u0438 \u043a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u044f",
"botsay":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0431\u043e\u043b\u0435\u0437\u043d\u044f\u043c
\u0438 \u043a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f:\u0440\u0430\u043a,
[br][img src='http:\/\/agronom.ehsm.ru\/img\/potato_img\/potato_cancer.jpg'][br] \u0444\u0438
\u0442\u043e\u0444\u0442\u043e\u0440\u043e\u0437,[br][img src='http:\/\/agronom.ehsm.ru\/img\/potato_img\/potato_fitophtoroz.jpg'][br]
\u0440\u0438\u0437\u043e\u043a\u0442\u043e\u043d\u0438\u043e\u0437 (\u0447\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0448\u0430),[br]
\u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u0440\u0448\u0430,[br] \u0447\u0435\u0440\u043d\u0430\u044f
\u043d\u043e\u0436\u043a\u0430,[br]\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0430\u044f \u0433\u043d\u0438\u043b\u044c,[br] \u0441\u0443\u0445\u0430\u044f
\u0433\u043d\u0438\u043b\u044c,[br] \u043c\u043e\u043a\u0440\u0430\u044f \u0433\u043d\u0438\u043b\u044c,[br] \u0432\u0438\u0440\u0443\u0441\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0437\u043d\u0438 -[br]
\u043f\u043e\u043b\u043e\u0441\u0447\u0430\u0442\u0430\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430,[br] \u043c\u043e\u0440\u0449\u0438\u043d\u0438\u0441\u0442\u0430\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430,[br]
\u0448\u0443\u0440\u0448\u0430\u0449\u0430\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430 (\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u044c\u0435\u0432),[br][img src='http:\/\/agronom.ehsm.ru\/img\/potato_img\/potato_skruch.jpg'][br]
 \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430 (\u043a\u0440\u0430\u043f\u0447\u0430\u0442\u043e\u0441\u0442\u044c),[br][img src='http:\/\/agronom.ehsm.ru\/img\/potato_img\/potato_simple_mosaik.jpg'][br] \u0431\u043e
\u043b\u0435\u0437\u043d\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0432\u0440\u0435\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 -[br] \u043a\u043e\u043b\u043e\u0440\u0430\u0434\u0441\u043a\u0438\u043c \u0436\u0443\u043a\u043e\u043c,[br] \u043f\u0440\u043e
\u0432\u043e\u043b\u043e\u0447\u043d\u0438\u043a\u043e\u043c,[br][img src='http:\/\/agronom.ehsm.ru\/img\/potato_img\/potato_provolochnik.jpg'][br] \u0438 \u0442.\u0434.)",
"data":{"aiml_id":"158","pattern":"_ \u0411\u041e\u041b\u0415\u0417\u041d\u0418 \u041a\u0410\u0420\u0422\u041e\u0424\u0415\u041b\u042f","thatpattern":"","topic":"","score":280,"track_score":"current bot, no topic to match, no thatpattern to match, underscore word match, direct word match:
\u0431\u043e\u043b\u0435\u0437\u043d\u0438, direct word match: \u043a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u044f"}}

Обратите внимание - для вывода картинок используется [img ...] вместо <img ...> и [br] вместо <br/>
Сделано для собственного удобства, чтобы завать в ответах не только планарный текст, но и элементы форматирования
и картинки.

Какие теги и разметку AIML можно использовать в чатботе (проверено):

<star/>
Пример:
<category>
   <pattern> * это * </pattern>

   <template>
      У Вас всегда <star index = "1"/> является <star index = "2"/>. Банально!
   </template>

</category>

Чатботу задается вопрос: Курица это птица
Ответ чатбота: У Вас всегда Курица является птица. Банально!

<star/> заменяет любое слово в выражении
 
<srai>(закрывающий тег </srai>) - позволяет объединять разные вопросы чатботу. Например вопрос "погода сегодня" можно
задать множеством разных способов - "какая сегодня погода", "как погода" и прочее.

Чтобы объединить данные вопросы и привязать к ним вариант ответа служит тег <srai>
Пример:
<category>
      <pattern> Кто такой Эйнштейн </pattern>
      <template>Эйнштейн - немецкий физик</template>
   </category>

   <category>
      <pattern> Кто такой Исаак Ньютон </pattern>
      <template>Исаак Ньютон - физик и математик</template>
   </category>

   <category>
      <pattern>Знаешь кто такой * </pattern>
      <template>
         <srai>Кто такой <star/></srai>
      </template>
   </category>
   <category>
      <pattern>Кем был * </pattern>
      <template>
         <srai>Кто такой <star/></srai>
      </template>
   </category>
Из примера видно, что мы сможем получить одинаковый ответ на вопросы "Кем был Эйнштейн",
"Знаешь кто такой Эйнштейн" и "Кто такой Эйнштейн".

Обратите внимание, что в вопросах AIML лучше очищать знаки препинания и точки, вопросы и восклицательные
знаки - таким образом уменьшается количество правил для ответов.
В запросе данные символы лучше очищать программным способом.
Также для сравнения лучше приводить символы либо к строчным либо к БОЛЬШИМ буквам - также важно при
сравнении.

Спецсимволы использующиеся в теге <template></template>
            * - заменяет любую строку (слово и фразу)
            _ - заменяет любое слово

Тег <random></random> позволяет выводить в порядке случайного вывода различные ответы на один и тот же
вопрос.
<category>
      <pattern>HI</pattern>

      <template>
         <random>
            <li> Hello! </li>
            <li> Hi! Nice to meet you! </li>
         </random>
      </template>

   <category>
Позволит выводить ответы Hello! и Hi! Nice to meet you! в случайном порядке на вопрос HI

Теги <set><get> (не работает в версии 2.6.5.)

Пример:
<category>
      <pattern>I am *</pattern>
      <template>
         Hello <set name = "username"> <star/>! </set>
      </template>
   </category>  

   <category>
      <pattern>Good Night</pattern>
      <template>
         Good night <get name = "username"/>! Thanks for the conversation!
      </template>
   </category>  

Позволит получить следующий диалог:
user:     I am Michael
chatbot:  Hello Michael!
user:     Good Night
chatbot:  Good night Michael! Thanks for conversation!

тег <that> позволяет организовать древовидный диалог (обычно, когда пользователь отвечает "да", "нет"
на предыдущие вопрос.

Пример:
<category>
      <pattern>WHAT ABOUT MOVIES</pattern>
      <template>Do you like comedy movies</template>
   </category>

   <category>
      <pattern>YES</pattern>
      <that>Do you like comedy movies</that>
      <template>Nice, I like comedy movies too.</template>
   </category>

   <category>
      <pattern>NO</pattern>
      <that>Do you like comedy movies</that>
      <template>Ok! But I like comedy movies.</template>
   </category>
Тег <topic> позволяет организовать контекст обсуждения в рамках оптелделенной темы.

Пример:
<category>
      <pattern>LET DISCUSS MOVIES</pattern>
      <template>Yes <set name = "topic">movies</set></template>
   </category>

   <topic name = "movies">
      <category>
         <pattern> * </pattern>
         <template>Watching good movie refreshes our minds.</template>
      </category>

      <category>
         <pattern> I LIKE WATCHING COMEDY! </pattern>
         <template>I like comedy movies too.</template>
      </category>

   </topic>
Это основные теги, с помощью которых можно сделать достаточно связный диалог чатбота и пользователя.

Безусловно есть много вопросов, которые необходимо еще изучить, чтобы Ваш чатбот прошел тест Тьюринга
успешно.

Одним из важных вопросов является использования нечеткого (контекстного) поиска соответствия запроса человека
template AIML файлов.
В частности, одним из решений является использование рассчета расстояний Левенштейна для сравнения соответствия двух
строк.

Особенно важно использовать такие решения в русском языке, где возможны множественные словоформы и окончания.
С учетом проблем, которые свойственны данному методу, лучше сравнивать не строки в целом (не фразы), а отдельные слова
из которых состоит фраза. При этом желательно отбрасывать малые слова - союзы, предлоги.

Для Python существует специальная библиотека, которая позволяет более просто использовать данный алгоритм
в своих проектах.

import Levenshtein
ratio = Levenshtein.ratio(phraze, phraze1)
позволяет посчитать коэффициент сходства двух фраз.
Changes in Program - O 2.6.5 version release/
1. PDO_functions.php
	line 30 added ->  $dbConn->exec("set names utf8"); // force MySQL utf8
2. mics_functions.php
    line 64 changed -> return (IS_MB_ENABLED) ? mb_strtolower($text, "UTF-8") : strtolower($text); // UTF-8 forced
	line 77 changed -> return (IS_MB_ENABLED) ? mb_strtoupper($text, "UTF-8") : strtoupper($text); // UTF-8 forced
3. Conversation execution questions
		there is three ( or more ) ways: (i have used third way)

		3.1. conversation_start.php line 194 in procedure normalize_text() will be deleted all non letters characters
		and all matematics operations became words ( "5-3" will be "5 MINUS 3").
		But in procedure teach there is no this normalize_text() procedure. Result - no matches in database.
			Suggestions - need to add normalize_text() procedure to teach.php

			file teach.php:
			line 93 changed -> $pattern = normalize_text($pattern); //$pattern = _strtoupper($pattern);
			line 96 changed -> $thatpattern = normalize_text($thatpattern); //$thatpattern = _strtoupper($thatpattern);
			line 106 changed -> $topic = normalize_text($topic);//$topic = _strtoupper($topic);

			file upload.php:
			line 234 changed -> $pattern = normalize_text($pattern); //$pattern = _strtoupper($pattern);
			line 237 changed -> $that = normalize_text($that); //$that = _strtoupper($that);
			line 269 changed -> $pattern = normalize_text($pattern); //$pattern = _strtoupper($pattern);
			line 272 added -> $that = normalize_text($that); //not exist before
			line 300 changed -> $pattern = normalize_text($pattern); //$pattern = _strtoupper($pattern);
			line 303 added -> $that = normalize_text($that); //not exist before

			but need to check normalize_text() to do not delete "*" and other approved by AIML symbols

		3.2 conversation_start.php line 194 changed -> 	$say = _strtoupper($say); //$say = normalize_text($say);

			but need to make procedure to delete all non AIML symbols like "," etc...

		3.3 make procedure for delete all non AIML symbols during teach.php and upload.php procedures.

			to file misc_functions.php added new procedure (normalise_input_text()) to delete all typical text symbols from input patterns
			to make better result of recognition.

			file teach.php:
			line 93 changed -> $pattern = normalize_input_text($pattern); //$pattern = _strtoupper($pattern);
			line 96 changed -> $thatpattern = normalize_input_text($thatpattern); //$thatpattern = _strtoupper($thatpattern);
			line 106 changed -> $topic = normalize_input_text($topic);//$topic = _strtoupper($topic);

			file upload.php:
			line 234 changed -> $pattern = normalize_input_text($pattern); //$pattern = _strtoupper($pattern);
			line 237 changed -> $that = normalize_input_text($that); //$that = _strtoupper($that);
			line 269 changed -> $pattern = normalize_input_text($pattern); //$pattern = _strtoupper($pattern);
			line 272 added -> $that = normalize_input_text($that); //not exist before
			line 300 changed -> $pattern = normalize_input_text($pattern); //$pattern = _strtoupper($pattern);
			line 303 added -> $that = normalize_input_text($that); //not exist before

4. changed display_conversation.php
   lines 236-246 unicod translation. (remarked now)
5. file /gui/plain/index.php - changed fully for XXXXXXXXXXXXXXXXXXXXX.tech purposes

6. censored...
7. how to call internet page with answer for question from get call - example http://XXXXXXXXXXXXXX/gui/plain/index.php?say=test&format=html
8. mistakes in admin->search/edit aiml section
    row 171 -> need to replace $row['template'] = htmlentities($row['template']); with $row['template'] = htmlentities($row['template'],ENT_NOQUOTES,'UTF-8');
    othervise Russian language in template section is not showing in admin section

Добавить комментарий