Cómo crear un chatbot inteligente en Python usando la biblioteca de PNL spaCy

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Configuración del entorno
  • Paso 2: Creación del programa meteorológico de la ciudad
  • Paso 3: creación del chatbot
  • Conclusión
  • El autor seleccionó el Fondo de Ayuda COVID-19 para recibir una donación como parte del programa Write for DOnations .

    Introducción

    Interactuar con un software puede ser una tarea abrumadora en casos en los que hay muchas funciones. En algunos casos, realizar acciones similares requiere repetir pasos, como navegar por menús o completar formularios cada vez que se realiza una acción. Los chatbots son asistentes virtuales que ayudan a los usuarios de un sistema de software a acceder a información o realizar acciones sin tener que pasar por largos procesos. Muchos de estos asistentes son conversacionales, lo que proporciona una forma más natural de interactuar con el sistema.

    Para crear un chatbot conversacional, puedes usar plataformas como Dialogflow que te ayudan a diseñar chatbots de alto nivel. O puedes crear uno tú mismo usando una biblioteca como spaCy , que es una biblioteca de procesamiento de lenguaje natural (PLN) rápida y robusta basada en Python. spaCy ofrece funciones útiles como determinar las partes del discurso a las que pertenecen las palabras en una declaración, encontrar qué tan similares son dos declaraciones en cuanto a significado, etc.

    En este tutorial, crearás un chatbot que no solo ayuda a los usuarios a simplificar sus interacciones con un sistema de software, sino que también es lo suficientemente inteligente como para comunicarse con el usuario en lenguaje natural (inglés americano en este tutorial). El chatbot utilizará la API OpenWeather para informar al usuario cuál es el clima actual en cualquier ciudad del mundo, pero puedes implementar tu chatbot para manejar un caso de uso con otra API.

    Prerrequisitos

    Antes de comenzar, necesitarás lo siguiente:

    • Python 3 instalado y un entorno de programación configurado. Puede completar esto para su máquina con uno de los tutoriales Cómo instalar Python 3 y configurar un entorno de programación local .
    • Una clave API para OpenWeather. Visite el sitio web de OpenWeather para crear una cuenta. Asegúrese de confirmar su dirección de correo electrónico. Después de registrarse correctamente, visite la página de claves API para ver la clave API creada automáticamente para su cuenta. Esta clave debe ser una secuencia alfanumérica de caracteres.

    Este tutorial asume que ya estás familiarizado con Python . Si deseas mejorar tus conocimientos sobre Python, consulta nuestra serie Cómo codificar en Python 3. Este tutorial no requiere conocimientos previos sobre procesamiento de lenguaje natural.

    Paso 1: Configuración del entorno

    En este paso, instalará la spaCybiblioteca que ayudará a su chatbot a comprender las oraciones del usuario.

    Una vez que hayas configurado Python siguiendo los requisitos previos , tendrás un entorno virtual. Vamos a activar ese entorno.

    Asegúrate de estar en el directorio donde configuraste tu entorno y luego ejecuta el siguiente comando:

    1. source my_env/bin/activate

    Ahora instala spaCy:

    1. pip install -U spacy

    Por último, descargará un modelo de lenguaje. Los modelos de lenguaje de spaCy son modelos de PNL entrenados previamente que puede utilizar para procesar enunciados y extraer significados. Trabajará con el modelo de lenguaje inglés, por lo que lo descargará.

    Ejecute el siguiente comando:

    1. python -m spacy download en_core_web_md

    Si te encuentras con un error como el siguiente:

    OutputERROR: Failed building wheel for en-core-web-md

    Necesitas instalar wheel:

    1. pip install -U wheel

    A continuación, descargue nuevamente el modelo en inglés.

    Para confirmar que tiene spaCy instalado correctamente, abra el intérprete de Python:

    1. python

    A continuación, importe spaCy y cargue el modelo en idioma inglés:

     import spacy nlp = spacy.load("en_core_web_md")

    Si esas dos declaraciones se ejecutan sin ningún error, entonces tienes spaCy instalado.

    Ahora cierre el intérprete de Python:

     exit()

    Ahora tienes todo lo necesario para empezar a trabajar en el chatbot. En la siguiente sección, crearás un script para consultar la API de OpenWeather sobre el clima actual en una ciudad.

    Paso 2: Creación del programa meteorológico de la ciudad

    En esta sección, creará un script que acepta un nombre de ciudad del usuario, consulta la API de OpenWeather para conocer el clima actual en esa ciudad y muestra la respuesta.

    Primero, crea y abre un archivo Python llamado weather_bot.pycon tu editor preferido:

    1. nano weather_bot.py

    A continuación, creará una función para obtener el clima actual de una ciudad desde la API de OpenWeather. Esta función tomará el nombre de la ciudad como parámetro y devolverá la descripción del clima de la ciudad.

    Añade el siguiente código a tu weather_bot.pyarchivo:

    robot_climatico.py

    import requestsapi_key = "your_api_key"def get_weather(city_name):api_url = "http://api.openweathermap.org/data/2.5/weather?q={}appid={}".format(city_name, api_key)response = requests.get(api_url)response_dict = response.json()    weather = response_dict["weather"][0]["description"]if response.status_code == 200:return weatherelse:print('[!] HTTP {0} calling [{1}]'.format(response.status_code, api_url))return None

    Primero, importa la requestsbiblioteca para poder trabajar con ella y realizar solicitudes HTTP. Asegúrate de reemplazarla your_api_keycon tu propia clave API. La siguiente línea comienza con la definición de la función get_weather()para recuperar el clima de la ciudad especificada.

    En esta función, se construye la URL para la API OpenWeather. Esta URL devuelve la información meteorológica (temperatura, descripción del clima, humedad, etc.) de la ciudad y proporciona el resultado en formato JSON. Después de eso, se realiza una solicitud GET al punto final de la API, se almacena el resultado en una responsevariable y luego se convierte la respuesta a un diccionario de Python para facilitar el acceso.

    En la siguiente línea, extrae solo la descripción del clima en una weathervariable y luego asegúrate de que el código de estado de la respuesta de la API sea 200(lo que significa que no hubo problemas con la solicitud). Finalmente, devuelves la descripción del clima.

    Si hay un problema con la solicitud, el código de estado se imprime en la consola y usted devuelve None.

    Para probar el script, llame a la get_weather()función con una ciudad de su elección (por ejemplo, Londres) e imprima el resultado. Agregue el código resaltado después de la función:

    ~/bot_del_clima.py

    import requestsdef get_weather(city_name):  ...  return weatherweather = get_weather("London")print(weather)

    Guarde y ejecute el script:

    1. python weather_bot.py

    Recibirás un resultado como el siguiente:

    Outputscattered clouds

    Una vez completado esto con éxito, ahora puedes eliminar las dos últimas líneas del script.

    Ábrelo con:

    1. nano weather_bot.py

    Luego borre las dos líneas resaltadas al final del archivo:

    ~/bot_del_clima.py

    import requestsdef get_weather(city_name):  ...  return weatherweather = get_weather("London")print(weather)

    Guarde y cierre el archivo.

    Ahora tienes una función que devuelve la descripción del clima para una ciudad en particular.

    En el siguiente paso, crearás un chatbot capaz de determinar si el usuario desea obtener el clima actual en una ciudad y, de ser así, el chatbot utilizará la get_weather()función para responder adecuadamente.

    Paso 3: creación del chatbot

    En los dos pasos anteriores, instalaste spaCy y creaste una función para obtener el clima en una ciudad específica. Ahora, crearás un chatbot para interactuar con un usuario en lenguaje natural usando el weather_bot.pyscript.

    Escribirás una chatbot()función que compare la declaración del usuario con una declaración que represente la consulta del clima en una ciudad. Para realizar esta comparación, utilizarás el similarity()método spaCy. Este método calcula la similitud semántica de dos declaraciones, es decir, cuán similares son en significado. Esto te ayudará a determinar si el usuario está intentando consultar el clima o no.

    Para comenzar, abra el script:

    1. nano weather_bot.py

    Luego, importe spaCy y cargue el modelo de idioma inglés:

    ~/bot_del_clima.py

    import spacyimport requestsnlp = spacy.load("en_core_web_md"). . .

    Después de la get_weather()función en su archivo, cree una chatbot()función que represente al chatbot que aceptará la declaración de un usuario y devolverá una respuesta.

    Después de la definición, agrega el código resaltado para crear tokens para las dos declaraciones que vas a comparar. Los tokens son los diferentes segmentos significativos de una declaración, como palabras y signos de puntuación. Esto es necesario para permitir que spaCy calcule la similitud semántica:

    ~/bot_del_clima.py

    import spacy. . .def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)

    Aquí las variables weathery statementcontienen tokens spaCy como resultado de pasar cada cadena correspondiente a la nlp()función.

    Guarde y cierre su archivo.

    A continuación, introducirá el similarity()método spaCy en su chatbot()función. El similarity()método calcula la similitud semántica de dos declaraciones como un valor entre 0y 1, donde un número más alto significa una mayor similitud. Debe especificar un valor mínimo que debe tener la similitud para estar seguro de que el usuario desea consultar el clima.

    Por ejemplo, si compruebas la similitud de las afirmaciones 2 y 3 con la afirmación 1 siguiente, obtienes:

    1. El tiempo actual en una ciudad
    2. ¿Qué tiempo hace en Londres? (similitud = 0,86)
    3. Mantequilla de maní y mermelada (similitud = 0,31)

    Para probarlo usted mismo, abra el intérprete de Python:

    1. python

    A continuación, importe spaCy y cargue el modelo en idioma inglés:

     import spacy nlp = spacy.load("en_core_web_md")

    Ahora vamos a crear tokens a partir de las declaraciones 1 y 2:

     statement1 = nlp("Current weather in a city") statement2 = nlp("What is the weather in London?")

    Finalmente, obtengamos la similitud semántica de las dos afirmaciones:

     print(statement1.similarity(statement2))

    Recibirás un resultado como este:

    Output0.8557684354027663

    Si se establece un valor mínimo bajo (por ejemplo, 0,1), el chatbot malinterpretará al usuario y tomará las declaraciones (como la declaración 3) como similares a la declaración 1, lo cual es incorrecto. Si se establece un valor mínimo demasiado alto (como 0,9), se excluirán algunas declaraciones que en realidad son similares a la declaración 1, como la declaración 2.

    Elegiremos arbitrariamente 0,75 para los fines de este tutorial, pero es posible que desees probar valores diferentes cuando trabajes en tu proyecto.

    Agreguemos este valor al script. Primero, abra el archivo:

    1. nano weather_bot.py

    Luego agregue el siguiente código resaltado para introducir el valor mínimo:

    ~/bot_del_clima.py

    import spacy. . .def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)  min_similarity = 0.75

    Ahora, verifique si la similitud de la declaración del usuario con la declaración sobre el clima es mayor o igual que el valor de similitud mínimo que especificó. Agregue la siguiente ifdeclaración resaltada para comprobarlo:

    ~/bot_del_clima.py

    import spacy. . .def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)  min_similarity = 0.75  if weather.similarity(statement) = min_similarity:    pass

    El paso final es extraer la ciudad de la declaración del usuario para poder pasársela a la get_weather()función y recuperar el clima de la llamada API. Agregue el siguiente forbucle resaltado para implementar esto:

    ~/bot_del_clima.py

    import spacy...def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)  min_similarity = 0.75  if weather.similarity(statement) = min_similarity:    for ent in statement.ents:      if ent.label_ == "GPE": # GeoPolitical Entity        city = ent.text        break

    Para ello, utiliza la función de reconocimiento de entidades con nombre de spaCy . Una entidad con nombre es un sustantivo del mundo real que tiene un nombre, como una persona o, en nuestro caso, una ciudad. Quiere extraer el nombre de la ciudad de la declaración del usuario.

    Para extraer el nombre de la ciudad, se obtienen todas las entidades nombradas en la declaración del usuario y se verifica cuál de ellas es una entidad geopolítica (país, estado, ciudad). Para ello, se recorre en bucle todas las entidades que spaCy ha extraído de la declaración en la entspropiedad y, a continuación, se verifica si la etiqueta (o clase) de la entidad es “GPE”, que representa a la entidad geopolítica. Si es así, se guarda el nombre de la entidad (su texto) en una variable llamada city.

    También es necesario capturar los casos en los que no se ingresó ninguna ciudad agregando un elsebloque:

    ~/bot_del_clima.py

    import spacy...def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)  min_similarity = 0.75  if weather.similarity(statement) = min_similarity:    for ent in statement.ents:      if ent.label_ == "GPE": # GeoPolitical Entity        city = ent.text        break      else:        return "You need to tell me a city to check."

    Ahora que tienes la ciudad, puedes llamar a la get_weather()función:

    ~/bot_del_clima.py

    import spacy...def chatbot(statement):  weather = nlp("Current weather in a city")  statement = nlp(statement)  min_similarity = 0.75  if weather.similarity(statement) = min_similarity:    for ent in statement.ents:      if ent.label_ == "GPE": # GeoPolitical Entity        city = ent.text        break      else:        return "You need to tell me a city to check."    city_weather = get_weather(city)    if city_weather is not None:      return "In " + city + ", the current weather is: " + city_weather    else:      return "Something went wrong."  else:    return "Sorry I don't understand that. Please rephrase your statement."

    Recuerde que si la API OpenWeather devuelve un error, se imprime el código de error en la terminal y la get_weather()función devuelve None. En este código, primero se verifica si la get_weather()función devuelve None. Si no lo hace, se devuelve el clima de la ciudad, pero si lo hace, se devuelve una cadena que indica que algo salió mal. El elsebloque final es para manejar el caso en el que el valor de similitud de la declaración del usuario no alcanza el valor umbral. En tal caso, se le pide al usuario que reformule su declaración.

    Una vez completado todo esto, ahora tienes un chatbot capaz de decirle a un usuario de manera conversacional qué tiempo hace en una ciudad. La diferencia entre este bot y los chatbots basados ​​en reglas es que el usuario no tiene que ingresar la misma declaración cada vez. En cambio, puede formular su solicitud de diferentes maneras e incluso cometer errores tipográficos, pero el chatbot aún podría entenderlos gracias a las funciones de procesamiento del lenguaje natural de spaCy.

    Probemos el bot. Llame chatbot()a la función y pase una declaración que pregunte qué tiempo hace en una ciudad, por ejemplo:

    ~/bot_del_clima.py

    import spacy. . .def chatbot(statement):. . .response = chatbot("Is it going to rain in Rome today?")print(response)

    Guarde y cierre el archivo, luego ejecute el script en su terminal:

    1. python3 weather_bot.py

    Recibirá un resultado similar al siguiente:

    OutputIn Rome, the current weather is: clear sky

    Has creado con éxito un chatbot inteligente capaz de responder a solicitudes dinámicas de los usuarios. Puedes probar más ejemplos para descubrir todas las capacidades del bot. Para ello, puedes obtener otros puntos finales de API de OpenWeather y otras fuentes. Otra forma de ampliar el chatbot es hacerlo capaz de responder a más solicitudes de los usuarios. Para ello, puedes comparar la declaración del usuario con más de una opción y encontrar cuál tiene la mayor similitud semántica.

    Conclusión

    Ha creado un chatbot lo suficientemente inteligente como para responder a la declaración de un usuario, incluso cuando este la expresa de distintas maneras. El chatbot utiliza la API OpenWeather para obtener el clima actual en una ciudad especificada por el usuario.

    Para mejorar aún más el chatbot, puedes:

    • Consulta la guía de la API de OpenWeather para conocer otras funciones meteorológicas que puedes agregar.
    • Visita el sitio web de spaCy para ver otras funciones que puedes implementar para hacer que el chatbot sea más inteligente.
    • Mejore su conocimiento del procesamiento del lenguaje natural con nuestro tutorial sobre Cómo trabajar con datos de lenguaje en Python 3 usando el kit de herramientas de lenguaje natural (NLTK) o pruebe el análisis de sentimientos en Cómo realizar análisis de sentimientos en Python 3 usando el kit de herramientas de lenguaje natural (NLTK) .

    Puedes encontrar el código final de este tutorial en este repositorio de DigitalOcean .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion