Querés hacer un programa para chatear? + java + codigosoftwarejavafuentecodigointeligenteprogramaingleschatearConversacionChatbotchatterbotQuerés hacer un programa para chatear? + java + codigosoftwarejavafuentecodigointeligenteprogramaingleschatearConversacionChatbot

chatterbot
Querés hacer un programa para chatear? + java + codigo


Post realizado por @programador3 para taringa

Me surgió la inquietud de hacer un programa con el cual vos puedas chatear en lugar de apretar botones o escribir lo que estás buscando. Buscando en google me encontré con este artículo, originalmente en inglés, que pasé por google traslate. Disculpen si hay partes mal traducidas, cuando las vea las corrijo
Post realizado por @programador3 para taringa
Tutorial de Inteligencia Artificial para hacer un Chatbot

Post realizado por @programador3 para taringa
Básicamente, un chatterbot es un programa de ordenador que cuando se le proporcione algunos insumos en lenguaje natural (Inglés, francés ...) responde con algo significativo en ese mismo idioma. Lo que significa que la fuerza de un chatterbot puede medirse directamente por la calidad de la salida seleccionada por el Motor de búsqueda en respuesta al usuario? Por la descripción anterior, podemos deducir que un chatterbot muy básico se puede escribir en unas pocas líneas de código en un lenguaje de programación, específica. Vamos a hacer nuestra primera chatterbot (nótese que todos los códigos que se utilizarán en este tutorial será escrito en Java. Por lo tanto, se asume que el lector está familiarizado con este idioma)

Post realizado por @programador3 para taringa

//
// Program Name: chatterbot1
// Description: this is a very basic example of a chatterbot program
//
// Author: Gonzales Cenelia
//
import java.io.*;
import java.util.*;

public class Chatterbot1 {
    
    static String[] Response = {
            "I HEARD YOU!",
            "SO, YOU ARE TALKING TO ME.",
            "CONTINUE, I’M LISTENING.",
            "VERY INTERESTING CONVERSATION.",
            "TELL ME MORE..."
    };
    
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        while(true) {
            System.out.print(">");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String sInput = in.readLine();
            Random generator = new Random();
            int nSelection = generator.nextInt(Response.length);
            String sResponse = Response[nSelection];
            if(sInput.equalsIgnoreCase("BYE")) {
                System.out.println("IT WAS NICE TALKING TO YOU USER, SEE YOU NEXT TIME!");
                break;
            } else {
                System.out.println(sResponse);
            }
        }
    }
}

Post realizado por @programador3 para taringa

