Entiende sus comandos de voz, busca noticias y fuentes de conocimiento, y le resume y lee el contenido.
Mira el vídeo de demostración.
La revista Chatbots incluyó mi artículo de Delbot entre los 100 artículos principales de la revista Chatbots.
python app.py
en el símbolo del sistema para iniciar el servicio web.Los bots siguen siendo un tema candente. Todo el mundo habla de ellos.
¿Qué tal construir uno desde cero? El sencillo que crearemos hoy comprenderá y responderá preguntas como:
Nuestro objetivo es codificar un bot desde cero y utilizar el procesamiento del lenguaje natural (NLP) mientras lo hacemos.
Además, nuestro bot estará habilitado para voz y estará basado en la web si también completa la sección de la aplicación web. La mejor parte es que no necesitamos hacer nada sofisticado para el reconocimiento y la síntesis de voz: usaremos una capacidad integrada de los navegadores web modernos.
En un nivel alto, queremos poder comprender dos tipos amplios de consultas. A continuación se muestra el diagrama de flujo.
Podríamos pedir noticias . P.ej:
¿Qué es lo último sobre Animales Fantásticos en The Guardian?
El bot consultará la API de la fuente de noticias solicitada (New York Times si no se especifica ninguna) y resumirá los resultados:
[...] Comparar la primera película de Harry Potter (Harry Potter y la piedra filosofal de 2001) con la última (Harry Potter y las Reliquias de la Muerte, segunda parte de 2011) es algo parecido a comparar a Bambi con Reservoir Dogs. Lo conocemos por primera vez en la Nueva York de los años 20, casi 60 años antes de que nazca Harry, donde es [...]
(fuente: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
Podríamos hacer una pregunta de conocimiento . P.ej:
¿Qué son los triples RDF?
Y el bot responderá:
Una tripleta semántica, o simplemente tripleta, es la entidad de datos atómicos en el Marco de descripción de recursos.nEste formato permite representar el conocimiento de forma legible por máquina. En particular, cada parte de un triple RDF es direccionable individualmente a través de URI únicos. Por ejemplo, la segunda declaración anterior podría representarse en RDF como http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/ conoce http://ejemplo.nombre#JohnDoe34.
(fuente: https://en.wikipedia.org/wiki/Semantic_triple)
Definimos una regla simple para categorizar las entradas: si la consulta contiene las palabras noticias o lo último , es una consulta de noticias . De lo contrario, es una consulta de conocimiento .
La función predict
de la clase QueryAnalyzer
es el principal punto de entrada de nuestro bot. Realiza la categorización anterior. Llama a otras funciones para
Finalmente, devuelve la salida y una bandera que indica si hubo algún error.
Asumimos que la entrada es de una de las siguientes formas.
¿Cuáles son las últimas noticias sobre Star Wars en el New York Times?
Léame lo último sobre Brexit.
Dame noticias sobre las películas de Marvel Cinematic Universe en 2017 de The Guardian.
Simbólico | Dar | a mí | el | el último | noticias | en | donald | Triunfo | de | el | Nuevo | york | Veces | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
punto de venta | VERBO | PRON | DET | adj. | SUSTANTIVO | ADP | PROPIEDAD | PROPIEDAD | ADP | DET | PROPIEDAD | PROPIEDAD | PROPIEDAD | PUNTO |
ETIQUETA | V.B. | PPR | DT | JJS | NN | EN | PNN | PNN | EN | DT | PNN | PNN | PNN | . |
Hay un patrón en las oraciones estructuradas como las anteriores. Y las preposiciones son clave.
El tema de búsqueda está entre la primera y la última preposición. La fuente solicitada está al final después de la última preposición. El último sustantivo es la fuente.
En caso de que no se especifique una fuente, como en el segundo ejemplo, se supone que todo lo que sigue a la primera preposición es el tema de búsqueda.
Las adposiciones , en pocas palabras, son preposiciones y posposiciones.
En un idioma con iniciales como el inglés, las adposiciones suelen preceder al sintagma nominal. Por ejemplo, personajes del Universo Cinematográfico de Marvel. Mientras que en un idioma final como el gujarati, las adposiciones siguen al sintagma nominal. Éstas son posposiciones. Por ejemplo, માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો, que traduce palabra por palabra a: Marvel Cinematic Universe de personajes.
Invocamos get_news_tokens
desde la clase QueryExtractor
, que extrae la fuente y la consulta de la entrada. Internamente, llama _split_text
para extraer fragmentos de sustantivos, partes del discurso y el texto completamente analizado de la entrada. Lematizamos términos en la consulta.
A continuación, invocamos la función get_news
mediante una consulta en una de las clases Aggregator
en media_aggregator.py según la fuente . Esto devuelve una lista de artículos de noticias que la API de noticias envió como respuesta. Actualmente admitimos la API de The Guardian y la API de The New York Times.
Finalmente, seleccionamos el primer elemento (por defecto) de la lista de respuestas y lo resumimos usando la función shorten_news
.
Asumimos que la entrada es de una de las siguientes formas.
John Deere
Juana de Arco
¿Quién es Donald Trump?
¿Quién fue JRR Tolkien?
¿Qué es sujeto predicado objeto?
Háblame de la física de partículas.
Simbólico | Qué | es | un | RDF | triple | ? |
---|---|---|---|---|---|---|
punto de venta | SUSTANTIVO | VERBO | DET | PROPIEDAD | SUSTANTIVO | PUNTO |
ETIQUETA | WP | VBZ | DT | PNN | NN | . |
Simbólico | Decir | a mí | acerca de | él | - | hombre | y | el | maestros | de | el | universo | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
punto de venta | VERBO | PRON | ADP | PRON | PUNTO | SUSTANTIVO | CONJ | DET | SUSTANTIVO | ADP | DET | SUSTANTIVO | PUNTO |
ETIQUETA | V.B. | PPR | EN | PPR | HIP | NN | CC | DT | ENN | EN | DT | NN | . |
Si encontramos un verbo auxiliar, tratamos todo después de su primera aparición como consulta. Por tanto, en el Ejemplo 1 , la consulta es RDF triple .
De lo contrario, tratamos todos los fragmentos de sustantivos después del primero como consulta. Por lo tanto, en el Ejemplo 2 , la consulta es el hombre que domina el universo .
Invocamos get_knowledge_tokens
desde la clase QueryExtractor
, que extrae la consulta .
Pasamos esto a la función get_gkg
, que consulta la API de Wikipedia a través del paquete Python de Wikipedia y devuelve un resumen de 5 oraciones del resultado principal.
Utilicé la clase FrequencySummarizer
de Resumen de texto con NLTK. Alternativamente, puedes usar sumy.
Además de los paquetes re , bs4 , request , operator , collections , heapq , string y nltk , usaremos lo siguiente.
spaCy : configúrelo como se indica en los documentos de instalación de spaCy. spaCy nos ayudará a realizar una PNL rápida. Podríamos usar NLTK pero spaCy te permitirá avanzar más rápido. Usamos spaCy en este proyecto.
Wikipedia : esto ayuda a consultar la API de Wikipedia. Puede leer los documentos del paquete Python de Wikipedia aquí.
Resumidor : El que utilicé fue tomado del blog The Glowing Python escrito por JustGlowing. Resume contenido extenso. Alternativamente, puedes usar sumy.
Flask-RESTful, Flask (opcional) : sirven para crear una aplicación web y poner en funcionamiento nuestro bot a través de un servicio web RESTful.
Agregamos una página web interesante desde la cual puede realizar consultas de voz y hacer que el navegador lea el contenido de la respuesta. Para ello utilizamos la API Web Speech.
Ponemos en funcionamiento nuestro servicio web REST basado en Flask en menos de 20 líneas de código. La clase QueryService
maneja solicitudes.
Por ahora, solo necesitamos una llamada de servicio para enviar información desde nuestra aplicación web a nuestro bot. Esto se hace mediante la función post
de la clase QueryService
. post
, a su vez, llama a la función predict
, que es el punto de entrada principal como se mencionó anteriormente.
Creé una página web básica para demostrar el bot. Utiliza Web Speech API para recibir entradas de voz y leer contenido. Puede encontrar el archivo index.html en la carpeta de plantillas. Asegúrese de haber instalado todos los paquetes y bibliotecas necesarios y de que el servicio web esté en funcionamiento antes de abrir el sitio web.
Nuestro sencillo robot comprende una gama limitada de solicitudes. No puede comprender otros tipos de solicitudes como las siguientes.
Solicitudes de conocimiento con una estructura diferente
Explícame qué es la agregación bootstrap.
Cuéntame algo sobre la neurociencia computacional.
Solicitudes de noticias con una estructura diferente.
¿Qué dice el New York Times sobre el último partido de Roger Federer?
¿Qué está pasando en el mundo del tenis?
Solicitudes de conocimiento de otros tipos.
¿Cómo se elabora el queso?
¿Dónde nació J.K. Rowling?
¿Podemos construir una ciudad celeste en Venus?
¿Cuándo tuvo lugar la Revolución Francesa?
¿Por qué Júpiter tiene la Gran Mancha Roja?
Preguntas de seguimiento y contexto
Explícame qué es la agregación bootstrap.
y luego: ¿Cómo se relaciona con los bosques aleatorios?
Comprender a qué se refiere en la pregunta de seguimiento se incluye en lo que se conoce como resolución de anáfora. Todo es parte de comprender el contexto. Diferentes palabras significan diferentes cosas en diferentes contextos. Si bien los humanos tienen una comprensión matizada de estos, es mucho más difícil enseñar lo mismo a las máquinas.
Logramos nuestro objetivo de construir un bot basado en algunas reglas que definimos. También utilizamos algunas técnicas de PNL. Finalmente, implementamos nuestro bot en una aplicación web. Sin embargo, nuestro bot está limitado en los tipos de consultas que puede comprender y responder. ¿Por qué su alcance de comprensión es tan limitado?
En general, hacer que las computadoras realmente comprendan el lenguaje es un problema difícil para la IA. Existe un campo conocido como NLU (Natural Language Understanding) dentro de la PNL dedicado a esto.
Podríamos implementar una solución basada en aprendizaje automático para que nuestro bot pueda comprender una gama mucho más amplia de solicitudes.
Asegúrese de leer los términos de uso de las API utilizadas aquí.