Chatterbot: creare un chatbot in python

I chatbot sono una tecnologia che permette di automatizzare l'interazione con gli utenti. Sfruttando le ultime tecnologie di intelligenza artificiale le conversazioni risultano sempre più reali. Esempi di evoluzioni dei chatbots sono gli assistenti virtuali come Alexa, Cortana e Siri. Scopriamo come è possibile sviluppare un semplice chatbot in Python mediante la libreria Chatterbot.

Share

Reading time: 6 minutes

Negli ultimi anni, i chatbot sono diventati molto popolari in molti settori. Ad esempio, molti siti e-commerce integrano i chatbot per fornire informazioni ai clienti relativamente ai prodotti per migliorare la loro esperienza d’acquisto. Vengono anche utilizzati per fornire assistenza tecnica per problemi legati all’utilizzo di software e/o servizi.

Ma cosa è un chatbot? Un chatbot è un software  progettato per interagire con gli esseri umani mediante il linguaggio naturale. L’utente, digitando o registrando un messaggio, può richiedere alcune informazioni senza doversi preoccupare di compilare forms o utilizzare interfacce complesse. I bot vengono sviluppati in modo tale che imitino il linguaggio umano e simulare delle vere e proprie conversazioni.

In questo articolo, impareremo come sviluppare un semplice chatbot in Python. Prima però di addentrarci nel codice, bisogna fare una piccola premessa sui chatbot per comprenderli al meglio. 

Storia

Il primo chatbot risale al 1966 quando Joseph Weizenbaum creò ELIZA che poteva imitare il linguaggio di uno psicoterapeuta in sole 200 righe di codice. Utilizzava un semplice pattern matching e un meccanismo di risposta basato su template. La sua capacità di conversazione era limitata, ma per quei tempi dava l’impressione agli utenti di conversare con un altro utente e non con una macchina. Quel primo esperimento fu l’inizio dello sviluppo dei chatbots.

Dopo di esso possiamo citare PARRY, sviluppato nel 1972, e ALICE che vinse il Premio Loebner nei primi anni 2000. Quest’ultimo si basava su un semplice algoritmo di pattern-matching sviluppato mediante l’Artificial Intelligence Markup Language (AIML), che permetteva agli sviluppatori di definire i blocchi di costruzione della conoscenza del chatbot.

Negli ultimi anni, i grandi colossi del settore IT hanno investito considerevoli risorse nello sviluppo di chabots sempre più evoluti fino alla creazione degli assistenti virtuali. Quest’ultimi non si basano solo sulla digitazione del testo, ma sfruttano anche algoritmi di riconoscimento vocale per catturare le richieste dell’utente. Tra gli assistenti virtuali più famosi non possiamo citare Apple Siri, Microsoft Cortana, Amazon Alexa e Google Assistant.

Tipologie di chatbot

La classificazione dei chatbot avviene in base a differenti parametri tra cui il dominio della conoscenza, il servizio fornito, gli obiettivi e il metodo di elaborazione degli input e/o di generazione della risposta.

Ad esempio, la classificazione basata sul dominio della conoscenza distingue i chatbot in base al contesto di dati su cui opera. I chatbot appartenenti ad un dominio aperto possono parlare di argomenti generali, mentre quelli di dominio chiuso sono focalizzati su un particolare dominio di conoscenza.

Differentemente, se si considera l’obiettivo possiamo individuare le seguenti categorie:

  • Informativi: sono progettati per fornire all’utente informazioni che sono memorizzate in anticipo o sono disponibili da una fonte fissa, come i chatbot FAQ.
  • Chat-based/Conversational: parlano con l’utente, come un altro essere umano, e il loro obiettivo è quello di rispondere correttamente alla frase che gli è stata data.
  • Task-based: eseguono un compito specifico, come prenotare un volo o aiutare qualcuno. 

Infine, se si considera il metodo di elaborazione degli input e di generazione delle risposte, possiamo identificare tre modelli:

  • Regole
  • Interrogazione
  • Generativo

L’approccio basato su regole istruisce un chatbot a rispondere alle domande sulla base di una serie di regole. La complessità delle regole può variare in base al contesto e sono basate sul riconoscimento della forma lessicale del testo in ingresso. La conoscenza utilizzata è umanamente codificata a mano ed è rappresentata mediante modelli di conversazione. 