Como puede ver, no hace falta ser un gran cantidad de código para escribir un programa muy básico que puede interactuar con un usuario, pero probablemente sería muy difícil escribir un programa que realmente sería capaz de interpretar lo que realmente el usuario está realmente diciendo y después de que también generaría una respuesta adecuada a la misma. Estos han sido un objetivo a largo plazo desde el principio e incluso antes de los equipos de primera se crearon. En 1951, el matemático británico Alan Turing se le ocurrió la cuestión de las máquinas se puede pensar y tiene también proponen una prueba que ahora se conoce como la prueba de Turing. En esta prueba, un programa de ordenador así como una persona real se establece en hablar con una tercera persona (el juez) y que tiene que decidir cuál de ellos es la persona real. Hoy en día, hay una competencia que fue nombrado el Premio Loebner y en este contra los robots de la competencia que ha logrado engañar a la mayoría de los jueces de la lista en cinco minutos iba a ganar un premio de 100.000 $. Hasta el momento ningún programa de ordenador fue capaz de pasar esta prueba con éxito. Una de las razones principales para esto es que los programas de ordenador para calcular escrito en el concurso de tales tienen la tendencia natural de cometer un gran error tipográfico (que suelen estar fuera del contexto de la conversación). Lo que significa que por lo general, no es tan difícil para un juez para decidir si se está hablando de un "programa de computadora" o una persona real. Además, el antepasado directo de todos los programa que trata de imitar una conversación entre seres humanos reales es Eliza, la primera versión de este programa fue escrito en 1966 por Joseph Weizenbaum un profesor del MIT.
Post realizado por @programador3 para taringa
Hoy en día, tenemos chatbot como Alicia, que ha logrado ganar la medalla de bronce por tres veces consecutivas en el concurso Loebner y también fue juez como el chatbot más humano en el concurso.
Post realizado por @programador3 para taringa
Alice AIML utiliza para la representación de su base de datos. Debido a su uso de AIML como una forma estándar de representar a su base de conocimiento, Alice sigue siendo uno de los chatbot más populares a través de Internet. Alice fue creado por el Dr. Richard Wallace.
Post realizado por @programador3 para taringa
Chatbots en general se considera que pertenecen al campo de ia débil (la inteligencia artificial débil), frente a ia fuerte que la meta es crear programas que son tan inteligentes como los seres humanos o más inteligente. Pero eso no significa que chatbots no tienen verdadero potencial. Ser capaz de crear un programa que pudiera comunicarse del mismo modo lo hacen los humanos sería un gran avance para el campo de la IA. Chatbot es esta parte de la inteligencia artificial que es más accesible a los aficionados (que sólo tienen algunos conocimientos de programación promedio para ser un programador chatbot). Así, los programadores por ahí que quería crear ia verdad o algún tipo de inteligencia artificial, la escritura chatbots inteligente es un gran lugar para comenzar!
Post realizado por @programador3 para taringa
Ahora, volvamos a nuestro programa anterior, ¿cuáles son los problemas con él?
Post realizado por @programador3 para taringa
Bueno, hay una gran cantidad de ellos. En primer lugar, podemos ver claramente que el programa no es realmente tratar de entender lo que el usuario está diciendo, sino que es sólo la selección de una respuesta al azar de su base de datos cada vez que el usuario escriba alguna frase en el teclado. Y además, pudimos notar que el programa se repite muy a menudo. Una de las razones de esto es porque el tamaño de la base de datos que es muy pequeño (5 oraciones). La segunda cosa que explicaría las repeticiones es que no hemos implementado ningún mecanismo que pueda controlar este comportamiento no deseado.
Post realizado por @programador3 para taringa
¿Cómo pasamos de un programa que sólo tienes que seleccionar las respuestas al azar a cualquier entrada que el usuario puede introducir en el teclado para un programa que muestra cierta comprensión mayor de las entradas?
Post realizado por @programador3 para taringa
La respuesta a esa pregunta es sencilla calma, simplemente tenemos que utilizar palabras clave.
Post realizado por @programador3 para taringa
Una palabra clave es sólo una frase (no necesariamente completo) o incluso una palabra que el programa puede reconocer de entrada del usuario que a su vez hace posible que el programa de reaccionar a él (por ejemplo: mediante la impresión de una frase en la pantalla). Para el próximo programa, vamos a escribir una base de conocimientos o base de datos, que estará compuesto por palabras clave y algunas de las respuestas asociadas a cada palabra clave.
Post realizado por @programador3 para taringa
Así que, ahora sabemos qué hacer para mejorar "nuestra chatterbot primero "y que sea más inteligente. Vamos a proceder a escribir "nuestro segundo robot", lo llamaremos chatterbot2.

Post realizado por @programador3 para taringa

//
// Program Name: chatterbot2
// Description: this is an improved version of the previous chatterbot program "chatterbot1"
// this one will try a little bit more to understand what the user is trying to say
//
// Author: Gonzales Cenelia
//

import java.io.*;
import java.util.*;



public class Chatterbot2 {

    static String[][] KnowledgeBase = {
        {"WHAT IS YOUR NAME", 
         "MY NAME IS CHATTERBOT2."
        },
        
        {"HI", 
         "HI THERE!",
        },
        
        {"HOW ARE YOU", 
         "I'M DOING FINE!"
        },
          
        {"WHO ARE YOU", 
         "I'M AN A.I PROGRAM."
        },

        {"ARE YOU INTELLIGENT", 
         "YES,OFCORSE."
        },
           
        {"ARE YOU REAL", 
         "DOES THAT QUESTION REALLY MATERS TO YOU?"
        }
    };
    
    static String findMatch(String str) {
        String result = "";
        for(int i = 0; i < KnowledgeBase.length; ++i) {
            if(KnowledgeBase[i][0].equalsIgnoreCase(str)) {
                result = KnowledgeBase[i][1];
                break;
            }
        }
        return result;
    }
    /**
     * @param args
     */
    public static void main(String[] args)throws Exception {
        while(true) {
            System.out.print(">");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String sInput = in.readLine();
            String sResponse = findMatch(sInput);
            if(sInput.equalsIgnoreCase("BYE")){
                System.out.println("IT WAS NICE TALKING TO YOU USER, SEE YOU NEXT TIME!");
                break;
            } else if(sResponse.length() == 0) {
                System.out.println("I'M NOT SURE IF I UNDERSTAND WHAT YOU  ARE TALKING ABOUT.");
            } else {
                System.out.println(sResponse);
            }
        }
    }    
}

