Telegram Bot con Python e ChatterBot

In questo tutorial vedremo come utilizzare il modulo ChatterBot con Telegram.
Più in dettaglio vedremo come realizzare un chatbot sfruttando le potenzialità di Python e del modulo ChatterBot. Un chatbot, è una applicazione progettata per simulare una conversazione con un essere umano. Inoltre integreremo il bot forgiato, con la piattaforma di messaggistica Telegram .
Supercar è un telefilm cult degli anni ’80 e KITT è l’automobile dotata di un computer con un’elevatissima intelligenza artificiale, che lo rende pensante a tutti gli effetti, e con persino la possibilità di provare sentimenti e stati d’animo diversi.
Cosa può fare KITT? Nel telefilm, tra le tante potenzialità, può analizzare la composizione chimica di qualsiasi sostanza od oggetto; può viaggiare sull’acqua senza affondare e naturalmente può guidarsi da sola.
Inoltre, ChatterBot è una libreria Python che permette in modo semplice la creazione di bot in grado di intrattenere conversazioni con gli esseri umani. Utilizza una serie di algoritmi di Machine Learning, e dispone di una serie di corpus per più lingue, da utilizzare per l’allenamento del bot. La documentazione è dettagliata e ben curata, il che fa preferire ChatterBot ad altre librerie, oltre a rendere piacevole la personalizzazione e semplice la comprensione delle componenti in gioco.
Per lo sviluppo utilizzerò PyCharm (verisone Community) su Ubuntu 20.04 LTS Focal Fossa (È una mia scelta, potete usare l’editor che più vi piace, su Windows o su Mac). Partiremo dallo sviluppo del chatbot a se stante e infine lo inseriremo in un codice per farlo girare su Telegram.
Step #1 Installiamo il modulo ChatterBot dal terminale di PyCharm, utilizzando il comando:pip install chatterbot
nel caso in cui l’aveste già installato nel vostro ambiente di sviluppo, potreste verificarne la versione col comando:
python -m chatterbot --version
Dopo aver installato chatterbot, verificate i moduli installati col comando:
pip list
dovreste quindi ottenere la seguente lista dei 34 moduli appena installati:
blis 0.2.4
certifi 2020.6.20
chardet 3.0.4
ChatterBot 1.0.5
click 7.1.2
cymem 2.0.3
idna 2.10
joblib 0.16.0
mathparse 0.1.2
murmurhash 1.0.2
nltk 3.5
numpy 1.19.0
packaging 20.4
Pint 0.14
pip 20.1.1
pkg-resources 0.0.0
plac 0.9.6
preshed 2.0.1
pymongo 3.10.1
pyparsing 2.4.7
python-dateutil 2.7.5
pytz 2020.1
PyYAML 5.1.2
regex 2020.6.8
requests 2.24.0
setuptools 49.1.0
six 1.15.0
spacy 2.1.9
SQLAlchemy 1.2.19
srsly 1.0.2
thinc 7.0.8
tqdm 4.47.0
urllib3 1.25.9
wasabi 0.7.0
Ora prestiamo attenzione al fatto che, affinché il nostro codice risulti funzionante, dobbiamo avere installata la libreria chatterbot-corpus (che non risulta in questa lista). Inoltre il modulo PyYAML deve essere riportato alla versione 3.13 e non 5.12 (al momento della scrittura di questo tutorial). Pertanto procediamo installando il modulo chatterbot-corpus:
pip install chatterbot-corpus
Riprovando a dare pip list da terminale, otterremo l’aggiornamento della lista:
blis 0.2.4
certifi 2020.6.20
chardet 3.0.4
ChatterBot 1.0.5
chatterbot-corpus 1.2.0
click 7.1.2
cymem 2.0.3
idna 2.10
joblib 0.16.0
mathparse 0.1.2
murmurhash 1.0.2
nltk 3.5
numpy 1.19.0
packaging 20.4
Pint 0.14
pip 20.1.1
pkg-resources 0.0.0
plac 0.9.6
preshed 2.0.1
pymongo 3.10.1
pyparsing 2.4.7
python-dateutil 2.7.5
pytz 2020.1
PyYAML 3.13
regex 2020.6.8
requests 2.24.0
setuptools 49.1.0
six 1.15.0
spacy 2.1.9
SQLAlchemy 1.2.19
srsly 1.0.2
thinc 7.0.8
tqdm 4.47.0
urllib3 1.25.9
wasabi 0.7.0
Ottimo! Ora abbiamo 35 moduli installati e PyYAML risulta effettivamente alla versione 3.13 (viene automaticamente effettuato il downgrade). Inoltre, è finalmente presente il modulo chatterbot-corpus, che ci permette di importare set di dati predefiniti, sulla cui base sarà possibile allenare il nostro bot. Siamo adesso pronti per passare al prossimo step.
Step #2 Importeremo tutti i moduli necessari al far girare il codice in modo fluido e funzionale!from chatterbot import ChatBot from chatterbot.trainers import ListTrainer from chatterbot.response_selection import get_first_response from chatterbot.comparisons import levenshtein_distance
Il modulo ChatBot è di fatto quello che ci serve per creare il bot. Il modulo ListTrainer ci servirà per l’allenamento del bot. Inoltre, get_first_response sarà utile a selezionare la prima tra le risposte più adeguate al tipo di domanda proposta dagli utenti. Infine levenshtein_distance è l’algoritmo che permette il confronto tra input e risposte contenute nel database (che creeremo in seguito).
kittBot = ChatBot( "Kitt", storage_adapter = "chatterbot.storage.SQLStorageAdapter", database = "./db.sqlite3", logic_adapters = [ "chatterbot.logic.BestMatch" ], statement_comparison_function = levenshtein_distance, response_selection_method = get_first_response )
Ok, la prima cosa da fare è pertanto battezzare il nostro bot. Assegnare il nome è operazione dovuta e necessaria, in quanto il nome è l’unico parametro di cui davvero non si può fare a meno! Come è ben evidente dal codice, Kitt è passato come primo parametro alla funzione ChatBot().
I parametri successivi, riguardano l’immagazzinamento dei dati: ChatterBot utilizza un adattatore di default, chiamato SQLStorageAdapter ed anche se non lo specificate attraverso questa riga di codice, l’adattatore verrà creato automaticamente dal modulo. L’istruzione database = “./db.sqlite3” crea un database di tipo SQLite all’interno della cartella utilizzata per lo sviluppo del chatbot.
Il Logic Adapter è l’adattatore logico che si sceglie per l’implementazione del chatbot. Nel caso di KITT, abbiamo un adattatore di tipo BestMatch, ossia una logica basata sulla risposta che meglio si adatta al tipo di domanda effettuata. Questo adattatore sfrutta una funzione per il confronto tra input e dati noti (basata nel nostro caso sulla Distanza di Levenshtein) e un’altra funzione per la scelta finale della risposta (get_first_response seleziona la prima tra le risposte scelte).
BestMatch è nella libreria ChatterBot, tuttavia se ne volete creare uno vostro, potete cimentarvi tranquillamente nell’opera di realizzazione.
Step #4 A questo punto definiamo la conversazione. Creeremo quindi una sequenza di frasi che andranno a inizializzare il dialogo tra umani e chatbot.Aprite un editor testuale e create il file di testo nomefile.txt (che io ho chiamato kitt.txt), al cui interno scriveremo quante righe vogliamo per la definizione del dialogo.
buongiorno buongiorno! ciao ciao, a te! chi sei? io sono Kitt! come ti chiami? il mio nome è Kitt! cosa sai fare? posso viaggiare su due ruote, vuoi vedere? si ok, sali a bordo! cosa ti piace fare? mi piace correre e sfrecciare sulla strada! brava Kitt! grazie! ciao ciao! come stai? sto bene grazie, tu come stai? sto bene! ottimo! bene alla grande! bene grazie alla grande, continuiamo? come va? abbastanza bene, mi mancano quegli anni ruggenti, gli anni 80! dove sei? sono in garage
Una volta completato l’elenco di parole e frasi utili allo scopo, possiamo passare allo step successivo.
with open("percorso-del-file-da-inserire/kitt.txt") as f: conversation = f.readlines() trainer = ListTrainer(kittBot) trainer.train(conversation)
La funzione open() ci permette di aprire il file kitt.txt mentre la funzione readlines() ne legge il contenuto. Importanti l’istanza della funzione ListTrainer() e il metodo train(),entrambe adibite a compiti di addestramento del sistema.
Step #6 Siamo arrivati alla fine della prima parte del tutorial. Prepariamo l’avvio di KITT.while True: try: user_input = input("Human: ") bot_response = kittBot.get_response(user_input) print("Kitt: ", bot_response) except(KeyboardInterrupt, EOFError, SystemExit): print("GoodBye!") break
Il ciclo while girerà fintantochè l’utente non lo stoppa oppure fin quando non si genera un errore. Siamo ora davvero pronti a far partire KITT. Avviamo il codice col pulsante RUN o da terminale scrivendo python nomefile.py. Buon divertimento!
Step #7 Se siete arrivati a questo punto del tutorial, già avrete chiacchierato un po’ con KITT dal vostro terminale. Per l’integrazione con con Telegram scriverò il codice nello step successivo.Per plasmare un chatbot telegram dovrete rivolgervi al padrino, BotFather. Botfather non è altro che un bot che vi guida nel dare vita al vostro chatbot.
Una volta avviato, a BotFather dovrete dire di concretizzare la vostra idea attraverso il comando /newbot. Assegnerete quindi un nome al bot e immediatamente il padrino vi fornirà un TOKEN. Questo è l’elemento che vi consentirà di gestire la vostra creazione e che dovrete inserire nel codice riportato di seguito. Il resto è gioco fatto! In ogni caso basterà seguire la documentazione se qualcosa non vi è chiara o per ampliare gli orizzonti dell’opera.
Step #8 Non ci resta che combinare il codice Telegram con quello appena stilato in Python.Iniziamo installando da terminale il modulo telepot, necessario per colloquiare con Telegram:
pip install telepot
Una volta installato telepot passiamo alla stesura del codice: importeremo in aggiunta il modulo time che ci servirà per inserire un ritardo nella risposta del bot (in sedondi); importeremo telepot, il modulo appena installato e ChatterBotCorpusTrainer, che in particolare ci servirà a sfruttare dei dialoghi utili all’addestramento di cui potete avere traccia su GitHub.
import time import telepot from telepot.loop import MessageLoop from chatterbot import ChatBot from chatterbot.trainers import ListTrainer from chatterbot.trainers import ChatterBotCorpusTrainer from chatterbot.response_selection import get_first_response from chatterbot.comparisons import levenshtein_distance def handle(msg): kittBot = ChatBot( "Kitt", storage_adapter="chatterbot.storage.SQLStorageAdapter", database="./db.sqlite3", logic_adapters=[ { 'import_path': "chatterbot.logic.BestMatch", 'statement_comparison_function': levenshtein_distance, 'response_selection_method': get_first_response } ] ) #addestriamo con ulteriori dialoghi trainer = ChatterBotCorpusTrainer(kittBot) trainer.train('chatterbot.corpus.italian') #addestriamo col nostro file testuale with open("/home/ambrix/PycharmProjects/myBOTS/kitt.txt") as f: conversation = f.readlines() trainer = ListTrainer(kittBot) trainer.train(conversation) content_type, chat_type, chat_id = telepot.glance(msg) bot_response = kittBot.get_response(msg['text']) bot.sendMessage(chat_id, str(bot_response)) TOKEN = "qui-inserire-token-generato-da-BotFather" bot = telepot.Bot(TOKEN) MessageLoop(bot, handle).run_as_thread() print('Listening ...') # Col while facciamo girare il programma un numero indefinito di volte while True: time.sleep(1)
Siamo ora davvero arrivati alla fine di questo tutorial dedicato a ChatterBot e Telegram. Non vi resta che provare il tutto. Per qualsiasi dubbio potete scrivermi a angelo.ambrisi@gmail.com, cercherò di rispondervi in tempi brevi!
Ah, dimenticavo KITT è online su Telegram, contattatelo @kitt_supercar_bot
Arrivederci al prossimo tuorial.
<— Telegram Bot con Python e ChatterBot —>