Essendo un modello semplice, può essere facilmente utilizzato e implementato per strumenti di supporto tecnico.  Tuttavia, questo modello ha delle limitazioni. Ad esempio, non è robusto agli errori ortografici e grammaticali nell’input dell’utente. Inoltre, la selezione della risposta considera, di solito, solo l’ultimo messaggio inserito e non il contesto dell’intera conversazione.

Diversamente, il modello basato sulle interrogazioni offre più flessibilità in quanto analizza le risorse disponibili mediante API. Il chatbot, infatti, recupera alcune risposte candidate da un indice prima di applicare l’approccio di corrispondenza per la selezione della risposta più appropriata.

Infine, il modello generativo si basa su algoritmi di intelligenza artificiale e deep learning. Le risposte che genera sono di solito migliori rispetto ai modelli precedenti, ma pone alcune difficoltà specialmente legate alle fase di apprendimento dei modelli. 

Chatterbot

ChatterBot è una libreria Python progettata per fornire risposte automatiche. Utilizza una combinazione di algoritmi di Machine Learning (ML) per generare tipi diversi di risposte. In questo modo gli sviluppatori possono costruire chatbot per automatizzare le conversazioni con gli utenti sfruttando l’intelligenza artificiale al fine di fornire una migliore user-experience. 

Qual’è il suo funzionamento?

Quando un utente inserisce un input specifico nel chatbot, il bot salva l’input insieme alla risposta, per uso futuro. Questi dati permettono al chatbot di generare risposte automatiche ogni volta che un nuovo input viene inserito.

Il programma sceglie la risposta più adatta dall’affermazione più vicina che corrisponde all’input, e poi fornisce una risposta dalla selezione già nota di affermazioni e risposte. Nel tempo, man mano che il chatbot ha più interazioni, la precisione della risposta migliora. Di seguito riportiamo il diagramma del flusso delle operazioni alla base della libreria. 

Sviluppo del chatbot

Il chatbot di solito viene integrato in un’applicazione più grande come un sito web o un’app. In questo articolo non tratteremo le varie tipologie di integrazione, ma illustreremo solo come creare il core del chatbot. Per questo esempio vi consigliamo di crearvi il vostro ambiente di sviluppo mediante pipenv. In questo modo installerete solo le librerie necessarie per il vostro progetto in un workspace dedicato e non a livello di sistema operativo.

Per costruire un chatbot, è necessario ricordare che si analizzeranno dati testuali. Pertanto, quando si lavora con questa tipologia di dato è necessario eseguire una pre-elaborazione prima di poterli utilizzare in qualsiasi modello di Machine Learning. Ad esempio, la tokenizzazione aiuta a frammentare il testo in pezzi più piccoli e leggibili, le parole, mentre lo stemming riduce alla radice le forme flesse di una parola.

Installazione

Come detto in precedenza, vi consigliamo di creare in vostro ambiente di sviluppo con pipenv. A questo punto potete installare la libreria digitando i seguenti comandi.

pip install chatterbot
pip install chatterbot_corpus 

Nel caso voleste aggiornarli potete utilizzare i comandi:

pip install --upgrade chatterbot_corpus
pip install --upgrade chatterbot 

Importazione libreria

Potete utilizzare la shel di python o ipython per i prossimi step. Diversamente potete creare un file .py in cui scriverete il codice del vostro chatbot.

In ogni caso, è necessario importare due classi: ChatBot da chatterbot e ListTrainer da chatterbot.trainers. Per fare questo, è possibile eseguire il seguente comando:

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer 

Creazione e addestramento del chatbot

Il chatbot sarà un’istanza della classe ChatBot. Dopo aver creato una nuova istanza di ChatterBot, è possibile addestrare il bot per migliorare le sue prestazioni. L’addestramento assicura che il bot abbia abbastanza conoscenze per iniziare con risposte specifiche a input specifici. I comandi da eseguire sono i seguenti.

my_bot = ChatBot(name='PyBot', read_only=True,
                 logic_adapters=['chatterbot.logic.MathematicalEvaluation',
                                 'chatterbot.logic.BestMatch']) 