Post realizado por @programador3 para taringa
Ahora, el programa puede entender algunas frases como "¿cuál es su nombre ", "Si eres inteligente", etc Y también se puede elegir una respuesta adecuada de su lista de respuestas para esta frase dada y simplemente los muestran en la pantalla. A diferencia de la versión anterior del programa (chatterbot1) Chatterbot2 es capaz de elegir una respuesta adecuada a la entrada del usuario dado sin la elección de respuestas al azar que no tiene en cuenta lo que en realidad el usuario que intenta decir.
Post realizado por @programador3 para taringa
También hemos añadido un par de nuevas técnicas para programar nuevas tesis: cuando el programa es incapaz de encontrar una concordancia de palabras clave la entrada del usuario actual, que simplemente responde diciendo que no entiende lo que es humano tranquilo como.
Post realizado por @programador3 para taringa
¿Qué podemos mejorar en estas Chatbot anterior para que sea aún mejor?
Post realizado por @programador3 para taringa
Hay calma un par de cosas que podemos mejorar, el primero es que desde el chatterbot tiende a ser muy repetitivos, se podría crear un mecanismo de control de estas repeticiones. Simplemente, podría almacenar la respuesta anterior de que Chatbot dentro de una cadena "sPrevResponse" y hacer algunas comprobaciones al seleccionar el siguiente robot respuesta a ver si no es igual a la respuesta anterior. Si es el caso, a continuación, seleccione una nueva respuesta de las respuestas disponibles.
Post realizado por @programador3 para taringa
La otra cosa que podría mejorar sería la forma en que el chatbot maneja las entradas de los usuarios, en la actualidad si se introduce una entrada que está en minúsculas el Chatbot no entendería nada al respecto, incluso si no sería un partido en el interior del robot de la base de datos de esa entrada. Además, si la entrada contiene espacios en blanco o caracteres puntuacion (!;,.) esto también evitaría que el Chatbot de la comprensión de la entrada. Esa es la razón por la cual vamos a tratar de introducir algún nuevo mecanismo para preprocesar las entradas de los usuarios antes de que pueda ser la búsqueda en la base de datos Chatbot. Podríamos tener una función de poner las entradas de los usuarios en mayúsculas ya que las palabras clave dentro de la base de datos están en mayúsculas y otro procedimiento para eliminar sólo todos los signos de puntuación y espacios en blanco que se encontró dentro de entrada de los usuarios. Dicho esto, ahora tenemos suficiente material para escribir nuestros chatterbot siguiente: "Chattebot3"
Post realizado por @programador3 para taringa


//
// Program Name: chatterbot3
// Description: this is an improved version of the previous chatterbot program "chatterbot1"
// this one will try a littlebit more to understand what the user is trying to say and will also
// try to avoid repeating himself too much. 
//
// Author: Gonzales Cenelia
//
import java.io.*;
import java.util.*;

public class Chatterbot3 {

    static String KnowledgeBase[][] = {
            {"WHAT IS YOUR NAME", 
             "MY NAME IS CHATTERBOT2.",
             "YOU CAN CALL ME CHATTERBOT2.",
             "WHY DO YOU WANT TO KNOW MY NAME?"
            },

            {"HI", 
             "HI THERE!",
             "HOW ARE YOU?",
             "HI!"
            },
            
            {"HOW ARE YOU",
             "I'M DOING FINE!",
             "I'M DOING WELL AND YOU?",
             "WHY DO YOU WANT TO KNOW HOW AM I DOING?"
            },

            {"WHO ARE YOU",
             "I'M AN A.I PROGRAM.",
             "I THINK THAT YOU KNOW WHO I'M.",
             "WHY ARE YOU ASKING?"
            },

            {"ARE YOU INTELLIGENT",
             "YES,OFCORSE.",
             "WHAT DO YOU THINK?",
             "ACTUALY,I'M VERY INTELLIGENT!"
            },

            {"ARE YOU REAL",
             "DOES THAT QUESTION REALLY MATERS TO YOU?",
             "WHAT DO YOU MEAN BY THAT?",
             "I'M AS REAL AS I CAN BE."
            }
        };
    
    final static String puncs = "?!.;,";
    
    final static int inputNum = 1;
    final static int respNum = 3;
    
    
    static boolean isPunc(char ch) {
        return puncs.indexOf(ch) != -1;
    }
    
    static Vector findMatch(String str) {
        Vector&ltString> result = new Vector&ltString>(respNum);
        for(int i = 0; i < KnowledgeBase.length; ++i) {
            if(KnowledgeBase[i][0].equalsIgnoreCase(str)) {
                for(int j = inputNum; j <= respNum; ++j) {
                    result.add(KnowledgeBase[i][j]);
                }
                break;
            }
        }
        return result;
    }
    
