<jupyter_start><jupyter_text>Language Understanding

Cada día, aumentan las expectativas de que los equipos informáticos puedan usar la inteligencia artificial para comprender comandos escritos o hablados en lenguaje natural. Por ejemplo, cuando queremos implementar un sistema de automatización en el hogar que nos permita controlar dispositivos mediante comandos de voz como “enciende las luces” o “activa el ventilador” y que un dispositivo de inteligencia artificial pueda entender el comando y realizar la acción solicitada.

![Un robot escuchando](./images/language_understanding.jpg)

 Crear recursos de creación y predicción

Microsoft Cognitive Services incluye el servicio Language Understanding, que permite definir *intenciones* aplicadas a *entidades* basadas en *expresiones*. 

Para usar el servicio Language Understanding, necesitará dos tipos de recursos:

- Un recurso de *creación*: usado para definir, entrenar y probar el modelo de lenguaje. Este debe ser un recurso **Language Understanding - Authoring** en su suscripción de Azure.
- Un recurso de *predicción*: se utiliza para publicar el modelo y administrar las solicitudes de aplicaciones de clientes que lo usan. Este puede ser un recurso de **Language Understanding** o de **Cognitive Services** en su suscripción de Azure.

Puede usar un recurso de **Language Understanding** o de **Cognitive Services** para *publicar* una aplicación de Language Understanding, pero debe crear un recurso independiente de **Language Understanding** para *crear* la aplicación.

