Skip to content

bender_nlp

Matías Pavez edited this page May 8, 2017 · 1 revision

1. bender_nlp

El paquete bender_nlp contiene los archivos necesarios para el análisis de texto y generación de ordenes para la prueba GPSR de la RoboCup.

1.1 Requisitos

1.1.1 Instalación de MBSP

  1. Descargar la última versión de MBSP (actualmente, la última versión es la 1.4)
  2. Descomprimir e instalar
$ unzip MBSP_1.4.zip
$ cd MBSP
$ python setup.py install

1.1.2 Uso

Para su ejecución y uso, solo basta con hacer una llamada a la clase con la oración a analizar como valor de inicialización. Falta hacer los cambios necesarios para su integración con ROS

  • Desde la línea de comandos
>>> from bender_nlp import GenerateOrder
>>> sens = "go to the bedroom find Mia and follow her" #Puede ser cualquier oracion
>>> s = GenerateOrder(sens)
  • Desde ejecutable Es necesario cambiar la oración a analizar en el main del código, que se almacena en la variable "sens". Para ver los resultados, descomentar la función s.show()
$ python bender_nlp.py
go to the bedroom find Mia and follow her
===========================
Verbs:        go                      find                    follow
People:                               Mia                     Mia
Objects:
Places:       bedroom
Information:

1.1.3 Formato de datos de entrada

Las oraciones, para que funcionen bien con la libreria, deben seguir un formato mínimo:

  • Las oraciones no tienen puntuación (ya sean comas, puntos u otros símbolos)
  • Las oraciones no tienen mayúsculas salvo para el caso de nombres propios. Esto es importante ya que de venir en minúsculas, el algoritmo puede no entender que dicha palabra es un nombre propio y relacionarlo con verbos u otros tipos (lo que repercute en un mal resultado)

1.2 Lista de verbos aceptados

Actualmente, la lista de verbos aceptados se dividen entre los valores de entrada y de salida. Los de entrada, hacen referencia a las oraciones que son recibidas por el código, mientras que las de salida corresponden a las máquinas de estado procesadas por Bender.

  • Verbos de Entrada:
    1. Go, Move, Navigate
  1. Leave
  2. Answer
  3. Carry
  4. Introduce
  5. Ask
  6. Tell, Say
  7. Find, Locate
  8. Follow
  9. Look
  10. Grasp, Take
  11. Bring
  12. Place, Put
  13. Give
  14. Guide
  15. Get, Pick
  16. Deliver
  17. Escort
  • Verbos de Salida:
    1. Go (Ir a lugar o a donde está 'yo')
  1. Find (Encontrar a persona que no sea 'yo')
  2. Search (Buscar y tomar objeto)
  3. Tell (Hablar sobre el tema indicado)
  4. Leave (Dejar lugar indicado)
  5. Ask (Preguntar algún tema)
  6. Follow (Seguir a quien se le solicite)
  7. Answer (Responder pregunta indicada)
  8. Place (Dejar objeto en algún lugar)
  9. Give (Darle objeto a alguien)
  10. Introduce (Presentarse a si mismo o a otra persona)
  11. Guide (Guiar a alguien a algún lugar -desde donde se encuentra actualmente-)

1.3 Descripción de Códigos

A continuación se incluye un detalle general del funcionamiento de cada uno de los códigos realizados.