    // removes punctuation and redundant
    // spaces from the user's input
    static String cleanString(String str) {
        StringBuffer temp = new StringBuffer(str.length());
        char prevChar = 0;
        for(int i = 0; i < str.length(); ++i) {
            if(str.charAt(i) == ' ' && prevChar == ' ' ) {
                continue;
            } else if(!isPunc(str.charAt(i))) {
                temp.append(str.charAt(i));
            }
            prevChar = str.charAt(i);
        }
        return temp.toString();
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String sResponse = "";
        while(true) {
            System.out.print(">");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String sInput = in.readLine();
            sInput = cleanString(sInput);
            Vector&ltString> responses = new Vector&ltString>(respNum);
            responses = findMatch(sInput);
            if(sInput.equalsIgnoreCase("BYE")) {
                System.out.println("IT WAS NICE TALKING TO YOU USER, SEE YOU NEXT TIME!");
                break;
            } else if(responses.size() == 0) {
                System.out.println("I'M NOT SURE IF I UNDERSTAND WHAT YOU ARE TALKING ABOUT.");
            } else {
                Random generator = new Random();
                int nSelection = generator.nextInt(respNum);
                String sPrevResponse = sResponse;
                sResponse = responses.elementAt(nSelection);
                if(sResponse == sPrevResponse) {
                    responses.removeElementAt(nSelection);
                    nSelection = generator.nextInt(respNum);
                    sResponse = responses.elementAt(nSelection);
                }
                System.out.println(sResponse);
            }
        }
    }
}


Post realizado por @programador3 para taringa
¿Cuáles son la debilidad con la versión actual del programa?
Post realizado por @programador3 para taringa
Es evidente que todavía hay muchas limitaciones con esta versión del programa. La más obvia sería que el uso del programa de "matching frase exacta"para encontrar una respuesta a la entrada del usuario. Esto significa que si va a ir y preguntarle "¿cuál es su nombre otra vez", el programa simplemente no entiende lo que está tratando de decir a él, y esto se debe a que fue incapaz de encontrar una coincidencia para esta entrada. Y esto definitivamente sonaría un poco sorprendente teniendo en cuenta el hecho de que el programa puede entender la frase "¿cuál es su nombre".
Post realizado por @programador3 para taringa
¿Cómo podemos superar este problema?
Post realizado por @programador3 para taringa
Hay en la lista de dos maneras de resolver este problema, la más obvia es el uso de una forma un poco más flexible para hacer coincidir las palabras clave en la base de datos contra la entrada del usuario. Todo lo que tenemos que hacer para que esto sea posible es simplemente en voz alta palabras clave para encontrar dentro de las entradas de modo que ya no tendrá la limitación anterior.

La otra posibilidad es mucho más complejo, el uso de la noción de Fuzzy Cadena de búsqueda. Para aplicar este método, que podría ser útil en un primer momento para romper las entradas y la palabra clave actual en palabras separadas, después de que podríamos crear dos vectores diferentes, el primero podría utilizar para almacenar las palabras para la entrada y el otro se almacén de las palabras de la palabra clave actual. Una vez hecho esto, podría utilizar la distancia Levenshtein para medir la distancia entre los dos vectores de la palabra. (Tenga en cuenta que para que este método sea efectivo, también se necesita una palabra clave adicional que representaría el tema de la palabra clave actual).

Así que, ahí lo tienen, dos métodos diferentes para mejorar la chatterbot. En realidad se podría combinar ambos métodos y tan solo seleccionar cuál usar en cada situación.

Por último, todavía hay otro problema que te habrás dado cuenta con el chatterbot anterior, podría repetir la misma frase una y otra vez y el programa no tendría ninguna reacción a este. También tenemos que corregir este problema.

Por lo tanto, ahora estamos listos para escribir nuestra chatterbot en cuarto lugar, simplemente lo llaman chatterbot4 (ver código en la fuente)

Como probablemente habrás visto, el código para "chatterbot4" es muy similar a la de la "chatterbot3", pero también hubo algunos cambios clave en ella. En particular, la función de búsqueda de palabras clave dentro de la base de datos es ahora un poco más flexible.

Así que, ¿qué sigue?
No te preocupes, todavía hay muchas cosas por cubrir.

¿qué podemos mejorar en chatterbot4 para hacerlo mejor?

Aquí están algunas ideas

* Desde el código de la chatterbots han comenzado a crecer, que sería una buena cosa para encapsular la aplicación de la chatterbot siguiente mediante una clase.

* También la base de datos es todavía demasiado pequeño como para ser capaz de manejar una conversación real con los usuarios, por lo que tendrá que añadir algunas entradas más en él.

* Puede suceder a veces que el usuario presione la tecla enter sin introducir nada en el teclado, tenemos que manejar esta situación también.

* El usuario también puede tratar de engañar a los chatterbot repitiendo su frase anterior con algunas ligeras modificaciones, tenemos que contar esto como una repetición del usuario.

* Y, por último, muy pronto también se dará cuenta de que puede ser que necesite una forma de palabras clave de clasificación cuando tenemos múltiples opciones de palabras clave de una aportación igual, necesitamos una forma para elegir el mejor entre ellos.

Dicho esto, ahora vamos a empezar a escribir la aplicación de chatterbot5. Ver el código de Chatterbot5

