Telegram Bot con Python e ChatterBot

Scritto da ambrix on . Postato in Corsi Programmazione, Intelligenza Artificiale, Machine Learning, Tecnologia

kitt supercar bot telegram

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 .

In particolare, l’ambizioso obiettivo è di dialogare con KITT, il computer di bordo della leggendaria Supercar guidata da Michael Knight (interpretato da David Hasselhoff).

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).

La Distanza di Levenshtein è un algoritmo che effettua il confronto tra stringhe, ritornando un numero che indica la distanza tra queste (due parole uguali hanno distanza zero).
Step #3 Creeremo quindi il cuore del nostro bot, che nel mio caso ho chiamato KITT.

bot = 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.

KITT può far uso di tutti i database americani per scoprire in breve tempo informazioni su chiunque; può collegarsi a tutte le telecamere di videosorveglianza presenti nelle sue vicinanze per osservare cosa accade; può emettere delle onde radio che fanno inceppare i motori degli autoveicoli.
Step #5  Vedremo ora come aprire e leggere il file conversazione appena creato. Inoltre inizieremo con la fase di training di KITT.

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.

botfather telegram

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 telpot 

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 —>

Per Richieste, Avvisi e Lasciti Ereditari

Disclaimer

I contenuti di questo Blog (testi, immagini, foto, etc.) sono di mia creazione, tranne nei casi dove espressamente indicato.