Procesado de Lenguaje Natural

Anuncio
Procesado de Lenguaje Natural
Fernando Muñoz del Nuevo
Ingeniería de telecomunicaciones
Universidad Carlos III
Av. De la Universidad, 30
28911 Leganés (Madrid)
[email protected]
RESUMEN
El siguiente artículo expone el estado actual del procesado del
lenguaje natural y los mecanismos a través de los cuales la
inteligencia artificial es capaz de interactuar con un humano y
no dar sensación de ser una máquina.
Términos Generales
Algoritmos, Lenguaje, Etiquetas,
Sintáctico, Diagrama de Flujo.
Análisis
Morfológico,
Palabras Clave
AIML, PLN, Árboles de Decisión, XML.
1. INTRODUCCIÓN
El ser humano desde que tiene conciencia siempre ha tenido
necesidad de compañía, por ello no es extraño que siempre
haya intentado dotar de vida a lo que le rodea. En éste caso, se
está llegando al punto de crear robots con forma humana, que
se comporten como los humanos y por último que sean capaces
de mantener conversaciones coherentes.
Como se puede observar en la figura 1 los robots han llegado a
un nivel de parecido con el ser humano muy importante.
El procesado del lenguaje natural por el contrario está más lejos
del parecido que se muestra en la imagen. Aún nos
encontramos con las dificultades propias del lenguaje, de la
comprensión del mismo y de las múltiples interpretaciones que
puede tener en función de los diferentes significados de las
palabras dependiendo del contexto en que se encuentren.
La historia del procesado del lenguaje natural (PLN) comienza
cuando a finales de los años cuarenta se comenzó a proponer
sistemas de traducción automática. Dichos sistemas entre los
cuarenta y cincuenta fracasaron debido a la falta de capacidad
de procesamiento en comparación con la complejidad del
lenguaje, posteriormente en los años setenta y ochenta se logra
un nivel aceptable de traducción automática pasando los
objetivos del PLN a los campos de interfaces en lenguaje
natural y procesamiento de textos.
2. OBJETIVOS Y DIFICULTADES
Las interfaces en lenguaje natural pretenden poder dar órdenes
a ordenadores y robots mediante el propio lenguaje ya sea
hablado o escrito de tal modo que personas que por su
casuística no pueden dar órdenes mediante interfaces gráficas lo
puedan hacer a través de la voz o un teclado. Esto tiene mucha
importancia para las personas con discapacidades físicas que no
les permiten ver o actuar con las manos sobre un terminal.
El procesamiento de textos es importante porque la mayor
cantidad de información de la humanidad se encuentra en textos
con la consiguiente importancia de acceder a lo que se desea en
el menor tiempo posible, por ello, un procesado de textos bueno
nos permitirá tener toda la información de cualquier cosa que
deseemos si esta existe.
La traducción automática es uno de los problemas más antiguos
con una gran importancia puesto que de un buen o mal
traductor dependen muchas cosas en determinados ámbitos.
Las dificultades con las que se debe lidiar en el PLN son
importantes y por ello aún no tenemos un PLN perfecto que nos
permita abordar todos los casos anteriormente expuestos.
La dificultad principal es que el lenguaje natural es localmente
ambiguo, y ésta ambigüedad es la que impide un PLN eficaz.
Un ejemplo es la palabra inglesa hit la cual tiene diferentes
significados a partir del contexto:
Figura 1: Andy, robot humanoide femenina.
He hit the nail with the hammer Golpear
The car swerved and hit the tree Chocar
The soldier fired and hit the target Acertar
Por lo tanto el único modo de conocer el significado de la
palabra es a partir del contexto, el cual hay que acotar,
identificar el significado de las demás palabras y reconocer el
significado de la palabra objetivo.
Por otro lado, si lo que se está pretendiendo es buscar
información acerca de algo en concreto, por ejemplo un paro
cardíaco habrá que buscar información no sólo de paros
cardíacos sino también acerca de fallos del corazón,
enfermedades del corazón y demás búsquedas relacionadas para
encontrar la mayor cantidad de información posible.
Además de la ambigüedad léxica existe la ambigüedad
referencial y la ambigüedad estructural. La primera tiene lugar
cuando se utilizan pronombres o sintagmas nominales concisos
para hacer referencia a objetos o eventos descritos previamente.
En estos casos, el sistema de PLN debe determinar la entidad
lingüística previa a que hacen referencia estas anáforas. La
segunda es aún más frecuente; el caso más claro de este tipo de
ambigüedad es el de la ambigüedad en el nivel de dependencia
de los sintagmas preposicionales.
Además a veces se cae en constantes repeticiones y poca
variedad de respuestas que hace aburrida y poco atractiva la
experiencia, por lo tanto el sistema debe tener una gran base de
datos de posibles combinaciones de respuestas y en un
siguiente paso de complejidad, sería muy importante que
pudiera aprender expresiones del usuario para ser mucho más
cercano.
En busca de la generación correcta del lenguaje, los lingüistas
desarrollaron las gramáticas que describen las estructuras
correctas de cada lenguaje (lo que aún complica más el asunto
teniendo en cuenta la gran cantidad de lenguajes y dialectos
existentes en el mundo. Dichas estructuras se representan en
árboles como el que se muestra a continuación:
Todas estas dificultades son las que debe resolver un sistema de
PLN que pretenda dar una sensación de realidad al usuario.
3. COMPONENTES DE UN PLN
Un PLN se compone de la realización de las siguientes tareas:
•
•
•
•
•
•
Análisis Morfológico: Análisis de las palabras para extraer
raíces, rasgos flexivos, unidades léxicas compuestas y
otros fenómenos.
Análisis sintáctico: El análisis de la estructura sintáctica de
la frase mediante una gramática de la lengua en cuestión.
Análisis semántico: La extracción del significado de la
frase, y la resolución de ambigüedades léxicas y
estructurales.
Análisis pragmático: El análisis del texto más allá de los
límites de la frase, por ejemplo, para determinar los
antecedentes referenciales de los pronombres.
Planificación de la frase: Estructurar cada frase del texto
con el fin de expresar el significado adecuado.
Generación de la frase: La generación de la cadena lineal
de palabras a partir de la estructura general de la frase, con
sus correspondientes flexiones, concordancias y restantes
fenómenos sintácticos y morfológicos.
Todas estas tareas deben realizarse paralelamente para obtener
un resultado adecuado porque si esto se realizara mediante un
flujo continuado concatenando dichas operaciones el resultado
no sería adecuado.
Figura 2: Ejemplo de árbol de gramática inglesa para
la oración “The little boy ran quickly”.
A partir de ésta forma de representación introducimos el
sistema de etiquetado para expresar mediante un lenguaje la
gramática y así un ordenador sea capaz de expresarse. Esto nos
lleva al lenguaje AIML.
4. ARTIFICIAL INTELLIGENCE
MARKUP LANGUAGE (AIML)
AIML se desarrolló desde 1995 hasta 2000 por parte de Dr.
Richard Wallace y la comunidad de código abierto Alicebot. Es
un lenguaje basado en XML que es sencillo de aprender y
permite crear en poco tiempo una entidad parlante.
Las partes más importantes del lenguaje son:
•
•
•
•
<aiml>: Es un tag que indica el comienzo de un trozo de
código AIML.
<category>: Identifica una unidad de conocimiento.
<pattern>: Identifica un patrón concreto de una
determinada oración.
<template>: Contiene la respuesta a una determinada
entrada del usuario.
Un ejemplo de una arquitectura de un PLN es el siguiente:
Un ejemplo de un código en AIML es el siguiente:
El usuario le expresa al ordenador sus deseos.
La computadora analiza las oraciones proporcionadas.
Se realiza el análisis pragmático del texto y proporciona una
respuesta final.
<category>
<pattern>WHAT ARE YOU</pattern>
<template>
<think><set name="topic">Me</set></think>
I am the latest result in artificial intelligence,
which can reproduce the capabilities of the human brain
with
greater
speed
and
accuracy.
</template>
</category>
El siguiente paso que se debe analizar para comprender la
dificultad a la que nos exponemos es la de la generación del
lenguaje, ya sean textos o voces.
No podemos pensar que simplemente por fuerza bruta se puede
resolver el problema, hay que tener en cuenta el uso de
pronombres, sinónimos, palabras adecuadas en determinados
contextos y una jerga concreta para dar una experiencia
adecuada al usuario.
Éste es un ejemplo del tipo de respuesta que daría el robot en
caso de detectar un patrón que le pregunte por qué es.
La completa definición del lenguaje se encuentra en la
referencia bibliográfica [7].
4.
Uno de los problemas más comunes en la identificación
del lenguaje son los errores de escritura o las
contracciones, un ejemplo de ello es en el inglés “your”
que en la mayoría de los casos se traduciría por “you’re” o
“you are” por lo tanto no todas las ocurrencias se traducen
por lo mismo. Para ello debe buscarse algo de contexto, el
cuál se codifica así.
En cualquier caso, un pequeño resumen de los modos de
actuación en AIML son los siguientes:
1.
Reducción Simbólica
Consiste en reducir expresiones complejas a expresiones
más simples que coincidan en significado, por ejemplo, la
reducción de ¿Sabes quién es Zapatero? a ¿Quién es
Zapatero? Se trata de dos oraciones con el mismo
significado pero con formaciones distintas por lo tanto se
produce a identificar oraciones largas en patrones más
cortos de tal modo que sea más sencillo su tratamiento
posterior.
<category>
<pattern>YOUR A *</pattern>
<template>I think you mean "you’re" or "you are" not
"your."
<srai>YOU ARE A <star/></srai>
</template>
</category>
<category>
<pattern>DO YOU KNOW WHO * IS</pattern>
<template><srai>WHO IS <star/></srai></template>
</category>
En éste caso el programa corregiría la ambigüedad para
adaptarse a lo correcto.
5.
2.
Palabras Clave
Divide y Vencerás
Frecuentemente debemos activar un trozo de código
cuando aparece determinada palabra que corresponde a
unas determinadas acciones muy particulares. El siguiente
ejemplo se incluyó por primera vez en ELIZA
Una oración que se componga de dos sub-oraciones como
por ejemplo cualquiera que se componga de una
afirmación y un posterior comentario a dicha información
se puede dividir en dos de tal modo que se analicen por
separado y así conseguir una mejor experiencia.
<category>
<pattern>MOTHER</pattern>
<template> Tell me more about your family. </template>
</category>
<category>
<pattern>YES *</pattern>
<template><srai>YES</srai> <sr/></template>
</category>
3.
Deletreado y Correción Gramática.
<category>
<pattern>_ MOTHER</pattern>
<template><srai>MOTHER</srai></template>
</category>
Sinónimos
AIML no permite más de un patrón por categoría, por lo
tanto para integrar sinónimos (una de las aplicaciones más
usadas del lenguaje) se hace del siguiente modo:
<category>
<pattern>HELLO</pattern>
<template>Hi
</category>
<category>
<pattern>MOTHER _</pattern>
<template><srai>MOTHER</srai></template>
</category>
there!</template>
<category>
<pattern>_ MOTHER *</pattern>
<template><srai>MOTHER</srai></template>
</category>
<category>
<pattern>HI</pattern>
<template><srai>HELLO</srai></template>
</category>
<category>
<pattern>HI
THERE</pattern>
<template><srai>HELLO</srai></template>
</category>
<category>
<pattern>HOWDY</pattern>
<template><srai>HELLO</srai></template>
</category>
<category>
<pattern>HOLA</pattern>
<template><srai>HELLO</srai></template>
</category>
En el primer caso detectamos la categoría y aplicamos la
regla general, en la segunda categoría tenemos la palabra
como sufijo y aplicamos la regla de distinta forma.
6.
Condicionales
Existe la posibilidad de utilizar condicionales para en
función de la proveniencia de la frase responder con reglas
distintas.
<category>
<pattern>WHO IS HE</pattern>
<template><srai>WHOISHE<getname="he"/></srai></te
mplate>
</category>
<category>
<pattern>WHOISHE *</pattern>
<template>He is <get name="he"/>.</template>
</category>
<category>
<pattern>KNOCK KNOCK</pattern>
<template>Who is there?</template>
</category>
<category>
<pattern>WHOISHE UNKNOWN</pattern>
<template>I don’t know who he is.</template>
</category>
7.
<category>
<pattern>*</pattern>
<that>WHO IS THERE</that>
<template><person/> who?</template>
</category>
Targeting
El targeting es el proceso mediante el cual el bot aprende
en relación con las conversaciones que tiene con el usuario
y el creador del bot. La mejor manera de exponer el
proceso es el siguiente ejemplo:
<category>
<pattern>*</pattern>
<that>* WHO</that>
<template>Ha
ha
very
name="name"/>.</template>
</category>
User: Where do I find the webpage with Australopithecus?
Alice: Where do you want to find it?
funny,
<get
User: Bad Answer Alice, time to Learn a new Line
Produce el siguiente diálogo:
Alice: How would you answer "Where do I find the
webpage with Australopithecus?"
C: Knock knock.
R: Who’s there?
C: Banana.
R: Banana who?
C: Knock knock.
R: Who’s there?
C: Banana.
R: Banana who?
C: Knock knock.
R: Who’s there?
C: Orange.
R: Orange who?
C: Orange you glad I didn’t say banana.
R: Ha ha very funny, Nancy.
User: I would say:
"http://www.ancientskulls.net/australopithecus.html"
Alice: Thanks, human. Try asking me again.
User: Where do I find the webpage with Australopithecus?
Alice: http://www.ancientskulls.net/australopithecus.html
De éste modo se muestra cómo enseñar al bot a responder
de acuerdo a las preguntas realizadas por el usuario.
Este escenario por supuesto tiene muchas interrogantes
como qué ocurriría si se dejara éste proceso de aprendizaje
abierto a los usuarios y el peligro de que Hackers crearan
respuestas con contenidos inadecuados y demás ataques.
8.
La palabra clave “that” en AIML se refiere a la última
referencia del robot, en caso de tener una respuesta de
múltiples oraciones, “that” se refiere a la última frase.
Un ejemplo es el siguiente:
R: Today is yesterday.
C: That makes no sense.
R: The answer is 3.1412926 approximately.
C: That is cool.
<category>
<pattern>YES</pattern>
<that>DO YOU LIKE MOVIES</that>
<template>What is your favorite movie?</template>
</category>
Esta categoría se active cuando el cliente dice YES. El
robot intenta saber a qué está diciendo YES, si la pregunta
es ¿Te gustan las películas? La categoría coincidirá y la
respuesta ¿Cuál es tu película favorita? será la que
continúe la conversación por parte del bot.
Una aplicación interesante de éstas categorías es que
permite al robot responder a determinadas bromas:
9.
Estructura “Topic”
La estructura “Topic” nos permite adoptar diferentes
preguntas y respuestas en función de un tema concreto de
tal manera que cuando se converse acerca de una
determinada cuestión, la respuesta pueda ser distinta:
topic name="CARS">
<category>
<pattern>*</pattern>
<template>
<random>
<li>What’s your favorite car?</li>
<li>What kind of car do you drive?</li>
<li>Do you get a lot of parking tickets?</li>
<li>My favorite car is one with a driver.</li>
</random>
</template>
En éste caso el bot respondería aleatoriamente entre alguna
de las cuestiones anteriores en cuanto detecte el tema
coches.
A partir de todos los patrones anteriores y aplicando las
técnicas anteriormente expuestas podemos desarrollar un bot
que de cierta sensación de inteligencia respondiendo
adecuadamente a un gran número de cuestiones.
Un ejemplo de diagrama de flujo atendiendo a los anteriores conceptos es el siguiente:
Figura 3: Diagrama de flujo del sistema de respuesta del bot utilizando AIML
5. EL CEREBRO DE ALICE
Si hacemos una representación neuronal de los árboles de
decisión que puede tener el ALICE tenemos diferentes
imágenes en función de los programas que tengan cargados que
nos muestra el desarrollo de su “cerebro”.
Figura 4: Cerebro de ALICE de 24000 categorías con
factor de podado de primera categoría de 2000 y de
segunda categoría de 2. [9]
Figura 6: Cerebro de ALICE mostrado en espiral.
Las zonas con mayor cantidad de hojas representan
las relaciones con las palabras Quién, Dónde, Qué,
Cuándo… [9]
6. ESTADO ACTUAL DE DESARROLLO
DE BOTS
En la actualidad se está desarrollando una gran cantidad de bots
entre los cuales se encuentran los siguientes con sus respectivas
direcciones para informarse.
Proyecto: Pandorabots
URL: http://www.pandorabots.com
Director: Dr. Doubly Aimless
Información Adicional: Free web based bot hosting
Figura 5: ¼ del cerebro de ALICE correspondiente a
Srai.aiml. Cerca de 2000 patrones. [9]
Proyecto: Oddcast, Inc.
URL: http://www.oddcast.com
Director: Adi Sideman, CEO
Información Adicional: Vhost animated avitars with AIMC
Proyecto: Media Semantics / HostABot.com
URL: http://www.mediasemantics.com
Director: Doug Copeland
Información Adicional: Flash characters and AIML engine
URL: http://www.monigarr.com
Director: Monica Peters
Información Adicional: develops chatbots to learn and teach
any language
Proyecto: AIML Scripting Resourcee
URL: http://www.aiml.info
Director: Anne Kootstra
Información Adicional: Articles, links and downloads
Proyecto: Shadowbots
URL: http://www.shadowbots.com/
Director: Karen Gibbs
Información Adicional: Eggdrop TCL scripts to publish ALICE
bots on TalkCity (formerly Dawnhosting.com/bots)
Proyecto: Aitools
URL: http://www.aitools.org
Director: Noel Bush
Información Adicional: Program D downloads and info
Proyecto: Artificial Intelligence Nexus
URL: http://www.knytetrypper.com/ain.html
Director: Richard Gray
Información Adicional: Link site for Alicebots
Proyecto: J-Alice
URL: http://j-alice.sourceforge.net/
Director: Jonathan Roewen
Información Adicional: Program J: AIML in C++ with IRC
client
Proyecto: AIMLPad
URL: http://www.aimlpad.com
Director: Gary Dubuque
Información Adicional: Program N: AIML in C++ with
extensions for MSAgent and more
Proyecto: PASCALice and AIML Tools
URL: http://www.sweb.cz/alicebot/
Director: Kim Sullivan
Información Adicional: Program P: AIML in Pascal and
Shadowchecker
Proyecto: Program E
URL: http://sourceforge.net/projects/programe/
Director: Sean Elias, Anne Kootstra, Paul Rydell
Información Adicional: AIML in PHP
Proyecto: Virtualitas
URL: http://www.virtualitas.net/perl/aiml/
Director: Ernest Lergon
Información Adicional: Program V: AIML in Perl in Apache
environment
Proyecto: Pyaiml
URL: http://pyaiml.sourceforge.net/
Director: Cort Stratton
Información Adicional: Program Y: AIML in Python
Proyecto: AimlBot
URL: http://www.windowpane.com/alice/
Director: Conan Callen
Información Adicional: allows VB developers to create new
front ends and applications
Proyecto: CyN
URL: http://www.daxtron.com/123start.htm?Cyn
Director: Kino Coursey
Información Adicional: merger of AIML with the OpenCyc
inference engine
Proyecto: Onkwehonwehneha A.I.
Proyecto: Searchers: Ask?
URL: http://www.searchers.com/ask/
Director: Kym Kinlin
Información Adicional: Intelligent NLP Search Engine based
on AIML and
Haptek
Proyecto: VirtualFem
URL: http://www.virtualfem.com/
Director: Mike, Developer
Información Adicional: This site contains adult-oriented
material
Proyecto: Charliebot
URL: https://sourceforge.net/projects/charliebot/
Director: Josip Almasi
Información Adicional: based on ALICE, ANNA v7.0, and
Program D
Proyecto: Robot-Hosting
URL: http://www.robot-hosting.com
Director: Tom Davies, Marketing Director
Información Adicional: V-bots use AIML, Haptek chacters, and
other systems
Proyecto: Intellibuddy
URL: http://www.intellibuddy.com/
Director: Rami Mayron, Chief Executive Officer
Información Adicional: uses Oddcast Vhosts
Proyecto: TrillAlice
URL: http://www.estmatic.net/category/trillalice/
Director: Esteban Aparicio, Project Director
Información Adicional: AIML plugin for Trillian IM
Proyecto: The Bot Factory
URL: http://www.thebotfactory.com/
Director: Tom Delanoy
Información Adicional: Flash interfacce with lip synch
Proyecto: ChatterBean
URL: http://chatterbean.bitoflife.cjb.net/
Director: Helio Perroni Filho
Información Adicional: Java AIML interpreter
Proyecto: libaiml
URL: http://omicron.at4x.net/
Director: Omicron
Información Adicional: C++ AIML interpreter
Entre los chatbots de aficionados y grupos universitarios de
desarrollo se realiza un torneo, éste torneo tiene como premio el
“Loebner Prize” que sería de 100000 $ para el ganador si éste
es totalmente indistinguible de un humano en una conversación
larga. A ésa máquina se podrá decir que “piensa”, aunque de
momento ninguno ha ganado dicha medalla, el premio de
bronce se da a la mejor de las máquinas presentadas. Los
últimos ganadores son los siguientes:
2000 Richard Wallace (ALICE)
2001 Richard Wallace (ALICE)
2002 Kevin Copple
2003 Juergen Pirner
2004 Richard Wallace (ALICE)
2005 Rollo Carpenter
2006 Rollo Carpenter
2007 Robert Medeksza
2008 Fred Roberts and Artificial Solutions
2009 David Levy
de necesidades humanas a través de robots con una
comprensión del lenguaje cercana a la que un humano tiene.
Aunque todavía falta mucho para lograr el robot que piensa, si
podemos decir que el aprendizaje del lenguaje verbal es cada
vez mayor y su perfeccionamiento nos abrirá un nuevo nivel en
lo que a IA se refiere.
De momento, el robot más desarrollado del mundo es Albert
Hubo.
7. APLICACIONES Y CONCLUSIONES
Las aplicaciones en las que puede ser útil además del mero
disfrute de tener una máquina que sea capaz de responder
coherentemente a cualquier pregunta son las siguientes:
7.1 Personas discapacitadas.
Los desarrollos de sistemas de reconocimiento de voz y habla
basados en la AIML pueden ser muy útiles para que personas
con algún tipo de discapacidad física puedan relacionarse con
una máquina que les facilite su vida dentro de su casa, o fuera
de la misma. Un ejemplo sería el caso de un invidente en su
casa pudiera preguntar al robot central de la casa si llueve o no,
si hay algún obstáculo en su camino (todo esto combinado con
otro tipo de AI no explicadas en este artículo).
Otro ejemplo sería el caso de una persona de movilidad
reducida que pudiera haber tenido algún incidente lejos del
teléfono, simplemente hablando con el robot podría ponerse
éste en contacto con emergencias para recibir ayuda
convenientemente.
7.2 Coducción de vehículos
Puesto que gestionar un GPS con las manos mientras se
conduce está prohibido y es peligroso, un bot que tuviera un
buen reconocimiento verbal e interpretara adecuadamente las
frases del conductor podría perfectamente orientar al conductor
siendo interpelado por éste de tal modo que encuentre su
destino sin necesidad de desviar la mirada de la carretera.
También puede ser útil para otro tipo de controles como
intermitentes, limpiaparabrisas, la radio, DVD de los asientos
traseros y demás interacciones que distraen de la conducción.
Además, el ordenador podría a través de nuestras órdenes
verbales conectarse a la información del tráfico para corregir la
trayectoria y encontrar el trayecto más adecuado sin necesidad
de soltar las manos del volante.
Además de éstas aplicaciones, en función del desarrollo y
perfeccionamiento del lenguaje que sean capaces de alcanzar
los robots podremos llegar a utilizarlos para reducir la
sensación de soledad en personas con tendencia a la depresión,
robots que reaccionen instantáneamente y de forma adecuada a
las órdenes de sus dueños/jefes y demás aplicaciones que
podrían parecernos de ciencia ficción.
7.3 Conclusiones
A modo de conclusiones se puede decir que la IA en éste
campo está en pleno desarrollo y pretende cubrir una gran parte
Figura 7: Albert Hubo, el robot más avanzado hasta
el momento.
Sus funciones lingüísticas están desarrolladas y se puede ver un
video de presentación en el link a continuación:
http://hubolab.kaist.ac.kr/index.php
8. REFERENCIAS
[1] http://upload.wikimedia.org/wikipedia/commons/1/16/A
ctroid-DER_01.jpg
[2] http://cvc.cervantes.es/obref/congresos/sevilla/tecnologi
as/ponenc_carbonell.html
[3] http://es.wikipedia.org/wiki/Procesamiento_de_lenguaje
s_naturales
[4] http://www.monografias.com/trabajos17/lenguajenatural/lenguaje-natural.shtml
[5] http://es.wikipedia.org/wiki/AIML.html
[6] http://www.alicebot.org/aiml.html
[7] http://alicebot.org/TR/2005/WD-aiml/WD-aiml-1.0.1008.html
[8] http://www.pandorabots.com/pandora/pics/wallaceaimlt
utorial.html
[9] http://www.alicebot.org/documentation/gallery/
[10] http://alicebot.org/TR/2005/WD-aiml/WD-aiml-1.0.1008.html
[11] http://en.wikipedia.org/wiki/Albert_Hubo
Descargar