Antes de proceder a la siguiente parte de este tutorial, se le anima a tratar de compilar y ejecutar el código para "chatterbot5" para que usted pueda comprender cómo funciona y también para verificar los cambios que se han hecho en ella. Tiene que haber visto, la aplicación de la "chatterbot actual", ahora es encapsulado en una clase, también, se ha añadido nuevas funciones a la nueva versión del programa.
Ahora vamos a tratar de discutir la aplicación de "chatterbot5"

select_response ()
Esta función selecciona una respuesta de una lista de respuestas, utiliza el "shuffle" función de la "clase Collections" para que la lista de respuestas se barajan antes de la selección final

save_prev_input ()
Esta función simplemente guarda la entrada del usuario actual en una variable (sPrevInput) antes de geting algunos insumos nuevos por parte del usuario.

save_prev_response void ()
La función "save_prev_response ()" guarda la respuesta actual del chatterbot antes de que el bot han comenzado a buscar respuestas para la entrada actual, la responsesis actual, salvo en los varaible (sPrevResponse).

save_prev_event void ()
Esta función simplemente guarda el caso actual (sEvent) en la variable (sPrevEvent). Un evento puede ser cuando el programa ha dectected una "entrada nula" por parte del usuario también, cuando el usuario se repite e incluso cuando el chatterbot hace repeticiones tiene bien etc

vacío set_event (String str)
Establece el caso actual (sEvent)

save_input void ()
Hace una copia de seguridad de la corriente de entrada (sIntput) en el sInputBackup variable.

vacío set_input (String str)
Establece la corriente de entrada (sInput)

restore_input void ()
Restablece el valor de la corriente de entrada (sInput) que se ha guardado previamente en el sInputBackup variable.

print_response void ()
Imprime la respuesta que ha sido seleccionada por el "chat robot" en la pantalla.

preprocess_input void ()
Esta función hace algún proceso previo en la entrada como la eliminación de signos de puntuación, charactes espacios redundantes y también convierte la entrada en mayúsculas.

bot_repeat booleano ()
Comprueba si el chatterbot ha empezado a repetirse.

user_repeat booleano ()
Comprueba si el usuario tiene repetirse.

bot_understand booleano ()
Comprueba que el bot entender la entrada del usuario actual (sInput).

null_input booleano ()
Comprueba si la entrada del usuario actual (sInput) es nulo.

null_input_repetition booleano ()
Comprueba si el usuario ha repetido algunos insumos nulo.

user_want_to_quit booleano ()
Compruebe si el usuario quiere salir de la sesión actual con el chatterbot.

same_event booleano ()
Verifica si el evento actual (sEvent) es el mismo que el anterior (sPrevEvent).

no_response booleano ()
Comprueba si el programa no tiene respuesta para la entrada actual.

same_input booleano ()
Comprueba si la corriente de entrada (sInput) es el mismo que el anterior (sPrevInput).