> **Importante**: Los recursos de creación se deben generar en una de estas tres *regiones*: (Europa, Australia o EE. UU.). Los modelos creados en recursos de creación de Europa o Australia solo se pueden implementar en recursos de predicción de estas regiones. Los modelos creados en recursos de creación de EE. UU. se pueden implementar en recursos de predicción en cualquier ubicación de Azure que no sea Europa ni Australia. Consulte la [documentación sobre regiones de creación y publicación](https://docs.microsoft.com/azure/cognitive-services/luis/luis-reference-regions) para saber más sobre cómo seleccionar las ubicaciones de creación y predicción.

1. En la pestaña de otro explorador, abra Azure Portal ([https://portal.azure.com](https://portal.azure.com)) e inicie sesión con su cuenta de Microsoft.
2. Haga clic en **+ Crear un recurso** y busque *Language Understanding*.
3. En la lista de servicios, haga clic en **Language Understanding**.
4. En la hoja **Language Understanding**, haga clic en **Crear**.
5. En la hoja **Crear**, escriba la siguiente información y haga clic en **Crear**:
   - **Opción de creación**: ambas
   - **Nombre**: *un nombre exclusivo para su servicio*
   - **Suscripción**: *seleccione su suscripción de Azure*
   - **Grupo de recursos**: *seleccione un grupo de recursos existente o cree uno nuevo*
   - **Ubicación de creación**: *seleccione la ubicación que prefiera*
   - **Plan de tarifa de creación**: F0
   - **Ubicación de la predicción**: *seleccione una ubicación en la misma región de su ubicación de creación*
   - **Plan de tarifa de predicción**: F0
   
6. Espere a que se creen los recursos, verá que se aprovisionan dos recursos de Language Understanding, uno para la creación y otro para la predicción. Para ver estos recursos, vaya al grupo de recursos en el que los creó.

 Crear una aplicación de Language Understanding

Para implementar la comprensión del lenguaje natural con Language Understanding, se debe crear una aplicación y luego agregar entidades, intenciones y expresiones para definir los comandos que la aplicación deba entender:

1. En una nueva pestaña del navegador, abra el portal de Language Understanding de la región de creación en la que haya creado el recurso de creación:
    - EE. UU.: [https://www.luis.ai](https://www.luis.ai)
    - Europa: [https://eu.luis.ai](https://eu.luis.ai)
    - Australia: [https://au.luis.ai](https://au.luis.ai)

2. Inicie sesión con la cuenta de Microsoft asociada a su suscripción de Azure. Si es la primera vez que inicia sesión en el portal de Language Understanding, deberá conceder permisos a la aplicación para acceder a los detalles de su cuenta. Después, seleccione el recurso de creación de Language Understanding que ha creado con su suscripción de Azure y complete los pasos de *bienvenida*. 

3. Abra la página **Conversation Apps** y seleccione su suscripción y el recurso de creación de Language Understanding. Después, cree una nueva aplicación de conversación con la siguiente configuración:
   - **Nombre**: Home Automation
   - **Culture**: Español (*si esta opción no está disponible, déjela en blanco*)
   - **Description**: Simple home automation
   - **Prediction resource**: *Su recurso de predicción de Language Understanding*

4. Si aparece un panel con consejos para crear una aplicación de Language Understanding efectiva, ciérrelo.

 Crear una entidad

Una *entidad* es un componente que su modelo de lenguaje puede identificar y realizar acciones con él. En este caso, su aplicación de Language Understanding se usará para controlar varios *dispositivos* en la oficina, como las luces o los ventiladores. Por eso, crearemos una entidad llamada *device* que incluya una lista de los tipos de dispositivos que la aplicación deberá administrar. Para cada tipo de dispositivo, debe crear una sublista con el nombre del dispositivo, como *light*, y cualquier sinónimo que pueda asociarse a este tipo de dispositivo (como *lamp*).

1. En la página de Language Understanding de su aplicación, en el panel izquierdo, haga clic en **Entities**. Después, haga clic en **Create** y cree una nueva entidad denominada **device**, seleccione el tipo **List** y haga clic en **Create**.
2. En la página **List items**, en **Normalized Values**, escriba **light** y pulse ENTRAR.
3. Una vez agregado el valor **light**, en **Synonyms**, escriba **lamp** y pulse ENTRAR.
4. Agregue un segundo elemento de lista llamado **fan** con el sinónimo **AC**.

> **Nota**: En este laboratorio, use las mayúsculas y minúsculas tal y como se indica _(por ejemplo: se debe usar light y **no** Light)_ y no agregue espacios adicionales. 

 Crear intenciones

Una *intención* es una acción que quiere realizar en una o más entidades, por ejemplo, encender una luz o apagar un ventilador. En este caso, se definirán dos intenciones: una para activar el dispositivo y otra para apagarlo. Para cada intención, indicará *expresiones* de muestra que indiquen el tipo de lenguaje usado para marcar la intención.

> **Nota**: En este laboratorio, use el texto con las mayúsculas y minúsculas tal y como aparecen _(por ejemplo: “turn the light on” y **no** “Turn the light on”)_ y no agregue espacios adicionales 

1. En el panel de la izquierda, haga clic en **Intents** Después, haga clic en **Create** y agregue una intención con el nombre **switch_on** y haga clic en **Done**.
2. En el encabezado **Examples** y en el subencabezado **Example user input**, escriba la expresión ***turn the light on*** y pulse **Entrar** para agregar esta expresión a la lista.
3. En la expresión *turn the light on*, haga clic en la palabra “light” y asígnela al valor **light** de la entidad **device**.

![Asociar la palabra “light” al valor de la entidad.](./images/assign_entity.jpg)

4. Agregue una segunda expresión a la intención **switch_on** con la frase ***turn the fan on***. Después, asocie la palabra “fan” al valor **fan** de la entidad **device**.
5. En el panel izquierdo, haga clic en **Intents** y después en **Create** para agregar una segunda intención con el nombre **switch_off**.
6. En la página **Utterances** de la intención **switch_off**, agregue la expresión ***turn the light off*** y asocie la palabra “light” al valor **light** de la entidad **device**.
7. Agregue una segunda expresión a la intención **switch_off** con la frase ***turn the fan off***. Después, asocie la palabra “fan” al valor **fan** de la entidad **device**.

 Entrenar y probar el modelo de lenguaje

Ahora, ya puede usar los datos proporcionados en forma de entidades, intenciones y expresiones para entrenar el modelo de lenguaje de su aplicación.

1. En la parte superior de la página de Language Understanding de su aplicación, haga clic en **Train** para entrenar el modelo de lenguaje
2. Cuando el modelo se haya entrenado, haga clic en **Test** y use el panel de pruebas para ver la intención de la predicción de las siguientes frases:
    * *switch the light on*
    * *turn off the fan*
    * *turn the lamp off*
    * *switch on the AC*
3. Cierre el panel de pruebas.
    
 Publicar el modelo y configurar puntos de conexión

Para usar el modelo entrenado en una aplicación de cliente, debe publicarlo como un punto de conexión al que las aplicaciones de cliente puedan mandar nuevas expresiones, a partir de las cuales se predecirán las intenciones y entidades.

1. En la parte superior de la página de Language Understanding de su aplicación, haga clic en **Publish**. Después, seleccione **Production slot** y haga clic en **Done**.

2. Después de publicar el modelo, en la parte superior de la página de Language Understanding de su aplicación, haga clic en **Manage**. En la pestaña **Settings**, verá el **App ID** de su aplicación. Cópielo y péguelo en el código siguiente, en sustitución de **YOUR_LU_APP_ID**.

3. En la pestaña **Azure Resources**, verá los valores de **Primary key** y **Endpoint URL** de su recurso de predicción. Copie estos valores y péguelos en el código, en sustitución de **YOUR_LU_KEY** y **YOUR_LU_ENDPOINT**, respectivamente.

4. Ejecute la celda siguiente. Para ello, haga clic en el botón **Run cell** (&9655;) (a la izquierda de la celda) y, cuando se le pida, escriba el texto *turn the light on*. El modelo de Language Understanding interpretará el texto y aparecerá la imagen adecuada.

 **(!) Importante**: 
Busque el mensaje en la parte superior de la ventana. Deberá escribir *turn the light on* y pulsar **Entrar**.<jupyter_code>from python_code import luis
import matplotlib.pyplot as plt
from PIL import Image
import os
%matplotlib inline

try:
    # Set up API configuration
    luis_app_id = 'YOUR_LU_APP_ID'
    luis_key = 'YOUR_LU_KEY'
    luis_endpoint = 'YOUR_LU_ENDPOINT'

    # prompt for a command
    command = input('Please enter a command: \n')

    # get the predicted intent and entity (code in python_code.home_auto.py)
    action = luis.get_intent(luis_app_id, luis_key, luis_endpoint, command)

    # display an appropriate image
    img_name = action + '.jpg'
    img = Image.open(os.path.join("data", "luis" ,img_name))
    plt.axis('off')
    plt. imshow(img)
except Exception as ex:
    print(ex)<jupyter_output><empty_output><jupyter_text>(!) Comprobar 
¿Ha ejecutado la celda anterior y ha escrito la frase *turn the light on* cuando se le ha pedido? El mensaje para escribir la frase debe aparecer en la parte superior de su ventana.  

Vuelva a ejecutar la celda anterior con estas frases:

* *turn on the light*
* *put the lamp off*
* *switch the fan on*
* *switch the light on*
* *switch off the light*
* *turn off the fan*
* *switch the AC on*

Si ejecuta la celda anterior y aparece una imagen con un símbolo de interrogación, es posible que haya utilizado un texto diferente o que haya agregado espacios incorrectos al crear la entidad, la intención o la expresión.

> **Nota**: Si quiere conocer el código utilizado para recuperar las intenciones y entidades de su aplicación de Language Understanding, busque el archivo **luis.py** en la carpeta **python_code**.  Agregar control de voz

Hasta ahora, hemos visto cómo analizar texto. Sin embargo, cada día es más habitual que los sistemas de inteligencia artificial permitan a los humanos comunicarse con servicios de software mediante el reconocimiento de voz. Para conseguirlo, el servicio **Voz**, parte de Cognitive Services, proporciona una forma sencilla de transcribir un mensaje hablado en texto.

 Crear un recurso de Cognitive Services

Si no tiene uno, siga estos pasos para crear un recurso de **Cognitive Services** en su suscripción de Azure:

> **Nota**: Si ya tiene un recurso de Cognitive Services, abra su página de **Inicio rápido** en Azure Portal y copie la clave y ubicación en la siguiente celda. En caso contrario, siga estos pasos para crear uno.

1. En la pestaña de otro explorador, abra Azure Portal ([https://portal.azure.com](https://portal.azure.<EMAIL>)) e inicie sesión con su cuenta de Microsoft.
2. Haga clic en el botón **&65291;Crear un recurso**, busque *Cognitive Services* y cree un recurso de **Cognitive Services** con esta configuración:
    - **Suscripción**: *su suscripción de Azure*.
    - **Grupo de recursos**: *seleccione o cree un grupo de recursos con un nombre único.*
    - **Región**: *seleccione cualquier región disponible*:
    - **Nombre**: *escriba un nombre único*.
    - **Plan de tarifa**: S0
    - **Al marcar esta casilla, afirmo que este servicio no está dirigido a un departamento de policía de Estados Unidos**: seleccionado.
    - **Confirmo que he leído y comprendido las notificaciones**: seleccionado.
3. Espere a que la implementación finalice. Después, vaya al recurso de Cognitive Services y, en la página **Inicio rápido**, anote las claves y la ubicación. Las necesitará para conectarse al recurso de Cognitive Services desde aplicaciones de cliente.

 Obtener la clave y la ubicación de un recurso de Cognitive Services

Para usar su recurso de Cognitive Services, las aplicaciones de cliente necesitan su clave de autenticación y su ubicación:

1. En Azure Portal, en la página **Claves y punto de conexión** de su recurso de Cognitive Services, copie la **Key1** de su recurso y péguela en el siguiente código, en sustitución de **YOUR_COG_KEY**.
2. Copie la **Ubicación** de su recurso y péguela en el siguiente código, en sustitución de **YOUR_COG_LOCATION**.
>**Nota**: Quédese en la página **Claves y punto de conexión** y copie la **Ubicación** desde esta página, (ejemplo: _westus_). No_agregue_espacios entre las palabras del campo Ubicación. 
3. Ejecute el código de la celda siguiente.<jupyter_code>cog_key = 'YOUR_COG_KEY'
cog_location = 'YOUR_COG_LOCATION'

print('Ready to use cognitive services in {} using key {}'.format(cog_location, cog_key))<jupyter_output><empty_output><jupyter_text>Ahora, ejecute la celda siguiente para transcribir la voz de un archivo de audio y usarla como un comando para su aplicación de Language Understanding.<jupyter_code>import os
from python_code import luis
from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig
from playsound import playsound
import matplotlib.pyplot as plt
from PIL import Image
%matplotlib inline

try:   

    # Get spoken command from audio file
    file_name = 'light-on.wav'
    audio_file = os.path.join('data', 'luis', file_name)

    # Configure speech recognizer
    speech_config = SpeechConfig(cog_key, cog_location)
    audio_config = AudioConfig(filename=audio_file) # Use file instead of default (microphone)
    speech_recognizer = SpeechRecognizer(speech_config, audio_config)

    # Use a one-time, synchronous call to transcribe the speech
    speech = speech_recognizer.recognize_once()

    # Get the predicted intent and entity (code in python_code.home_auto.py)
    action = luis.get_intent(luis_app_id, luis_key, luis_endpoint, speech.text)

    # Get the appropriate image
    img_name = action + '.jpg'

    # Display image 
    img = Image.open(os.path.join("data", "luis" ,img_name))
    plt.axis('off')
    plt. imshow(img)
    playsound(audio_file)

except Exception as ex:
    print(ex)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07669785500604671, 'fraction_numerical': 0.002991534593596843, 'mean_word_length': 4.538244624603454, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 20, 'https://': 11, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '589726', 'license': 'MIT', 'n_tokens_mistral': 4926, 'n_tokens_neox': 4884, 'n_words': 2207, 'path': '10 - Language Understanding.ipynb', 'repo_name': 'MicrosoftLearning/AI-900ES-Microsoft-Azure-AI-Fundamentals', 'size': '15707'}