Understanding Natural Language with LUIS

Understanding Natural Language with LUIS

Microsoft Bot Framework has provided a tool for our applications to interact with users through Skype, Facebook or other channels conversation, but this possibility is useless if our Bots are not able to at least partially understand natural language.

This is where one of the cognitive services in the cloud that Microsoft offers, called Language Understanding Intelligence Service (LUIS) acquires great importance. This service allows our bots to be able to analyze and understand our words. It is an API that from a sentence generates an output in the form of “intents” that we can analyze in our application and link those intentions to different actions in our code.

In order to allow LUIS recognize intentions from statements we must generate a model where we create our intentions and train it by providing examples of sentences that make sense in each of those actions.

How do we generate the model?

The first thing to do to use this service is to register our model of LUIS in the portal provided by Azure to access this functionality. To do this we must log on to www.luis.ai, log in with a Microsoft account and create a new model.

As an example we will develop a model that recognizes intentions for a ticket purchase and sales system. First, we will indicate the possible intentions that our bot must understand. These can be buy, book, etc. The first thing we are going to do is to add the “BuyPassage” intent by selecting the AddIntent option in the Intents menu and entering its corresponding name.



Then we add the entities that are important words in the expressions that describe the information relevant to the intention. It is information included in the sentences that our bot will then use to specify the requested information.

For example, in the statement “I would like to buy a ticket to Montevideo” we have a Montevideo entity that is Destination type. When returning the analysis of this statement, LUIS will inform us that the intention of the user is to buy a ticket (intent) to Montevideo (entity).

LUIS offers different types of entities:

  • “Prebuilt”: These are entities pre-established by LUIS that represent common concepts such as dates, hours, etc.
  • “List”: They are a fixed set of synonyms or related words in our system. Each list entity can have one or more synonyms. These entities are not trained by the system but are used when we want to define a different ways of representing the same concept. This is an explicitly specified list of values. Unlike other types of entities, LUIS does not deduce additional values for the entities in the list during training, but recognizes only those in the list.
  • “Simple”: is a generic entity that describes a single concept. In the case of the example “Destination” is a simple entity.
  • “Hierarchical”: A hierarchical entity defines a category and its members. It allows to define relationships between entities based on hierarchical or inherited patterns where a generic entity acts as parent and the child are subtypes of it that share the same characteristics. For example, if in our model we would like to recognize different kinds of passages.    We could enter the entity “Class” including “Common”, “BusinessClass” or “Executive” as daughter entities that represent the class of the passage. To add a hierarchical “Entity” we select the Hierarchical type and add the corresponding child entities.


  • “Composite”: A composite entity is composed of other entities that are part of a whole, created by combining two or more existing entities. Unlike a hierarchical entity in a composite entity, their child will not share common characteristics. It help LUIS identify the entities of the group, as well as individually.

How do we train the model?

Once we have the different intentions and their corresponding entities, it is time to enter different example sentences, from which we will train our model.

For this we select our “Intent” and we add new utterances (Utterances). Here we must introduce different example sentences to the intention we want to transmit. When we enter each sentence the system will recognize the entities and allow us to label them manually when they are not recognized. To do this, we select the word or words that represent the entity that we want to tag, and a drop-down will appear with the “entities” to select the one that corresponds (see image below).


Once we have entered enough elements we must tell LUIS engine to study our system and prepare for publication. To do this, press the button “Train & Test”. Once this is done, the system will study the model as soon as resources are available. In this view we can also test our system.

How do we use it?

Finally, we will publish the model so that LUIS generates a REST service and specifies a query URL. We must consider this address to then make the query from an application Bot Framework.

In the following image we can see a JSON result of the REST service where the most probable intent appears together with a list of the relevant entities according to our statement. In addition, the JSON indicates for each of the attempts and entities the probability assigned by LUIS. In this way we will have enough data for our application to do the rest of the work.



Using LUIS for the development of Bots officiates as a natural language translator expressed by people to a model that can be interpreted by our applications. Even though the example was oriented to its use for the development of a Bot, the application of LUIS is not limited to this type of technology, but is recommended for any application that requires the interpretation of natural language.

Interpretando el Lenguaje Natural con  LUIS

Microsoft Bot Framework nos ha brindado una herramienta para que nuestras aplicaciones interactúen con los usuarios a través de una conversación por skype, facebook u otros canales, pero de nada sirve esta posibilidad si nuestros Bots no son capaces de al menos parcialmente de comprender lenguaje natural.

Es aquí donde adquiere gran importancia uno de los servicios cognitivos en la nube que nos brinda Microsoft llamado Language Understanding Intelligence Service (LUIS), que permite que nuestros bots sean capaces de analizar e interpretar nuestras palabras. Se trata de una API que a partir una frase genera una salida en forma de “intenciones” (intents) que podremos analizar en nuestra aplicación y vincular esas intenciones a diferentes acciones en nuestro código.

Para permitir que LUIS reconozca intenciones a partir de enunciados debemos generar un modelo en donde creamos nuestras intenciones y lo entrenamos proporcionando ejemplos de frases que tengan sentido en cada una de esas acciones.

