O chatbot que nunca entende: como depurar um modelo de linguagem natural 🐍

Este é um chatbot simples em Python que utiliza PLN para entender as intenções do usuário e fornecer respostas adequadas. O chatbot é treinado com um conjunto de intenções e respostas previamente definidas, e utiliza a similaridade de cosseno para encontrar a intenção mais próxima da entrada do usuário. Além disso, o chatbot utiliza a biblioteca NLTK para realizar a tokenização e a lematização das frases de entrada, e a biblioteca Scikit-Learn para criar um modelo de vetorização das intenções e das frases de entrada do usuário. Este chatbot é uma ótima forma de aprender os fundamentos de PLN e como aplicá-los em um projeto real.

código

import random
import re
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

intents = {
    'greeting': ['hello', 'hi', 'hey'],
    'goodbye': ['bye', 'see you', 'take care'],
    'thanks': ['thank you', 'thanks a lot', 'thanks'],
    'options': ['what can you do?', 'what are your features?', 'features']
}

responses = {
    'greeting': ['Hello!', 'Hi there!', 'Hey!'],
    'goodbye': ['Goodbye!', 'See you!', 'Take care!'],
    'thanks': ['You\'re welcome!', 'No problem!', 'My pleasure!'],
    'options': ['I can chat with you and answer some questions.']
}

def preprocess(text):
    # transforma em minúsculas
    text = text.lower()
    # remove caracteres especiais
    text = re.sub(r'[^\w\s]', '', text)
    return text

vectorizer = CountVectorizer(token_pattern=r'\b\w+\b')
vectorizer.fit([' '.join(intent) for intent in intents.values()])

def get_intent(text, vectorizer):
    text_vect = vectorizer.transform([preprocess(text)])
    intention_vect = vectorizer.transform([' '.join(intent) for intent in intents.values()])
    sim_scores = cosine_similarity(text_vect.toarray(), intention_vect.toarray())
    intention_index = sim_scores.argmax()
    intention = list(intents.keys())[intention_index]
    return intention

print("Hi! I'm a simple chatbot. How can I help you today?")

while True:
    user_message = input('> ').lower()
    if user_message == 'quit':
        print('Bye!')
        break
    intention = get_intent(user_message, vectorizer)
    response = random.choice(responses[intention])
    print(response)

Se alguém tiver alguma sugestão para ajudar a melhorar!