similar_input booleano ()
Comprueba si la entrada actual y el anterior son similares, dos entradas se consideran similares si uno de ellos es la subcadena de la otra (Ej.: "¿cómo estás" y "¿cómo estás" se considerarán similares porque "cómo Si eres "es una subcadena de" ¿cómo te va ".

get_input void ()
Obtiene las entradas del usuario.

nula respuesta ()
Maneja todas las respuestas de los "chat robot" ya sea para eventos o simplemente la entrada del usuario actual. Así que, básicamente, estas funciones controla el comportamiento del programa.

find_match ()
Encuentra las respuestas para la entrada actual.

handle_repetition void ()
Maneja repeticiones realizadas por el programa.

handle_user_repetition ()
Maneja repeticiones realizadas por el usuario.

vacío handle_event (String str)
esta función controla los eventos en general.

Se puede ver claramente que "chatterbot5" tiene funcionalidades mucho más que "chatterbot4", y también cada funcionalidades se encapsula en los métodos (funciones) de la clase "CBOT", pero todavía hay mejoras mucho más que hacer en ella también.

Chattebot5 introducir el concepto de "Estado", en esta nueva versión de la Chatterbot, asociamos otro "estado" a algunos de los eventos que pueden ocurrir durante una conversación. Ejemplo: cuando el usuario entra en una entrada nula, el chatterbot que se fijó en el estado "NULL INPUT **", cuando el usuario repita la misma frase, sería entrar en la "repetición T1 **" estado, etc

Asimismo, estos nuevos usos chatterbot una base de datos más grande que el chatbot anteriores que hemos visto hasta ahora: chatterbot1, chatterbot2, chatterbot3 ... Pero aún así, esto es tranquila insignificante debido al hecho de que la mayoría de chatterbots en uso hoy en día (los muy populares) tienen una base de datos de al menos 10 000 líneas o más. Por lo tanto, este sería sin duda uno de los principales objetivos que podríamos tratar de lograr en las próximas versiones del chatterbot.

Pero sin embargo, por ahora, nos concentraremos un pequeño problema relativo a la chatterbot actual.

¿Cuál sería exactamente el problema?

Bueno, todos los límites sobre la palabra clave, supongamos que el usuario entra en la frase: "I Don't think so" durante una conversación con el chatbot, naturalmente, el programa se vería en su base de datos para una palabra clave que coinciden con la sentencia, y que podría encontrar la palabra clave : "HI", que también es una subcadena de la palabra "Think", claramente se trata de un comportamiento no deseado.

¿Cómo evitarlo?

Simplemente poniendo un carácter de espacio antes y después de las palabras clave que se pueden encontrar dentro de la base de datos o simplemente podemos aplicar los cambios durante el proceso de correspondencia dentro de la "find_match () la función"

¿Hay otras cosas que podemos mejorar en "Chatterbot5"?

Ciertamente que hay. Hasta ahora, el Chatbot iniciar una "sesión de chat" con los usuarios sin decir nada al inicio de las conversaciones. Sería bueno si el chatterbot podía decir nada en absoluto para el inicio de las conversaciones. Esto puede lograrse con facilidad mediante la introducción de "signo de los mensajes" en el programa. Simplemente puede hacer esto mediante la creación de un nuevo estado dentro de la "base de conocimientos" Chatbot y añadiendo un poco de mensaje apropiado que se vincula a ella. Ese nuevo estado podría ser llamada "SIGNON **". (Ver el código de Chatterbot6 en la fuente)

La introducción del concepto de "palabra clave Ranking"

Como puede ver, en cada nueva versión del chatterbot, estamos añadiendo progresivamente nuevas funciones para hacer más realista la Chabot. Ahora, en esta sección, una nueva va a introducir el concepto de 'ranking de palabras clave' en el Chatterbot. ranking de palabras clave es una forma de que el programa para seleccionar las mejores palabras claves en su base de datos cuando hay más de una palabra clave que coinciden con las entradas de los usuarios. Ejemplo: si tenemos la entrada del usuario actual: ¿CUÁL ES SU NOMBRE DE NUEVO, mirando en su base de datos, el Chatbot habría una lista de dos palabras clave que coinciden con esta entrada: "qué" y "¿CUÁL ES SU NOMBRE". ¿Cuál es el mejor? Bueno, la respuesta es sencilla tranquila, es evidente: "¿CUÁL ES SU NOMBRE", simplemente porque es la más larga de palabras clave. Estas nueva característica se ha implementado en la nueva versión del programa: Chatterbot7. (Ver el código de Chatterbot7 en la fuente)

Palabras clave Equivalente

Dentro de todas las anteriores chatterbots el récord de la base de datos en voz alta que usemos sólo una palabra clave para cada conjunto de respuestas, pero a veces puede ser útil contar con más de una palabra clave asociada a cada conjunto de respuestas. Especialmente cuando estas palabras clave tienen el mismo significado. Ejemplo: ¿CUÁL ES SU NOMBRE y puede usted por favor dígame su nombre tiene dos tenían el mismo significado. Así no habría necesidad de utilizar diferentes registros para estas palabras clave en lugar de eso sólo puede modificar la estructura de registro para que en voz alta que tengamos más de una palabra clave por los registros. (Ver el código de Chatterbot8 en la fuente)

Incorporación de palabras clave y la respuesta de plantilla

Uno de los mecanismos conocidos de chatterbots es la capacidad para la reformulación de la entrada del usuario al hacer algunos conjugación de verbos básicos. Por ejemplo, si el usuario introduce: Eres una máquina, el chatterbot podría responder: ¿Así que piensas que soy una máquina.

¿Cómo llegamos a esta transformación? Es posible que haya hecho a través de dos pasos:

*

Nos aseguramos de que el chatterbot tener una lista de plantillas de respuesta que está vinculada a las palabras clave correspondientes. Las respuestas las plantillas son una especie de esqueleto para construir nuevas respuestas para la chatterbot. Por lo general usamos comodines en las respuestas para indicar que se trata de una plantilla. En el ejemplo anterior, hemos utilizado la plantilla: (POR LO QUE USTED PIENSA QUE *) para la construcción de nuestra respuesta. Durante el proceso de montaje, simplemente reemplazar el comodín por alguna parte de la entrada original. En ese mismo ejemplo, tenemos el uso: es una máquina que en realidad es la entrada original completo del usuario. Después de reemplazar el comodín de la entrada del usuario, tenemos la siguiente frase: SO, usted piensa que usted es una máquina, pero no podemos utilizar estos frase tal cual es, antes de que tenemos que hacer algo de inversión de pronombres en ella.

* Las transposiciones habitual que utilizamos en su mayoría son la sustitución del pronombre de la primera persona en pronombre de la segunda persona, Ej: USTED -> Me, I'm -> NO SE ENCUENTRA etc En el ejemplo anterior, sustituyendo "ERES" por "Yo soy" en la entrada de los usuarios, después de aplicar estos cambios, la sentencia original a ser: yo soy una máquina, ahora podemos reemplazar el comodín de la plantilla por estas nueva frase que nos dan nuestra respuesta final para el Chatbot: SO , USTED PIENSA QUE SOY UNA MÁQUINA.

Tenga en cuenta que no es una buena cosa para el uso de transposición demasiado durante una conversación, el mecanismo sería demasiado evidente y puede producir alguna repetición. (Ver el código de Chatterbot9 en la fuente)

Palabra clave Concepto Ubicación

Algunas palabras clave se puede encontrar en cualquier parte de un insumo dado, algunos otros sólo se puede encontrar sólo en algunos lugares específicos en la entrada del usuario, de lo contrario no tendría ningún sentido. Una palabra clave como: "Who Are You" se puede encontrar en cualquier parte de la entrada del usuario sin crear ningún problema con el significado de la misma.

Algunos ejemplos de oraciones usando "Who Are You" sería la siguiente:
1) ¿Quién eres?
2) POR EL CAMINO, QUIEN ERES?
3) Así que dime: ¿Quién eres exactamente?

