Chatbot en python que aprende interactiva y masivamente.

Hola a todos, que tengan una Feliz Navidad.




Hace tiempo que no escribo en el blog y ahora que tengo tiempo les contare en que ando.


Bueno el hecho es que estoy aprendiendo python, a través un curso del Servicio Nacional de Capacitación y Educación SENCE y también por uno en Udemy.

 Aun así no hay mas que practicas básicas así que asumí la tarea de hacer algo mas interesante para avanzar en el uso del lenguaje.

 Uno de los temas que mas me ha llamado la atención en este ultimo tiempo es la inteligencia artificial. He estado revisando algunos de los códigos mas conocidos como son ALICE y otros.

 Y si no están a años luz de mi habilidad actual, están en pañales, poco mas que el “Hola mundo”.

Así que buscando y buscando encontré un ejemplo hecho en base a la librería chatterbot en el canal de AURELIO HACKING de Youtube junto con el código descargable (lo que es de agradecer), y donde se ve como aprende el bot y me puse a revisarlo para entenderlo.

Un trozo de código introduce arrays de datos con juegos de preguntas y respuestas. Pero son solo tres así que el bot no parte sabiendo mucho.

Que mejor practica que crear una clase en python que abriera archivos con preguntas y respuestas y luego las cargara en la base de conocimiento del bot.

Buscando en la Red encontré archivos proporcionados por GunterCox en formato yml con diálogos en idioma español y me puse manos a la obra.

Aunque es cierto que el lenguaje Python es sencillo de usar, la verdad es que como cada lenguaje, tiene lo suyo propio, así que la practica me ha servido realmente de mucho.

La principal gracia de este bot de ejemplo es que puede aprender de modo interactivo, es decir si no entiende algo, pregunta cual seria la respuesta mas acertada, permitiendo agregarla. Ahora puede aprender mucho mas a partir de archivos con información de todo tipo. Aun que funciona bien, creo que falta mucho por programar. No ejecuta comandos, así que no puedo darle la orden de que corra programas o comandos del sistema operativo.

Pienso que la idea de un asistente que te ayude tiene sentido, de hecho debería ser la principal baza para la construcción de un asistente digital. Y con lo anterior me refiero a que debería estar orientado a las personas y su quehacer cotidiano.

Y el código de la clase es como sigue ( se que no es muy elegante pero la idea es aprender, nos vemos en la proxima entrada)


#/usr/bin/python3
from os import scandir, getcwd
""" 
Autor: Cesar Lazo Ruiz

 
Recupera y carga archivos en formato yml para entrenamiento de chatbot.

Clase destinada a la lectura de varios archivos en formato yml
con secuencias de pregunta y respuesta(s) que sirve para el entrenamiento de
un chatbot directamente de una carpeta con nombre 'data' obligatorio.
Verifica que no se carge mas de una vez el contenido de la carpeta 'data' """
#/usr/bin/python3
from os import scandir, getcwd
"""
Autor: Cesar Lazo Ruiz

Recupera y carga archivos en formato yml para entrenamiento de chatbot.

Clase destinada a la lectura de varios archivos en formato yml
con secuencias de pregunta y respuesta(s) que sirve para el entrenamiento de
un chatbot directamente de una carpeta con nombre 'data' obligatorio.
Verifica que no se carge mas de una vez el contenido de la carpeta 'data'
"""
class ymlmanager:
    arreglodata=[]
    arrFinal=[]
    filepath=""
    startloc=0
    endloc=3
    predefinedirectory="data"
    yml_data_files = []

    def __init__(self, ruta="data"):
        """ 
        Inicializa el atributo del path hacia el archivo yml.
        asegura el formato correcto del path
             
        """
        if (ruta != self.predefinedirectory):
            self.predefinedirectory= "./"+ruta+"/"
            self.filepath = self.predefinedirectory
        else:    
            self.filepath = ruta

    def ls(self, ruta = getcwd()):
        """Entrega un listado de los archivos contenidos en un directorio."""
        return [arch.name for arch in scandir(ruta) if arch.is_file()]

    def create_file_lock(self):
        """Crea un archivo de bloqueo para no reentrenar """
        fileyml=open("training.blocked",'w')
        fileyml.write(self.filepath)
        fileyml.close()

    def blocking_verified(self):
        """Verifica la existencia de bloqueo del entrenamiento"""
        file_path = 'training.blocked' 
        try: 
            fp = open(file_path) 
            fp.close()
            return True
        except IOError: 
            # If not exists, false return
            return False

    def load_category(self):
        """Carga el contenido de un archivo yml (dialogos)."""
        print(self.filepath)
        largo = 0
        posi = 0
        fileyml=open(self.filepath,'r')
        line=""
        while (line != "conversations:"):
            line = fileyml.readline()
            line = line.strip()
            print(line)
            continue
        line2 = fileyml.readlines()
        largo=len(line2)
        marcador=""
        while (posi<=largo-1 and line2[posi].strip()):
            linea=line2[posi]
            marcador=linea[self.startloc:self.endloc]
            frase= linea[self.endloc:].strip()
            if (marcador.strip() =="- -" and posi >1):
                """
                print("===========",posi)
                print(self.arreglodata)
                print("===========")
                """
                self.arrFinal.append(self.arreglodata)
                self.arreglodata=[]
                if (posi==largo-1):
                    print(self.arrFinal)
            self.arreglodata.append(frase)
            if (len(line2[posi].strip())==0):
                posi+=1

            posi+=1
        
        fileyml.close()
        
        #return self.arrFinal

    def loading_file_names(self):
        """Carga el listado de archivos yml"""
        self.yml_data_files = self.ls(self.predefinedirectory)
        for ymlfile in self.yml_data_files:
            print(self.predefinedirectory+ymlfile.strip())

#fin de la clase

if __name__ == "__main__":
    """ Pruebas de la clase """ 
    y = ymlmanager()

    if (y.blocking_verified() ):
        print("dialogo masivo bloqueado")
    else:    
        y.loading_file_names()
        for x in y.yml_data_files:
            print("cargado: ","./"+y.predefinedirectory.strip()+"/"+x)


#fin programa
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Inglés -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Inglés -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Inglés -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Inglés -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar
  • Añadir a la guía de conversación
    • No hay listas de palabras para Español -> Español...
    • Crear una nueva lista de palabras...
  • Copiar

Comentarios

Entradas más populares de este blog