В этом файле описан формат файла базы реплик и принцип работы Болтуна. ============================================================== Формат файла. Файл базы реплик имеет кодировку UNICODE и состоит из пар строк. Такие пары строк являются допустимыми: 1) Фразы обучения: "Фраза" "Ответ" 2) Ответы по ключевым словам: ("список ключевых слов") "Ответ" При этом список ключевых слов состоит из слов, ОБЯЗАТЕЛЬНО должен заканчиваться символом типа предложения ('?' - вопросительное, '.' - любое другое). Если список предваряется символом '~', то это является разрешением нечеткого совпадения. 3) Ответы по специальным словам: {"список специальных слов"} "Ответ" 4) Часто используемые фразы: ["Фраза"] "Ответ" 5) Слова-признаки вопросительного предложения: "слово" 6) Специальные слова: "Специальное слово" 7) Общие ответы: "Общий ответ" 8) Начальные фразы (Для начала разговора): "Начальная фраза" 9) Общие ответы (то же, что и 7): "Общий ответ" 10) Алиасы @"привет" "превед прю прифф" 11) Ответы на повторы "Я уже сказал." ============================================================== Припцип работы движка бота: Во время работы движку передается реплика клиента, а движок на основе реплики формирует ответ. Нахождение ответа имеет такие фазы: 0) Если эта реплика совпадает с предыдущей (точное совпадение), сказанной не более 30 мин. назад - выдается одна из реплик-ответов на повторы (11). После 2-3 повторов Болтун перестает реагировать на повторы этой реплики и просто не отвечает. После 30 мин Болтун нормально реагирует на эту же реплику, но на повтор сразу будет молчать. Так будет до первой реплики, отличной от уже повторенной. 1) Поиск реплики целиком среди часто используемых (4) реплик. При нахождении реплики ее ответ возвращается как ответ бота. Если ответов для этом реплики несколько, то выбирается один из них. Если реплика не найдена среди (4), то поиск ответов продолжается. Далее все найденные ответы запоминаются с учетом их приоритета и в конце осуществляется выбор. 0 - наивысший приоритет. 2) Далее происходит поиск среди реплик обучения (1) аналогично пункту 1). Результаты имеют приоритет 1. 3) Производится разбиение реплики на предложения. Разделителями предложений являются симолы '.' '!' '?', при этом игнорируется '!' в составе смайлика ':-!'. Следующие действия производятся для каждого предложения: 4) Поиск предложения целиком среди часто используемых (4) фраз. Результаты имеют приоритет 0. 5) Поиск среди фраз обучения (1). Результаты имеют приоритет 1. 6) Далее происходит разделение предложения на слова. При этом в предложении выделяются как слова все смайлики, а также скобки количеством больше двух ( "))" ). Производится определение типа предложения: вопросительное или нет. Вопросительное предложение или имеет в конце восклицательный знак, или содержит хотя бы одно слово, которое относится к вопросительным (5). Отдельно записываются слова, которые относятся к специальным (6). 7) Поиск совпадения среди ключевых слов (2). Все ключевые слова должны присутствовать в предложении и тип предложения должен совпадать. Результаты имеют приоритет 1. Предпочтительным является совпадение как можно большего количества ключевых слов. 8) Поиск совпадения среди специальных слов (3). Специальные - это слова из (6). Подразумевается, что они не несут особой смысловой нагрузки и по ним возможны только обобщенные ответы. В предложении должно присутствовать не менее одного специального слова (как правило, присутствует только одно). Также, тип предложения должен совпадать. Результаты имеют приоритет 2. Результаты, полученные от разных предложений, имеют одинаковый приоритет и только один из них может стать ответом. Пункты 9 и 10 ипользуются, только если опция "Молчать, если нету хороших ответов" (aka "Иногда лучше жевать") отключена. 9) Выбор одного случайного ответа среди общих ответов (7). Результаты имеют приоритет 3. 10) Выбор одного случайного ответа среди общих ответов (9). Обычно (9) - это несколько реплик в духе "не понял". Результаты имеют приоритет 3. Таким образом, в случае непонятной фразы используется или 9 или 10 с равной вероятностью. После этого производится замена алиасов (10) в исходной реплике на соответствующие слова и повторение пунктов 1-10 для такой реплики. Как ответ бота выбирается случайный ответ с наименьшим значением приоритета. При нескольких ответах одинакового приоритета выбирается тот, который не использовался до этого (учитываются предыдушие ответы Болтуна этому контакту за последние 30 минут). Если никаких вариантов ответа нет (например, для пустой базы реплик), то ответа и не следует. Если ответ должен начинаться с маленькой буквы, то первая найденная буква в ответе заменяется на маленькую. Этого не происходит, если ответ начинается с пробела. При этом пробел удаляется.