¿Cómo generamos el modelo?

Lo primero que debemos hacer para utilizar este servicio es registrar nuestro modelo de LUIS en el portal brindado por Azure para acceder a dicha funcionalidad. Para ello debemos ingresar a www.luis.ai,  iniciar sesión con una cuenta de Microsoft y crear un nuevo modelo.

A modo de ejemplo desarrollaremos un modelo que reconozca intenciones para un sistema de compra y ventas de pasajes. En primer lugar, indicaremos las posibles intenciones que debe interpretar nuestro bot. Estas pueden ser comprar, reservar, etc. Lo primero que vamos a hacer es agregar el intent “ComprarPasaje” seleccionando la opción AddIntent en el menú Intents e ingresando su respectivo nombre.


Luego agregamos las entidades que son palabras importantes en las expresiones que describen la información relevante para la intención. Es información incluida en las frases que nuestro bot utilizará luego para concretar la información solicitada.

Por ejemplo, en el enunciado “Desearía comprar un pasaje a Montevideo” tenemos una entidad  Montevideo que es de tipo Destino. Al devolver el análisis de este enunciado, LUIS nos informará que la intención del usuario es comprar un pasaje (intent) a Montevideo (entity).

LUIS ofrece diferentes tipos de entidades:

  • “Prebuilt”: Son entidades preestablecidas por LUIS que representan conceptos comunes como fechas, horas, etc.
  • “List”: Son un conjunto fijo de sinónimos o palabras relacionadas en nuestro sistema. Cada entidad lista puede tener uno o más sinónimos. Estas entidades no son entrenadas por el sistema sino que son utilizadas cuando queremos definir un conjunto conocido de las diferentes  formas de representar el mismo concepto. Es una lista especificada de forma explícita de los valores. A diferencia de otros tipos de entidades, LUIS no deduce valores adicionales para las entidades de la lista durante el entrenamiento sino que reconoce solamente las que están en la lista.
  • “Simple”: es una entidad genérica que describe un solo concepto. En el caso del ejemplo se “Destino” se trata de una entidad simple.
  • “Hierarchical”: Una entidad jerárquica define una categoría y sus miembros. Permite definir relaciones entre las entidades basadas en los patrones jerárquicos o hereditarios donde una entidad genérica actúa como padre y los hijos son subtipos de él que comparten las mismas características. Por ejemplo, si en nuestro modelo quisiéramos reconocer diferentes clases de pasajes. Podríamos ingresar la entidad “Clase”  incluyendo “Común”, “SuperCama” o “Ejecutivo” como entidades hijas que representan la clase del pasaje. Para agregar una “Entity” jerárquica seleccionamos el tipo Hierarchical y agregamos las correspondientes entidades hijas.


  • “Composite”: Una entidad compuesta se compone de otras entidades que forman parte de un todo, se crea combinando dos o más entidades existentes. A diferencia de una entidad jerárquica una entidad compuesta sus hijos no van a compartir características comunes. Ayuda a LUIS identificar las entidades del grupo, así como también de forma individual.

¿Cómo entrenamos el modelo?

Una vez que tenemos las diferentes intenciones y sus respectivas entidades, llega el momento ingresar diferentes frases de ejemplo, a partir de las cuales se va a entrenar nuestro modelo.

Para ello seleccionamos nuestro “Intent” y le agregamos nuevos enunciados (Utterances). Aquí debemos introducir diferentes frases de ejemplo a la intención que queremos transmitir. Cuando ingresemos cada frase el sistema reconocerá las entidades y nos permitirá etiquetarlas manualmente cuando no sean reconocidas. Para ello, seleccionamos la palabra o las palabras que representan la entidad que queremos etiquetar, y aparecerá un desplegable con las “entities” para que seleccionemos la que corresponda (ver imagen).


Una vez hayamos ingresado suficientes elementos debemos indicarle al motor de LUIS que estudie nuestro sistema y se prepare para la publicación. Para ello, pulsaremos el botón “Train & Test”. Hecho esto, el sistema estudiará el modelo en cuanto tenga recursos disponibles. En esta vista también podemos testear nuestro sistema.

¿Cómo lo utilizamos?

Por último, publicaremos el modelo, para que LUIS genere un servicio REST y nos indique una URL de consulta. Debemos tener en cuenta esta dirección para luego hacer la consulta desde una aplicación de Bot Framework.

En la siguiente imagen podemos ver un JSON resultado del servicio REST donde aparece el intent más probable acompañado de una lista de las entidades relevantes según nuestro enunciado. Además, el JSON indica para cada uno de los intentos y entidades la probabilidad asignada por LUIS. De esta manera dispondremos de suficientes datos para que nuestra aplicación haga el resto del trabajo.



El uso de LUIS para el desarrollo de Bots oficia de traductor del lenguaje natural expresado por las personas a un modelo que pueda ser interpretado por nuestras aplicaciones. Si bien el ejemplo fue orientado a su utilización para el desarrollo de un Bot, la aplicación de LUIS no se limita a este tipo de tecnologías, sino que es recomendada para cualquier aplicación que requiera la interpretación del lenguaje natural.




Share This