Pero una palabra clave como "que es" sólo se puede encontrar en el principio o en medio de una oración dada, pero no se puede encontrar en la final de la oración o en solitario.

Ejemplos de frases con la palabra clave: "¿QUIÉN ES"
1) La OMS es tu cantante favorito?
2) ¿SABES QUIEN ES EL matemático más grande de todos los tiempos?
3) Dime, ¿SABES QUIEN ES? (Estas uno claramente no tiene ningún sentido)

¿Cómo nos aseguramos de que el chatterbot será capaz de distinguir palabras clave y los lugares específicos que son en voz alta que se encuentran en una frase? Nos limitaremos a introducir algunas notaciones nuevas palabras clave:

1) Las palabras clave que sólo puede encontrarse al principio o en medio de una frase estará representada por: _KEYWORD (Ej: _WHO ES)
2) Las palabras clave que sólo se puede encontrar al final o en medio de una frase se denota por: KEYWORD_
3) Las palabras clave que sólo se encontró solo en una frase estará representada por: _KEYWORD_ (Ej: _ ¿Qué)
4) Y por último, las palabras clave que se pueden encontrar en cualquier parte de una frase o incluso solo sería simplemente representado por: palabra clave (Ej: ENTIENDO)

Una palabra clave puede tener diferentes significados dependiendo de su posición en una oración dada.
Ver el código de Chatterbot10

Manejo de contexto


Contexto es un camino para la Chatterbot para mantener en las vías lo que ha dicho anteriormente y ser capaz de tener esto en cuenta a la hora de seleccionar su respuesta siguiente. Hasta ahora, cada respuesta seleccionada por el Chatbot durante una conversación se elige sólo se basa en la información del usuario actual. Pero a veces, puede ser que necesite más datos con el fin de poder responder adecuadamente a una entrada dada, que es cuando tenemos que usar su contexto.

Para ilustrar este concepto, vamos a buscar en el registro de la siguiente conversación:

USUARIO: ¿Cuál es tu película favorita?
ChatterBot: ES TERMINATOR II.

USUARIO: ¿Por qué te gusta esta película? (Ahora, ¿cómo se supone que debemos responder a esa pregunta si no sabía nada de la respuesta anterior de la Chatbot?)

Así que claramente, algunas entradas requiere el uso de "contexto" con el fin de poder formular una respuesta correcta. En el ejemplo anterior, sería simplemente: ES TERMINATOR II.
Ahora el Bot sabe lo que estaba hablando anteriormente, es más fácil formular una buena respuesta a la entrada del usuario.

ahora podemos continuar con el registro de la conversación anterior:
(Contexto: ES TERMINATOR II)
ChatterBot: porque es una película de ciencia-ficción y me encanta la ciencia-ficción.

Contexto, también en voz alta a controlar la reacción inadecuada de la Chatbot. Por ejemplo, si el usuario introduce la frase: "¿Por qué te gustan estas películas?" durante una conversación sin la Chatterbot incluso hablar de estos sujetos. Simplemente podría responder diciendo: LO QUE ESTÁ HABLANDO?

La función de contexto se ha implementado en Chatterbot11.
(Falta el código de Chatterbot11 en la fuente)

Otra gran característica que sería muy interesante para aplicar en un Chatterbot es la capacidad de anticipar la respuesta al lado del usuario, estos se hacen los Chabot se ve aún más inteligente durante una conversación.

El uso de un archivo sin formato para almacenar la base de datos

