ANÁLISIS DE LENGUAJE NATURAL (CLASIFICACION DE TEXTO, CHATBOT Y
CONSUMO DE CHATGPT EN PYTHON)
ESTUDIANTE
RONALDO BALLESTEROS SALGUERO
PROFESOR
DR. JESUS EMILI PINTO LOPERA
UNIVERSIDAD DE LA AMAZONIA
FACULTAD DE INGENIERIA
INGENIERIA DE SISTEMAS
FLORENCIA, COLOMBIA
2023
CONTENIDO
INTRODUCCION..................................................................................................................3
METODÓLOGA DE DESARROLLO...................................................................................4
RESULTADOS.....................................................................................................................22
CONCLUSIONES................................................................................................................26
REFERENCIAS....................................................................................................................27
INTRODUCCION
Los modelos de clasificación de texto son técnicas de aprendizaje automático que permiten asignar
una o más categorías a un documento de texto según su contenido. Estos modelos tienen diversas
aplicaciones en el procesamiento del lenguaje natural, como el análisis de sentimientos, la detección
de spam, la extracción de información o la generación de resúmenes 1. Por otro lado, los chatbots
son sistemas interactivos que simulan una conversación humana mediante el uso de voz o texto. Los
chatbots pueden proporcionar información, asistencia o entretenimiento a los usuarios a través de
diferentes canales, como aplicaciones móviles, sitios web o redes sociales 2. El reconocimiento de
voz y audio es el proceso de convertir las señales acústicas en una representación textual o
simbólica que pueda ser interpretada por un sistema informático. Esta tecnología facilita la
comunicación entre los humanos y las máquinas, y habilita el desarrollo de interfaces
conversacionales más naturales y accesibles 3.
En este informe se presentan los resultados de la implementación de dos modelos de clasificación
de texto y un chatbot con reconocimiento de voz y audio para una empresa ficticia. El objetivo es
demostrar las ventajas y los desafíos de estas tecnologías en el ámbito empresarial, así como las
posibles mejoras y recomendaciones para su uso óptimo. El informe se estructura de la siguiente
manera: en la sección 2 se describen los modelos de clasificación de texto utilizados, en la sección 3
se explica el diseño y el funcionamiento del chatbot con reconocimiento de voz y audio, en la
sección 4 se muestran los resultados obtenidos y se evalúa su rendimiento, y en la sección 5 se
presentan las conclusiones y las sugerencias para trabajos futuros.
METODÓLOGA DE DESARROLLO
CÓDIGO CLASIFICACIÓN DE TEXTO
La línea de código pip install nltk se utiliza para instalar la librería Natural Language Toolkit
(NLTK) en Python, como se observa en la ilustración 1.
Ilustración 1
La línea de código python -m spacy download en_core_web_sm se utiliza para descargar el modelo
en_core_web_sm de la librería Spacy, como se observa en la ilustración 2.
Ilustración 2
La línea de código import nltk importa la librería Natural Language Toolkit (NLTK) en el código de
Python.
La siguiente línea [Link]() abre una ventana en la que se pueden descargar y actualizar los
paquetes y recursos de datos de NLTK, como corpus, modelos, etc.
La última línea from matplotlib import pyplot as plt importa el módulo pyplot de la librería
Matplotlib en el código de Python, como se observa en la ilustración 3.
Ilustración 3
La primera línea importa el módulo [Link] de Python, que se utiliza para abrir URLs y leer
su contenido.
[Link] se utiliza para abrir una conexión a la URL especificada (en este caso, la
página de documentación de Amazon RDS) y leer su contenido en la variable html.
La línea from bs4 import BeautifulSoup importa el módulo BeautifulSoup, que se utiliza para
analizar y extraer datos de documentos HTML y XML.
BeautifulSoup se utiliza para crear un objeto "sopa" a partir de la cadena html. El parámetro
"html5lib" se utiliza como argumento para decirle a BeautifulSoup qué parser debe usar para
analizar la página web.
soup.get_text() se utiliza para extraer el texto de la página web (ignorando el HTML y otros
elementos de formato) y almacenarlo en la variable text.
A continuación, se utiliza la librería nltk para tokenizar el texto. La función word_tokenize() se
utiliza para dividir el texto en palabras (tokens) individuales, utilizando el idioma inglés (english)
como argumento. Los tokens se almacenan en la variable tokens.
Finalmente, se realiza un proceso de limpieza en los tokens. Primero, se convierten todas las
palabras en minúsculas con [Link](). Luego, se eliminan los tokens que no son palabras (if
[Link]()), lo que elimina signos de puntuación y otros caracteres que no son letras.
La última línea simplemente imprime todos los tokens limpios en la consola, como se observa en
la ilustración 4.
Ilustración 4
La primera línea, freq = [Link](tokens), crea un objeto FreqDist a partir de una lista
de tokens previamente creada. Este objeto contiene un diccionario que almacena la
frecuencia de cada palabra en el texto.
La segunda línea, for word, value in [Link]():, establece un bucle for para iterar a través
de cada clave-valor del objeto FreqDist.
La tercera línea, print(str(word) + ' : ' + str(value)), imprime en la consola la palabra y su
frecuencia correspondiente. La expresión str(word) + ' : ' + str(value) se utiliza para
concatenar la palabra y su frecuencia en una sola cadena de texto que se imprime, como se
observa en la ilustración 5.
Ilustración 5
La primera línea, [Link]("Gráfico inicial"), establece el título del gráfico.
La segunda línea, [Link](30, cumulative=False), llama al método plot() del objeto
FreqDist creado previamente. El primer argumento, 30, indica que se mostrarán los 30
tokens más comunes en el gráfico. El segundo argumento, cumulative=False, se utiliza para
especificar que el gráfico no muestre una distribución acumulada.
La tercera línea, [Link](), muestra el gráfico generado, como se observa en la ilustración
6.
Ilustración 6
Estas líneas de código se encargan de realizar el primer filtro para limpiar la lista de tokens.
Primero, se hace una copia de la lista original de tokens, para no modificarla directamente.
Luego, se importa la lista de palabras de parada (stopwords) de la biblioteca NLTK y se
crea un bucle para recorrer cada token en la lista de tokens originales. Si el token está
presente en la lista de palabras de parada en inglés, entonces se elimina de la lista de tokens
limpios. Finalmente, se imprime la lista de tokens limpios resultante, que es la lista original
de tokens sin las palabras de parada, como se observa en la ilustración 7.
Ilustración 7
Estas líneas de código calculan la frecuencia de cada token en la lista de tokens_limpios, la
cual ha sido filtrada para eliminar las palabras de parada. La función [Link]() crea un
objeto de frecuencia que cuenta la cantidad de veces que aparece cada token en la lista
tokens_limpios. El bucle for itera sobre este objeto y para cada token, imprime la palabra y
su frecuencia en la lista de tokens limpios. En resumen, estas líneas de código muestran la
frecuencia de cada palabra en la lista de tokens limpios después de haber aplicado el filtro
N°1 para eliminar las palabras de parada, como se observa en la ilustración 8.
Ilustración 8
Estas líneas de código generan un gráfico de barras que muestra la frecuencia de los tokens
limpios después de aplicar el filtro N°1, que consiste en eliminar las palabras de parada o
stopwords en inglés. El título del gráfico es "Gráfico con filtro N°1". Se utiliza la biblioteca
Matplotlib para generar el gráfico, y la función plot() de FreqDist para mostrar la
distribución de frecuencias de los tokens limpios. Los parámetros "30" y
"cumulative=False" indican que se muestran las 30 palabras más comunes en orden de
frecuencia y que la gráfica no es acumulativa. Finalmente, la función show() de Matplotlib
muestra el gráfico generado, como se observa en la ilustración 9.
Ilustración 9
Estas líneas de código están aplicando un segundo filtro para limpiar aún más la lista de
tokens. Este filtro se enfoca en reemplazar sinónimos con la palabra principal
correspondiente para evitar que se cuente dos veces para la misma palabra.
Primero se definen los sinónimos que se van a reemplazar para cada palabra objetivo. Por
ejemplo, para la palabra "database", los sinónimos son "database" y "db". Luego, se utiliza
un bucle "for" para recorrer cada uno de los sinónimos definidos y se reemplazan en la lista
de tokens limpios utilizando el método "replace()" de Python. Este proceso se repite para
cada palabra objetivo y sus sinónimos.
Finalmente, se recalcula la frecuencia de cada palabra en la lista de tokens limpios con
sinónimos reemplazados y se muestra el resultado con un bucle "for" que imprime la
palabra y su frecuencia, como se observa en la ilustración 10.
Ilustración 10
Estas líneas de código crean un gráfico que muestra la frecuencia de los tokens limpios
después de aplicar el segundo filtro, que consiste en reemplazar sinónimos de algunas
palabras clave. Primero, se establecen las listas de sinónimos para cada palabra clave, y
luego se reemplazan en la lista de tokens limpios utilizando un bucle for. Luego se crea una
nueva FreqDist y se muestra la frecuencia de cada palabra. Finalmente, se genera un gráfico
con el método plot() y se muestra con el método show(). El gráfico muestra las 25 palabras
más frecuentes en orden descendente en el eje y y la frecuencia de cada palabra en el eje x.
Este gráfico puede ayudar a visualizar mejor la distribución de frecuencias de los tokens
después de aplicar el segundo filtro y puede proporcionar información útil para analizar el
texto, como se observa en la ilustración 11.
Ilustración 11
Estas líneas de código utilizan la biblioteca spaCy para realizar la lematización de los
tokens de un texto previamente filtrado. La lematización es un proceso de normalización de
palabras que consiste en transformar las palabras a su forma base o lema, eliminando la
flexión gramatical.
Primero, se carga el modelo pre-entrenado 'en_core_web_sm' de spaCy para el idioma
inglés. Luego, se unen todos los tokens limpios filtrados anteriormente en una cadena y se
procesan mediante el modelo cargado. Se recorre cada token de la cadena procesada y se
imprimen en pantalla el texto, el lema y la categoría gramatical de cada token. Finalmente,
se agregan los lemas de los tokens a una nueva lista llamada "sin_tokens_limpios_lem",
como se observa en la ilustración 12.
Ilustración 12
En estas líneas de código, se usa la biblioteca Spacy para realizar la lematización. Primero
se carga el modelo 'en_core_web_sm', que es un modelo pre-entrenado para el idioma
inglés. Luego, se convierten los tokens limpios a una cadena de texto separada por
espacios, para que puedan ser procesados por Spacy. Después, se procesa la cadena de texto
con Spacy y se recorre cada token para obtener su lema y su parte del discurso (POS, por
sus siglas en inglés).
Finalmente, se crea una nueva lista llamada "sin_tokens_limpios_lem" que contiene los
lemas de cada token. Se calcula la frecuencia de estos lemas usando [Link]() y se
imprime en la consola con un bucle for, como se observa en la ilustración 13.
Ilustración 13
Estas líneas de código grafican la frecuencia de los tokens limpios y lematizados en un
gráfico de barras, utilizando la librería Matplotlib de Python. El título del gráfico indica que
se está utilizando el "Filtro N°3", que corresponde a la lematización de los tokens.
El comando freq_limpia_sin_lem.plot(20, cumulative=False) muestra el gráfico con los 20
tokens más frecuentes en el texto analizado, sin la opción de acumulación. Es decir, cada
barra representa la frecuencia de un único token y no se suman las frecuencias de los tokens
anteriores.
Finalmente, el comando [Link]() muestra el gráfico, como se observa en la ilustración 14.
Ilustración 14
Estas líneas de código definen el "filtro N°4" para el análisis de texto, que se enfoca en la reducción
de las palabras a su raíz, utilizando el método SnowballStemmer de la biblioteca NLTK.
La línea from [Link] import SnowballStemmer importa el objeto SnowballStemmer de la
biblioteca NLTK.
Luego, la variable stemmer es definida como un objeto SnowballStemmer, que se inicializa con el
idioma "english".
La siguiente línea aplica el método stem del objeto stemmer a cada token en la lista
sin_tokens_limpios_lem. Este método reduce cada palabra a su raíz (también llamada "forma
básica"), lo que puede ayudar a reducir la variabilidad y a normalizar el texto para su posterior
análisis.
Finalmente, se calcula la frecuencia de las palabras raíz usando [Link](), y se imprime cada
palabra raíz junto con su frecuencia en el corpus de texto, como se observa en la ilustración 15.
Ilustración 15
[Link]("Gráfico con filtro N°4"): Esta línea establece el título del gráfico como "Gráfico
con filtro N°4".
freq_limpia_sin_lem_stem.plot(15, cumulative=False): Esta línea dibuja el gráfico
utilizando los datos en el objeto freq_limpia_sin_lem_stem. Los parámetros 15 y
cumulative=False especifican que se deben mostrar los 15 elementos más frecuentes y que
el gráfico no debe ser acumulativo, respectivamente.
[Link](): Esta línea muestra el gráfico en una ventana separada. Es importante incluir esta
línea para que se muestre el gráfico generado en la pantalla, como se observa en la
ilustración 16.
Ilustración 16
CÓDIGO CHATBOT
El comando "pip install nltk" instala la biblioteca NLTK y todas sus dependencias necesarias en el
entorno de Python local. La biblioteca NLTK es una herramienta muy útil para el procesamiento del
lenguaje natural (NLP) y se utiliza para realizar diversas tareas, como tokenización de texto, análisis
de sentimiento, etiquetado de partes del discurso, entre otras, como se observa en la ilustración 17.
Ilustración 17
El comando "pip install pyttsx3" instala la biblioteca Pyttsx3 y todas sus dependencias necesarias en
el entorno de Python local. La biblioteca Pyttsx3 es una herramienta muy útil para la síntesis de voz
en Python, lo que permite a los desarrolladores agregar características de texto a voz a sus
aplicaciones, como se observa en la ilustración 18.
Ilustración 18
El comando "pip install SpeechRecognition" instala la biblioteca SpeechRecognition y todas sus
dependencias necesarias en el entorno de Python local. La biblioteca SpeechRecognition es una
herramienta muy útil para el reconocimiento de voz en Python, lo que permite a los desarrolladores
agregar características de voz a texto a sus aplicaciones, como se observa en la ilustración 19.
Ilustración 19
El comando "pip install pyaudio" instala la biblioteca PyAudio y todas sus dependencias necesarias
en el entorno de Python local. La biblioteca PyAudio es una herramienta muy útil para el
procesamiento de audio en Python, lo que permite a los desarrolladores trabajar con audio en
tiempo real, grabar sonidos y reproducir archivos de audio, como se observa en la ilustración 20.
Ilustración 20
La primera línea de código importa la biblioteca "nltk" en Python, que es una herramienta muy útil
para el procesamiento de lenguaje natural. La segunda línea de código ejecuta la función
"[Link]()", que descarga e instala los recursos necesarios de la biblioteca nltk en el sistema
local.
La tercera línea de código importa la biblioteca "numpy" en Python, que es una herramienta muy
útil para el procesamiento numérico en Python. La cuarta línea de código importa el paquete
"random" de Python, que se utiliza comúnmente para generar números aleatorios. La quinta línea de
código importa el paquete "string" de Python, que proporciona una serie de funciones y constantes
útiles para trabajar con cadenas de texto en Python.
Una vez que estas bibliotecas y paquetes se han importado en el script de Python, se pueden utilizar
en el código para realizar diversas tareas de procesamiento de lenguaje natural y generación de
texto, como por ejemplo la creación de modelos de lenguaje, la generación de texto aleatorio y la
manipulación de cadenas de texto, como se observa en la ilustración 21.
Ilustración 21
La primera línea de código define una variable "f" y utiliza la función "open()" de Python para abrir
un archivo de texto llamado "[Link]" en la ruta "C:\Users\simif\OneDrive\Desktop\compua\
TERCER TRABAJO". El segundo parámetro indica que se va a abrir el archivo en modo lectura
("r"), y el tercer parámetro "errors='ignore'" especifica que cualquier error de codificación
encontrado en el archivo será ignorado.
La segunda línea de código lee el contenido del archivo de texto en la variable "raw" utilizando el
método "read()" de Python. El resultado es que se obtiene todo el contenido del archivo de texto
como una cadena de texto en bruto.
Una vez que se ha leído el corpus de texto en bruto en Python, se puede utilizar la biblioteca nltk o
cualquier otra herramienta de procesamiento de lenguaje natural para realizar diversas tareas, como
el preprocesamiento de texto, la creación de modelos de lenguaje, la extracción de información y la
generación de texto, como se observa en la ilustración 22.
Ilustración 22
La primera línea de código convierte todo el contenido del corpus de texto a minúsculas utilizando
el método "lower()" de Python. Esto se hace para asegurarse de que todas las palabras se traten
como minúsculas y se eviten problemas al procesar el texto.
Las siguientes dos líneas de código descargan dos recursos importantes de la biblioteca nltk en
Python: el tokenizador de oraciones y el lematizador de palabras. Estas herramientas se utilizan para
convertir el corpus de texto en bruto en una lista de oraciones y una lista de palabras, lo que facilita
su procesamiento posterior.
Las siguientes líneas de código utilizan el tokenizador de oraciones y el tokenizador de palabras de
la biblioteca nltk para convertir el corpus de texto en bruto en una lista de oraciones y una lista de
palabras. La función "sent_tokenize()" se utiliza para convertir el corpus en una lista de oraciones y
la función "word_tokenize()" se utiliza para convertir cada oración en una lista de palabras.
El siguiente bloque de código define una función de lematización que utiliza el lematizador de
palabras de la biblioteca nltk para reducir cada palabra en la lista de palabras a su forma base o
lema. La función "LemTokens()" se utiliza para aplicar el lematizador a cada palabra en la lista de
palabras.
El siguiente bloque de código define un diccionario que se utiliza para eliminar los signos de
puntuación del corpus de texto utilizando la función "translate()" de Python. La función
"LemNormalize()" utiliza la función "translate()" para eliminar los signos de puntuación del texto,
convertirlo a minúsculas y aplicar la función "LemTokens()" para lematizar cada palabra en el texto,
como se observa en la ilustración 23.
Ilustración 23
En resumen, la función toma la entrada del usuario en forma de mensaje de texto (user_response),
lo agrega a la lista de sentencias del corpus (sent_tokens), y luego realiza un análisis de similitud de
coseno entre el mensaje del usuario y el corpus para determinar qué sentencia del corpus es la más
similar al mensaje del usuario.
La función utiliza la técnica TF-IDF (frecuencia de término-inversa de frecuencia de documento)
para representar cada sentencia en el corpus y el mensaje del usuario como vectores numéricos, y
luego mide la similitud entre los vectores utilizando la similitud del coseno.
Una vez que se determina la sentencia más similar, se devuelve como respuesta (chatbot_response)
y se habla utilizando la función hablar () que utiliza la biblioteca pyttsx3 para sintetizar voz y hablar
la respuesta. Si no se encuentra una similitud significativa, se devuelve una respuesta
predeterminada ("Perdón, no entiendo tu mensaje"), como se observa en la ilustración 24.
Ilustración 24
Estas líneas de código definen una lista de posibles mensajes de saludo de entrada
(SALUDOS_INPUTS) y una lista correspondiente de posibles respuestas de saludo de salida
(SALUDOS_OUTPUTS). Luego, la función "saludos" recibe una oración y verifica si alguna de las
palabras de la oración coincide con una de las palabras de la lista de saludos de entrada. Si se
encuentra una coincidencia, se devuelve una de las respuestas de saludo de salida al azar. Esta
función se utiliza para proporcionar una respuesta predefinida a los mensajes de saludo de los
usuarios, como se observa en la ilustración 25.
Ilustración 25
Estas líneas de código implementan un chatbot de voz utilizando la librería SpeechRecognition en
Python. El chatbot responde a preguntas sobre el servicio RDS en AWS y también incluye una
función de saludos.
La librería SpeechRecognition se utiliza para reconocer el audio del usuario y convertirlo en texto.
El micrófono se ajusta a los niveles de ruido del entorno antes de empezar a grabar. El texto se
convierte a minúsculas para poder ser comparado con los valores de entrada del chatbot.
El chatbot también incluye una función de salida para el usuario cuando decida salir del chat.
Además, hay una respuesta de cortesía para cuando el usuario agradece al chatbot.
Cuando el usuario no usa una frase de saludo o de agradecimiento, se utiliza la función
"response(user_response)" para determinar la respuesta del chatbot. La función "saludos(sentence)"
se utiliza para identificar y responder a las frases de saludo, como se observa en la ilustración 26.
Ilustración 26
CÓDIGO CONSUMO DE CHATGPT EN PYTHON
Esta línea de código está instalando el paquete de Python "openai" en el entorno de Python. OpenAI
es una empresa de investigación en inteligencia artificial que proporciona una API para el acceso a
modelos de lenguaje avanzados y otros recursos de aprendizaje automático. Al instalar este paquete,
se puede acceder a la API de OpenAI desde el código de Python y utilizarla para desarrollar
aplicaciones basadas en inteligencia artificial, como se observa en la ilustración 27.
Ilustración 27
Estas líneas de código realizan una búsqueda en Internet usando OpenAI. Primero se importa la
biblioteca OpenAI y se establece una clave de API. Luego se define una función llamada "buscar"
que toma un argumento de texto, crea un prompt usando ese texto, llama al modelo de lenguaje
GPT-3 de OpenAI para generar una respuesta basada en el prompt, y devuelve la respuesta.
La función utiliza el modelo "davinci" de OpenAI y establece algunos parámetros como el número
máximo de tokens en la respuesta, la cantidad de respuestas para generar, la temperatura de
generación y una condición de detención (stop) opcional.
Finalmente, el programa solicita al usuario que ingrese una consulta de búsqueda y llama a la
función "buscar" con esa consulta, y luego muestra la respuesta generada por el modelo de OpenAI
en la consola, como se observa en la ilustración 28.
Ilustración 28
RESULTADOS
Clasificación de texto
La figura número 1 muestra un listado de los treinta términos más frecuentes, en el cual se
puede notar que entre las palabras principales se incluyen conectores y otras palabras que
no tienen una relevancia significativa en la temática, tales como "the", "you" y "and".
Figura 1
En la segunda figura se muestra una lista actualizada de tokens más relevantes, en la que se
han eliminado las palabras que no aportan valor. Se puede apreciar que las palabras más
destacadas son "amazon", "rds", "db" e "instances".
Figura 2
La tercera figura muestra un top de tokens mejor organizado y con valores más altos debido
a la aplicación de sinónimos. Ahora, los tokens más relevantes son "aws", "database" y
"rds".
Figura 3
En la cuarta figura se muestran los resultados obtenidos después de aplicar el filtro de
raíces de palabras. En este gráfico se pueden destacar términos relevantes como "aw",
"databas", "rd" e "instanc".
Figura 4
CHATBOT ENTRADA Y SALIDA DE AUDIO.
Durante la Ilustración 29 se logró tener una interacción exitosa con el Chatbot. El proceso comenzó
con un saludo al BOT utilizando la palabra "Hola", seguido de una pregunta acerca de qué es
Amazon RDS. Posteriormente, se preguntó acerca de las características que proporciona, qué
motores utiliza y sobre la seguridad del servicio. En algunos casos, fue necesario repetir la pregunta
debido a problemas con la calidad del audio. Finalmente, se agradeció al BOT y se utilizó la palabra
"Salir" para finalizar la interacción de manera satisfactoria.
Ilustración 29
CONSUMO DE CHATGPT EN PYTHON
En la ilustración 30 observamos el resultado a la pregunta que se le realizo, donde obtenemos una
lista de las razas más populares en España.
Ilustración 30
CONCLUSIONES
Después de analizar las gráficas generadas por el código de clasificación de texto, se llegó a
la conclusión de que la palabra "AWS" es la más frecuente. A partir de este análisis, se pudo
determinar que esta palabra está directamente relacionada con el tema principal de la
página seleccionada para este ejercicio.
El sistema de reconocimiento de voz logra aislar eficazmente la voz del usuario para evitar
interferencias externas. Sin embargo, es importante que el usuario tenga una buena
pronunciación al realizar una pregunta utilizando este método.
REFERENCIAS
1 A. Aggarwal and P. S. Grover, “A survey of text classification algorithms,” International
Journal of Emerging Technologies in Computational and Applied Sciences (IJETCAS), vol.
10, no. 2, pp. 19-24, May-August 2013.
2 A. Radziwill and M. C. Benton, “Evaluating quality of chatbots and intelligent
conversational agents,” arXiv preprint arXiv:1704.04579, 2017.
3 X. Huang, J. Baker and R. Reddy, “A historical perspective of speech recognition,”
Communications of the ACM, vol. 57, no. 1, pp. 94-103, January 2014.