1.3.1 bender_nlp/bender_nlp.py

  1. init(self, sentence) : Recibe como entrada la oración a analizar. Es el iniciador de la clase y no genera datos de salida.
  2. add_order(self, verb, info, data) : Recibe como entrada el verbo, el tipo de información a almacenar y la información como tal. Sin datos de salida. Determina en que lista almacenar la información obtenida como entrada, para el correcto funcionamiento del sistema.
  3. parse_sentence(self, sentence) : Recibe como entrada a la oración dada a la clase. Genera como salida una lista de sub-oraciones en base a la oración de entrada. Se encarga de dividir la oración de entrada en sus sub-oraciones correspondientes.
  4. obtain_information(self, chunk) : Recibe como entrada el resultado del parser de texto, con las palabras y sus etiquetas. Genera como salida una tupla (verb, sv_aux, sto_aux, sin_aux) con la información relevante de la sub-oración. Se encarga de analizar la estructura de cada sub-oración para asignar correctamente la información necesaria para el funcionamiento
  5. generate_list(self,verb,oi) : Recibe como entrada la etiqueta del verbo y la lista de datos contenidos en la sub-oración analizada. Sin datos de salida. Se encarga de almacenar la información en las listas de la clase, según los datos obtenidos de los archivos de configuración
  6. filter_sentences(self,sentences) : Recibe como entrada alguna sub-oración. Sin datos de salida. Realiza la asignación de etiquetas según la estructura de cada sub-oración
  7. replacePRP(self) : Sin datos de entrada ni salida. Realiza el reemplazo de los pronombres por las personas u objetos que representan.

1.3.2 config/verb_list.conf

Lista de configuración para cada verbo. Esta información se estructura con una etiqueta correspondiente al verbo más un número (por ejemplo, "find_1"). Esto dado que en algunos casos, los verbos pueden tener más de una estructura gramatical que debe ser consistente (en el caso de "find" o "locate", se considera que tiene 4 estructuras: 1. buscar persona, 2. buscar objeto, 3. buscar a persona en algún lugar y 4. buscar un objeto en algun lugar).

Además, cada etiqueta de verbo posee una cierta cantidad de acciones que será específica para cada etiqueta y verbo, pudiendo haber desde una hasta muchas acciones (sin un límite máximo).

Las acciones poseen tres valores separados por coma: 1. verbo, 2.tipo de dato, 3.Posición de la información:

  1. Verbo: Corresponde al verbo necesario para realizar la acción determinada

  2. Tipo de Dato: Corresponde a la lista donde la información debe ser almacenada. Estas listas son: "People", "Objects", "Places" o "Information" y se relacionan con la lista en la que se almacena la información de la clase.

  3. Posición de la Información: Hace referencia a que ubicación tiene la información que debe almacenarse en las oraciones. Usualmente, las oraciones contienen información directamente ligada al verbo, ligada a un tipo "TO" o ligada a un tipo "IN":

    1. La información en posición "0" siempre es verbo
  4. La información en posición "1" se considera como "ligada al verbo" (por ejemplo, en 'find a knife', 'knife' se considera como "ligada al verbo" ya que no está después de un tipo "TO" o "IN" en la oración)

  5. La información en posición "2" se considera como "ligada a TO" (por ejemplo, en 'go to the kitchen', 'kitchen' se considera como "ligada a TO", ya que va después de una palabra de etiqueta TO -que se asigna en el parser-)

  6. La información en posición "3" se considera como "ligada a IN" (por ejemplo, en 'place it on the tv-stand', se considera a 'tv-stand' como "ligada a IN", ya que va después de 'on' que es de etiqueta IN -que es asignada por el parser-). En pocos casos, pueden existir dos "IN" en una misma oración y en cuyo caso, el primer "IN" es almacenado como si fuera un "TO".

Tomando en cuenta esto y la oración: "find the pointing left person in the dining room", su información se almacenará como:

  1. Posición 0: 'find'
  2. Posición 1: 'pointing left person'
  3. Posición 2: ''
  4. Posición 3: 'dining room'

por lo que la primera acción (en el archivo de configuración) que ejecutará será: "go,place,3", que dirá que "vaya a dining room".

1.4 Tareas no consideradas

Dentro del funcionamiento del paquete, hay ciertos elementos que no se tienen en consideración en su funcionamiento:

  • Corroboración de información: El algoritmo no revisa si la información recibida es correcta o incorrecta. Asume, que es consistente.