Hasta el momento la base de datos, fue construida siempre en el programa de lo que significa que cuando cada vez que modificó la base de datos, alseo tendría que volver a compilar el programa. Esto realmente no es conveniente porque puede suceder a veces que sólo quieres editar la base de datos y mantener el resto del programa tal como es. Por estas razones y muchas otras, podría ser una buena cosa a tener un archivo separado para almacenar la base de datos que luego nos da la capacidad de justediting la base de datos sin tener que recompilar todos los archivos en el programa. Para almacenar la base de datos que, básicamente, podría utilizar un archivo de texto simple con algunas anotaciones específicas para distinguir los diferentes elementos de la base de datos (palabras clave, la respuesta, transposiciones, contexto ...). En el currentprogram, usaremos las siguientes anotaciones que ha sido el uso antes de que algunos impletation del chatbot eliza en pascal.

1. Las líneas que empiezan por "K" en la base de datos se representan las palabras clave.
2. Las líneas que empiezan por "R" se representan las respuestas
3. Las líneas que empiezan por "S" representará a firmar en los mensajes
4. Las líneas que empiezan por "T" representan transposiciones
5. Las líneas que empiezan por "E" representan las posibles correcciones se pueden hacer después de la transposición de la entrada del usuario
6. Las líneas que empiezan por "N" representa las respuestas para la entrada vacía por parte del usuario
7. Las líneas que empiezan por "X" representan las respuestas para cuando chatbot que no se encontró ninguna concordancia de palabras clave que coinciden con la entrada del usuario actual.
8. Las líneas que empiezan por "W" se representan las respuestas para cuando el usuario se repita.
9. Las líneas que empiezan por "C" representa el contexto de la respuesta actual de la chatbot.
10. Las líneas que empiezan por "#" representará comentarios

Ahora tenemos una arquitectura completa de la base de datos, sólo tenemos que implementar las características de las tesis en la próxima versión del chatbot (Chatterbot13) (Falta el código de Chatterbot12 en la fuente)

Una repetición de un mejor manejo del algoritmo

En un esfuerzo por evitar que el chatbot de repeatiing sí demasiado, previamente, se ha aplicado un algoritmo muy básico y simple que consiste en comparar la respuesta del chatbot actual a la anterior. Si la respuesta a la selección actual es igual a la anterior, simplemente se descarta que la respuesta y mirar por encima del candidato respuesta siguiente en la lista de respuestas disponibles. Este algoritmo es muy effcient cuando se trata de repeticiones de control inmediato del chatbot. Sin embargo, no es tan buena para evitar la repetición de más largo plazo. Durante una sesión de chatear, la misma respuesta puede occures muchas veces. Con el nuevo algoritmo, podemos controlar el tiempo que tarda el chatbot para volver a seleccionar la misma respuesta. En realidad, nos aseguramos de que tiene uso de todas las respuestas para la palabra clave correspondiente antes de que pueda repetir la misma respuesta. Esto es, a su vez puede mejorar la calidad de los intercambios de conversación. Aquí hay una decription sobre cómo funciona el algoritmo: Durante la conversación entre el chatbot y el usuario, hacemos una lista de todas las respuestas previamente bselected por el robot de chat. Cuando se selecciona una nueva respuesta, hacemos una búsqueda de respuesta actual a continuación, seleccionados dentro de la lista que comienza por el final. Si el candidato respuesta actual fue constatada durante la wihin buscar en la lista, entonces hacer una comparaison de que la posición del número total de respuestas disponibles. si la posición más uno es inferior al total de las respuestas disponibles, consideramos que es una repetición, así que tenemos que descartar la respuesta actual y seleccione otro.

Actualización de la base de datos con nuevas palabras clave

A veces, cuando se trata de añadir nuevas palabras clave a la base de datos, podría ser difícil elegir los que son realmente relevantes. Sin embargo, hay una solución muy simple a este problema. Cuando chatear con el robot de chat, sólo asegúrese de que almacenamos la entrada del usuario en un archivo (por ejemplo: unknown.txt) cada vez que el chatbot no fue capaz de encontrar cualquier palabra clave que coincida con la entrada actual. Más tarde, cuando tenemos que hacer algunas palabras clave actualizaciones en la base de datos, sólo tenemos que echar un vistazo a el archivo que hemos utilizar para guardar las frases desconocidas que se encuentran antes, durante las conversaciones anteriores. Continuamente añadiendo nuevas palabras clave con estas normas, se podría crear una base de datos muy buena. (Falta el código de Chatterbot14 en la fuente )

Guardando los logs de conversación

¿Por qué guardar las conversaciones entre los usuarios y el chatbot? Debido a que podría ayudarnos a encontrar la debilidad del chatbot durante una conversación dada. Whe podría entonces decidir qué modificaciones para hacer que la base de datos a fin de que las conversaciones futuras exhanges más natural. Básicamente, podría ahorrar el tiempo y también la fecha que nos ayude a deter el progreso de la chatbot después de nuevas actualizaciones se aplican a ella. Ahorro de los registros que nos ayuda a deter forma humana como es la habilidad de conversación del chatbot.



Fuente