L’unico argomento richiesto è il nome. Se si vuole disabilitare la capacità del bot di imparare dopo l’addestramento (cioè dalle conversazioni reali) è necessario inserire il parametro read_only=True. Il parametro logic_adapters indica la lista degli adattatori usati per addestrare il bot. Ne esistono diversi forniti da chatterbot, tra cui chatterbot.logic.MathematicalEvaluation che permette al bot di risolvere problemi matematici, e chatterbot.logic.BestMatch che sceglie la migliore corrispondenza tra le risposte già fornite.

Dal momento che vogliamo usare il BestMatch, è necessario fornire una lista di risposte. Si può farlo specificando le liste di stringhe che verranno successivamente utilizzate sia per addestrare il chatbot che per trovare la migliore corrispondenza per ogni query. Ecco un esempio di risposte:

small_talk = ['hi there!',
              'hi!',
              'how do you do?',
              'how are you?',
              'i\'m cool.',
              'fine, you?',
              'always cool.',
              'i\'m ok',
              'glad to hear that.',
              'i\'m fine',
              'glad to hear that.',
              'i feel awesome',
              'excellent, glad to hear that.',
              'not so good',
              'sorry to hear that.',
              'what\'s your name?',
              'i\'m pybot. ask me a math question, please.']
math_talk_1 = ['pythagorean theorem',
               'a squared plus b squared equals c squared.']
math_talk_2 = ['law of cosines',
               'c**2 = a**2 + b**2 - 2 * a * b * cos(gamma)'] 

Possiamo a questo punto creare e addestrare il bot utilizzando un’istanza di ListTrainer e fornendogli le liste di stringhe definite in precedenza.

list_trainer = ListTrainer(my_bot)
for item in (small_talk, math_talk_1, math_talk_2):
    list_trainer.train(item) 

Il bot è a questo punto addestrato e pronto a comunicare.

Comunicare con il bot

Per interagire con il chatbot, potete usare la funzione .get_response(). Di seguito è riportato un esempio di comunicazione nella shell di python.

>>> print(my_bot.get_response("hi"))
how do you do?

>>> print(my_bot.get_response("i feel awesome today"))
excellent, glad to hear that.

>>> print(my_bot.get_response("what's your name?"))
i'm pybot. ask me a math question, please.

>>> print(my_bot.get_response("show me the pythagorean theorem"))
a squared plus b squared equals c squared.

>>> print(my_bot.get_response("do you know the law of cosines?"))
c**2 = a**2 + b**2 - 2 * a * b * cos(gamma) 

Tuttavia, è essenziale capire che il chatbot potrebbe non sapere come rispondere a tutte le vostre domande. Infatti la sua conoscenza sono molto limitate. Bisogna dargli tempo e fornire più dati per addestrarlo e migliorare di conseguenza le sue performance.

Addestrare il chatbot con un corpus

Per fornire più dati al chatbot è possibile sia usare dei propri dati che un corpus esistente. In quest’ultimo caso, è possibile utilizzare il corpus fornito direttamente da chatterbot. ChatterBot offre questa funzionalità in diverse lingue. Quindi, potete anche specificare un sottoinsieme di un corpus in una lingua che preferite. Ecco come addestrare il chatbot usando il corpus esistente.

from chatterbot.trainers import ChatterBotCorpusTrainer

corpus_trainer = ChatterBotCorpusTrainer(my_bot)
corpus_trainer.train('chatterbot.corpus.english') 

Conclusioni

Quello che abbiamo illustrato in questo articolo è solo uno dei tanti modi di fare un chatbot in Python. E’ possibile anche usare NLTK, un’altra libreria Python piena di risorse per creare un chatbot Python. Esistono diverse altre soluzioni. Se volete approfondire l’argomento sui chatbot vi consiglio di leggere gli articoli su chatbotslife.

Letture consigliate

More To Explore

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte2]

Gradio è una libraria python che ci permette di creare applicazioni web in modo veloce e intuitivo per i nostri modelli di machine learning e AI. Le nostre applicazioni richiedono sempre un’interazione con l’utente e una personalizzazione del layout. Scopriamo, mediante degli esempi, come migliorare le nostre applicazioni.

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte1]

Scrivere applicazioni web per i nostri modelli di machine learning e/o di intelligenza artificiale può richiedere molto tempo e competenze che non sono in nostro possesso. Per snellire e velocizzare questo compito ci viene in aiuto Gradio, una libreria Python pensata per creare applicazioni web con poche righe di codice. Scopriamo le sue funzionalità base con alcuni esempi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!