LINUX.ORG.RU

Sample chat bot на C++

 , samplechatbot, scbot


0

1

Разбираясь со строками, файлами и прочей хренью в C++, написал такого вот простейшего, консольного бота-болтуна. Гхм, вообще предполагается, что бот для каждой темы должен иметь словарь, например на слово «машина» и т.п. Короче это простейший, тупой метод нахождения ключевых слов, в зависимости от чего, вести беседу из опр.словаря. Над конвертацией строк в нижний регистр смеяться долго будете, но у меня банально уже терпения не хватило, тем кто мне помогал — отдельное спасибо.

Итак, код бота: [scbot.cpp] [scbot_functions.h]

Пример диалога с ботом из консоли:

Вы: Привет
Бот: Здравствуйте, мы с вами знакомы?
Вы: нет
Бот: Эмм... Что?
Вы: Нет говорю
Бот: Простите, что?
Вы: дура
Бот: Какой длинный язык и какие короткие извилины, просто нонсенс.



Последнее исправление: makeB (всего исправлений: 7)

boost::replace_all(source, "А", "а");
boost::replace_all(source, "Б", "б");
...

ты хотя бы не копипастил, а на массивах сделал, да и можно это сделать в один проход без всяких бустов

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

в один проход без всяких бустров

Как? Я не нашел стандартной функции замены всех вхождений, только первого. Но даже в этом случае, не смог придумать ничего лучше как только для каждой буквы алфавита, запускать отдельный цикл. Один проход кажется фантастичным.

makeB
() автор топика
Ответ на: комментарий от Google-ch

кроме того - это все тот же многократный пробег заново и заново

wota ★★
()
Ответ на: комментарий от makeB

вот «грязный» набросок:

string s="АБвГд";

const char from[]="АБВГД";
const char to[]="абвгд";

size_t len = s.length();
for( size_t i=0 ; i < len-1 ; ++i )
{
    for( size_t j=0 ; j<5 ; ++j )
    {
        if( s[i]==from[j*2] && s[i+1]==from[j*2+1] ) {
            s[i]=to[j*2];
            s[i+1]=to[j*2+1];
        }                
    }
}

но не пиши так в реальном коде, если не хочешь портить карму :) используй локали или библиотеки

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)

Ради бота-то можно было и потянуть Qt Core ;)

Впрочем, неважно, бот-то неплохо косплеит пользователей арча.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)

Зы, продолжение: решил в движок его добавить, поиграться, прокачать. Итак, слегка переписал бота, для подключение в программы — необходимо добавить в ваш проект файлы scbot_core.h и scbot_functions.h, заинклюдить scbot_core.h, вызывать так:

scbot_ask_question ( string "Ваш пост боту" )
вернется string-ответ от бота.

Все это хрень конечно, надо бы бота «Киса» покопать, посмотреть что там за алгоритмы...

makeB
() автор топика
Ответ на: комментарий от quiet_readonly

ТС опредленно кхе кхе, ему же советовали уже QtCore, но ему буст нравится (который кстати не решает его проблемы).

bhfq ★★★★★
()
Ответ на: комментарий от bhfq

но ему буст нравится (который кстати не решает его проблемы).

Неа, не нравится, совсем не нравится. И кют тоже тащить не буду. Нужно написать свой метод — но это потом. Сейчас меня куда больше интересуют алгоритмы сочетания слов, на основе которых выбирать тему, и методы добавления окончаний, вроде в словаре «дура» а бот мог к этому слову отнести и отсутствующее в словаре «дурочка». Но блин, сложно все это...

makeB
() автор топика
Ответ на: комментарий от makeB

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

И если что, в соревнованиях на написание ботов обычно побеждают скриптованные и хорошо отлаженные дубины с одной-двумя ключевыми идеями, а насквозь заалгоритмизированные боты с применением матана и теории графов неожиданно берут за щёчки.

quiet_readonly ★★★★
()

Что такое «образец чат бот»?

anonymous
()

О, я тоже хочу.

import random

answers = ["Не нужно", "УМВР. ЧЯДНТ?", "Язабан", "разупорись", "неосилятор", "systemd говно", "убунта не линукс"]
while(1):
    raw_input();
    print(random.choice(answers))

netcat ★★
()
Последнее исправление: netcat (всего исправлений: 1)

А нейронные сети будут?)

actics
()

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

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.