Julio de 2018

Volumen 33, número 7

Cognitive Services: mejora de las clasificaciones de intención de LUIS

Por Zvi Topol | Julio de 2018

Language Understanding Intelligence Service (LUIS), que forma parte de Microsoft Cognitive Services, ofrece una solución para la comprensión del lenguaje natural de aprendizaje automático. Hay muchos casos de uso de LUIS, incluidos los bots de chat, los motores de búsqueda cognitiva e interfaces de voz.

En pocas palabras, cuando se especifica un texto intervención del usuario, también conocido como una declaración LUIS devuelve la intención detectada detrás de la declaración, es decir, lo que el usuario intenta preguntar. También detecta las distintas entidades, las referencias a objetos del mundo real, que aparecen en la declaración. Además, genera una puntuación de confianza para cada intento y la entidad ha detectado. Esos son los números en el intervalo [0, 1], con 1 que indica el máximo partido de confianza sobre la detección y 0 es el menos seguro sobre él.

Artículos anteriores de MSDN Magazine han tratado los conceptos básicos de LUIS en detalle. En concreto, le recomiendo que consulte el artículo, "Habilitar lenguaje Natural interacción con LUIS", por Ashish Sahu (msdn.com/magazine/mt745095) para obtener más información acerca de cómo empezar a trabajar con LUIS.

En este artículo se centrará en dos herramientas de código abierto, Scattertext y LIMA, que puede ayudarle a entender la detección y clasificación de calidades de Luis. (En el paso siguiente, usaré la detección y clasificación indistintamente.)

En concreto, le mostraré cómo se pueden usar estas herramientas para arrojar algo de luz sobre el proceso de clasificación y explicar por qué LUIS es incierto sobre su intención detección en algunos casos, normalmente las situaciones en que los intentos de superior detectados durante un determinado utterance tienen similares puntuaciones de confianza, por ejemplo, una división 50-50 entre dos intentos. Es más probable que el intento incorrecto en estas situaciones de salida.

Aunque LUIS actualmente admite algunas funcionalidades de solución de problemas, incluidos activo de aprendizaje ayudar a identificar y volver a entrenar grabaciones de voz es incierto acerca de, no hay ningún nivel de palabra de visualización y análisis de las herramientas que pueden más ayuda para resolver esa incertidumbre. Scattertext y LIMA pueden ayudar a superar esta limitación.

Ahora Echemos un vistazo a un caso sencillo FinTech que servirá como un ejemplo en ejecución. Imagine que trabaja para un banco y ha sido encargan preguntas comprensión de los usuarios que pertenecen a dos categorías:

  • Preguntas sobre su personal bancos, tales como:
    "¿Cuál es mi saldo de cuenta de ahorros?"
    "¿Cuál es la transacción más reciente en mi cuenta corriente?"
    "Me gustaría que mi extracto de ahorro para enviarse de nuevo"
    "He recibido mi salario abril aún?"
    "Si el último pago automático de teléfono celular procesó?"
    "¿Cuáles son las tasas anuales para las cuentas de ahorro?"
    "¿Qué es el equilibrio en mi cuenta corriente?"
  • Preguntas o solicitudes sobre otros servicios de banca, incluidos hipotecas préstamos y así sucesivamente, como:
    "Me gustaría obtener asistencia sobre las tasas de hipotecas"
    "Quién hablar con sobre hipotecas?"
    "¿Cuál es la tasa anual para la cuenta de ahorro anual?"
    "¿Qué términos ¿se ofrecen de hipotecas?"
    "Quién es responsable de hipotecas?"
    "¿Cuáles son las tarifas anuales para las cuentas de ahorro?"
    "¿Cómo son las tarifas de su hipoteca en comparación con otros bancos?"

El plan es el uso de LUIS para la comprensión del lenguaje natural de las solicitudes de usuario. Una manera de ocuparse de esto es crear dos intenciones y entrenar LUIS para detectarlos.

Vamos a llamar a PersonalAccountsIntent intención de la primera categoría y OtherServicesIntent intención de la segunda categoría. A continuación, puede usar los ejemplos de utterance enumerados anteriormente para entrenar a LUIS. Crea un tercer intento de "catch-all" llama automáticamente a None para las grabaciones de voz generales, muy diferentes de los dos primeros intentos. También puede proporcionar ejemplos adicionales de intención None.

Después del entrenamiento, puede publicar el modelo en producción. También puede ver las palabras pronunciadas junto con las puntuaciones de confianza para las distintas intenciones en la UI de LUIS, como se muestra en figura 1.

Grabaciones de voz PersonalAccountsIntent con su puntuación de confianza
Figura 1 PersonalAccountsIntent grabaciones de voz con su puntuación de confianza

El panel ofrece algunas estadísticas básicas de resumen acerca de la aplicación. Si observa el panel de figura 1, observará que la puntuación de confianza más baja para PersonalAccountsIntent es 0,59 y se obtiene de la declaración, "¿Cuáles son las tasas anuales para las cuentas de ahorro?" La puntuación de confianza para esta declaración se clasifican como OtherServicesIntent es bastante cerrar en 0,44. Esto significa que LUIS no es muy certeza cómo clasificar esta intención.

Idealmente, querrá que sus intenciones se pueda distinguir entre sí con un alto grado de certeza, es decir, para tener una intención con una puntuación de confianza muy alto, mientras que otros intentos tienen puntuaciones muy bajas. Si se vuelve a visitar las listas de utterance (dictado) para ambos intenciones, verá que hay otra muy similar utterance ejemplo ("¿Qué es la tasa anual para la cuenta de ahorro anual?") que está etiquetado de manera diferente como OtherServicesIntent.

Con este conocimiento, puede ajustar las muestras utterance (dictado) para usar diferentes palabras.

En este caso, he presentado siete ejemplos utterance (dictado) para cada intento. Pero ¿qué ocurre si había varias calidades (en el momento de escribir este artículo puede clasificar LUIS hasta 500 intenciones diferentes) y muchos más ejemplos de utterance (dictado) para cada intención?

Claramente, se necesita un enfoque más sistemático para abordar este reto. A continuación, le mostraré cómo pueden ayudar Scattertext y LIMA.

Comprender la intención clasificación mediante Scattertext

Scattertext es una herramienta de código abierto escrita en Python por Jason Kessler. Encontrará el código fuente y un tutorial en bit.ly/2G0DLmpy un documento titulado "Scattertext: una herramienta basada en explorador para visualización cómo difieren cuerpos," que explica en la herramienta en detalle, bit.ly/2G05ow6.

Scattertext concibió como una herramienta para visualizar las diferencias y similitudes entre dos colecciones de artículos de texto, también conocido como cuerpos y tiene varias características que puede resultarle útil; Por ejemplo, también admite emojis.

En este artículo, voy a aprovechar la herramienta para producir una visualización de las diferencias y similitudes entre los ejemplos de los dos intentos, PersonalAccountsIntent y OtherServicesIntent los utterance (dictado).

Para instalar Scattertext, lo que requiere la versión 3 de Python, siga las instrucciones de instalación en el tutorial. También recomienda instalar Spacy, una biblioteca de procesamiento de lenguaje Natural de código abierto (spacy.io) y Pandas (pandas.pydata.org), otra biblioteca de código abierto que le permite trabajan con datos tabulares en memoria.

Ahora necesito Scattertext se alimentan en los ejemplos de utterance (dictado). Para ello, crearé una tabla CSV con dos columnas, una para las grabaciones de voz y otro para los intentos. La columna utterance (dictado) incluirá los ejemplos de utterance (dictado) como una cadena, separada por el carácter de nueva línea. (Si usa Excel, puede utilizar Alt + Intro para escribir varias líneas en una sola celda). La columna intención incluirá las etiquetas de las intenciones, en este caso, PersonalAccountsIntent y OtherServicesIntent. Por lo tanto, en este ejemplo, el resultado es una tabla CSV de 2 x 2.

Ahora puede usar Python para ejecutar el código figura 2. Cargar la tabla CSV en una trama de datos de Panda el código y, a continuación, entrégueselo para Scattertext, especificar algunos parámetros relacionados con las categorías (las intenciones) y el formato de salida.

Figura 2 código para la visualización de Scattertext

import scattertext as st
import space
import pandas as pd
examples_data_location = 'example.csv'
two_df = pd.read_csv(examples_data_location, encoding = 'utf8')
nlp = spacy.en.English()
corpus = st.CorpusFromPandas(two_df,
                              category_col='intent',
                              text_col='utterance',
                              nlp=nlp).build()
html = st.produce_scattertext_explorer(corpus,
  category='PersonalAccountsIntent',category_name='PersonalAccountsIntent',
  not_category_name='OtherServicesIntent', width_in_pixels=1000)
open("MSDN-Visualization.html", 'wb').write(html.encode('utf-8'))

Scattertext generará una página HTML que incluye una visualización que muestra las principales palabras únicas para cada intento, así como los compartidos por ambos intenciones. También hay un cuadro de búsqueda que le permite buscar palabras determinadas, que si se encuentra, se resaltan en la visualización. En una visualización atestada, esto puede ser muy útil. Figura 3 se muestra la salida Scattertext en este ejemplo.

Visualización de Scattertext
Figura 3 Scattertext visualización

Scattertext funciona al contar las frecuencias de palabras para obtener ejemplos de cada intento utterance (dictado) y mostrar las palabras en una forma que resulte más fácil de determina las diferencias y similitudes entre los intentos. En este momento, los recuentos de sólo incluyen las expresiones de una palabra (unigramas). Sin embargo, si dispone de las expresiones que incluyen varias palabras, por ejemplo, "pago automático," puede hacer algún procesamiento previo para especificar lo que desea. Por ejemplo, podría representar "pagar a auto" como "auto_pay."

La visualización en figura 3 muestra los dos intentos: OtherServicesIntent en la X eje y PersonalAccountsIntent en el eje Y. Las palabras que aparecen más cerca de la esquina inferior derecha están más probables que aparecen en los ejemplos de declaración para OtherServicesIntent, tales como "hipotecas" y "tipos", mientras que las palabras que aparecen en la parte superior izquierda son aquellos que es más probable que aparezcan en ejemplos utterance (dictado) para PersonalAccountsIntent, por ejemplo, "Mi" y "cuenta". Las palabras de la diagonal están probables que aparezcan en los ejemplos de utterance (dictado) para ambos intenciones, por ejemplo, "ahorros" o "qué".

Aprendizaje que ciertas palabras aparecen frecuentemente en los ejemplos de ambos tipos del color utterance (dictado) puede servir para optimizar los ejemplos de utterance (dictado) para mejorar la precisión y la confianza de clasificación.

Una manera de hacerlo es mediante la adición de más diferentes palabras o formulando incluso de ejemplos de utterance (dictado) de cada intento que incluyen las palabras con frecuencia en ambos con el fin de representarlos distinguir mejor.

La ventaja de usar Scattertext es que es posible obtener el valor de la herramienta incluso para los conjuntos de datos pequeños, como en mi ejemplo juguete con sólo siete ejemplos utterance (dictado) para cada intento. Claramente, los más utterance ejemplos por intención, tendrá más complicado resultará para encontrar las diferencias y similitudes entre ellas. Scattertext puede ayudarle a apreciar las similitudes y diferencias de forma visual rápida.

También merece la pena tener en cuenta que puede utilizar Scattertext de manera similar, cuando haya más de dos intentos comparando los pares de intenciones a la vez.

Que se explican las clasificaciones de intención mediante LIMA

Ahora Echemos un vistazo a una herramienta de código abierto llamada LIMA, o una explicación de independiente del modelo Interpretable Local, lo que permite a explicar la intención clasificación. Encontrará el código fuente y un tutorial en bit.ly/2I4Mp9zy un documento de investigación académica titulado "¿por qué debo confiar le?: Explicar las predicciones de cualquier clasificador"(bit.ly/2ocHXKv).

LIMA está escrita en Python y puede seguir las instrucciones de instalación en el tutorial antes de ejecutar el código en figura 4.

Figura 4 uso de CAL para analizar las grabaciones de voz

import requests
import json
from lime.lime_text import LimeTextExplainer
import numpy as np
def call_with_utterance_list(utterance_list) :
  scores=np.array([call_with_utterance(utterance) for utterance in
    utterance_list])
  return scores
def call_with_utterance(utterance) :
  if utterance is None :
    return np.array([0, 1])
  app_url ='your_url_here&q='
  r = requests.get(app_url+utterance)
  json_payload = json.loads(r.text)
  intents = json_payload['intents']
  personal_accounts_intent_score =
    [intent['score'] for intent in intents if intent['intent'] ==
    'PersonalAccountsIntent']
  other_services_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'OtherServicesIntent']
  none_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'None']
  if len(personal_accounts_intent_score) == 0 :
      return np.array([0, 1])
  normalized_score_denom = personal_accounts_intent_score[0]+
    other_services_intent_score[0]+none_intent_score[0]
  score = personal_accounts_intent_score[0]/normalized_score_denom
  complement = 1 - score
  return (np.array([score, complement]))
if __name__== "__main__":
  explainer = LimeTextExplainer(class_names=['PersonalAcctIntent', 'Others'])
  utterance_to_explain = 'What are annual rates for my savings accounts'
  exp = explainer.explain_instance(utterance_to_explain,
    call_with_utterance_list, num_samples=500)
  exp.save_to_file('lime_output.html')

LIMA permite explicar clasificadores de modalidades diferentes, incluidos texto e imágenes. Voy a usar la versión de texto de color verde, que genera información de nivel de palabra acerca de las varias palabras en la declaración. Mientras utilizo a LUIS como mi clasificador de elección, se puede enviar una amplia gama de clasificadores LIMA; se tratan básicamente como cajas negras.

La versión de texto de CAL aproximadamente funciona del siguiente modo: Aleatoriamente crea varias modificaciones o samples de la declaración de entrada mediante la eliminación de cualquier número de palabras y, a continuación, llama a LUIS en cada uno de ellos. El número de muestras se controla mediante el parámetro num_samples, lo que en figura 4 se establece en 500. Para la declaración de ejemplo, grabaciones de voz modificadas pueden incluir variaciones, como "son anuales para las cuentas" y "qué anual velocidades para mi ahorros".

LIMA utiliza las puntuaciones de confianza devueltas de LUIS para ajustarse a un modelo lineal que, a continuación, calcula los efectos de palabras únicas en las puntuaciones de confianza de clasificación. Esta estimación ayuda a identificar cómo la puntuación de confianza es probable que cambie si fuera a quitar las palabras de la declaración y ejecute el clasificador nuevo (tal y como muestra más adelante).

El requisito principal solo para el clasificador es las puntuaciones de confianza para las etiquetas clasificadas de salida. Las puntuaciones de confianza a través de las diferentes categorías se tratan como una distribución de probabilidad y, por lo tanto, deben estar en el intervalo [0,1] y suman 1. LUIS genera las puntuaciones de confianza en ese intervalo para las intenciones definidas y el más intención None, pero los que no se garantiza que sumar 1. Por lo tanto, cuando se usa LIMA, deberá normalizar las puntuaciones de LUIS para sumar 1. (Esto se hace en la función call_with_utterance).

El código que aparece en figura 4 LIMA se utiliza para generar una explicación sobre la predicción de la declaración, "¿Cuáles son las tasas anuales para las cuentas de ahorro?" A continuación, genera una visualización de HTML, que se presenta en figura 5.

Salida de CAL para el "¿Cuáles son las tasas anuales para las cuentas de ahorro?" Utterance (dictado)
Figura 5 LIMA de salida para el "¿Cuáles son las tasas anuales para las cuentas de ahorro?" Utterance (dictado)

En figura 5 puede ver las probabilidades de predicción para la declaración, enfocada aquí PersonalAccountsIntent en lugar de los otros dos intentos, OtherServicesIntent y ninguno. (Tenga en cuenta que las probabilidades son muy próximas a pero no exactamente igual que la salida de las puntuaciones de confianza Luis debido a la normalización). También puede ver las palabras más importantes para la clasificación de la intención como PersonalAccountsIntent (los que son palabras encima de las barras azules y también se resaltan en azul en el texto utterance (dictado)). El peso de la barra indica el efecto en la puntuación de confianza de clasificación debe quitarse la palabra de la declaración. Por lo tanto, por ejemplo, "Mi" es la palabra con el efecto más significativo para detectar la intención de la declaración en este caso. Si tuviese que quitarlo de la declaración, se espera que la puntuación de confianza para reducir al 0,30, desde 0.56 a 0,26. Se trata de una estimación generada por LIMA. De hecho, al quitar la palabra y alimenta la declaración "¿Cuáles son las tarifas anuales para las cuentas de ahorro?" en LUIS, el resultado es que la puntuación de confianza para PersonalAccountsIntent es 0,26, y la intención ahora se clasifica como OtherServicesIntent, con una confianza puntuación de sobre 0.577 (consulte figura 6).

Figura 6 resultados para el "¿Cuáles son las tasas anuales para las cuentas de ahorro?" Consulta

{
  "query": "what are annual rates for savings accounts",
  "topScoringIntent": {
    "intent": "OtherServicesIntent",
    "score": 0.577525139
  },
  "intents": [
    {
      "intent": "OtherServicesIntent",
      "score": 0.577525139
    },
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.267547846
    },
    {
      "intent": "None",
      "score": 0.00754897855
    }
  ],
  "entities": []
}

Otras palabras significativas son "cuentas" y "ahorro", que, junto con "my", proporciona información similar a los proporcionados por Scattertext.

Dos palabras importantes con pesos negativos importantes son "anual" y "tipos". Esto significa que la eliminación de la declaración aumentaría las puntuaciones de confianza para la declaración se clasifican como PersonalAccountsIntent. Scattertext demostraron que "porcentajes" es más común en los ejemplos de declaración para OtherServicesIntent, por lo que esto no es una sorpresa.

Sin embargo, hay algo nuevo que aprender de CAL, la palabra "anual" es significativa para LUIS determinar que la intención en este caso no pertenece a la PersonalAccountsIntent y quitarlo se espera que aumente la puntuación de confianza PersonalAccountsIntent por 0.27. De hecho, si quito anual antes de ingresarlas la declaración, obtengo una puntuación de confianza mayor para el propósito de PersonalAccountsIntent, es decir, 0,71 (consulte figura 7).

Figura 7 resultados para el "¿Cuáles son las tarifas de Mis cuentas de ahorro?" Consulta

{
  "query": "what are rates for my savings accounts",
  "topScoringIntent": {
    "intent": "PersonalAccountsIntent",
    "score": 0.71332705
  },
  "intents": [
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.71332705
    },
    {
      "intent": "OtherServicesIntent",
      "score": 0.18973498
    },
    {
      "intent": "None",
      "score": 0.007595492
    }
  ],
  "entities": []
}

De esta manera, LIMA ayuda a identificar palabras significativas que controlan las puntuaciones de confianza de clasificación. Por lo tanto, puede proporcionar información que le ayudarán a optimizar sus ejemplos utterance (dictado) para mejorar la precisión de clasificación intención.

Resumen

Le he mostrado al desarrollar una aplicación basada en NLU, predicción intención para algunas grabaciones de voz puede ser bastante complicada y puede ser ayudó a mediante una mejor comprensión de cómo ajustar ejemplos utterance (dictado) con el fin de mejorar la precisión de clasificación.

La tarea de descripción de nivel de palabra diferencias y similitudes entre grabaciones de voz puede producir una orientación concreta en el proceso de ajuste.

He presentado dos herramientas de código abierto, Scattertext y LIMA, que proporcionan instrucciones de nivel de word mediante la identificación de palabras importantes que afectan a la predicción intención. Scattertext visualiza las diferencias y similitudes de frecuencias de palabras en los ejemplos de utterance (dictado), mientras LIMA identifica palabras importantes que afectan a las puntuaciones de confianza de intención de clasificación.

Espero que estas herramientas le ayudará a generar mejor NLU productos basados en uso de LUIS.


Zvi Topolha trabajado como un científico de datos en diversos sectores verticales, incluido el análisis de marketing, medios y entretenimiento y Industrial Internet de las cosas. Se ha entregado y provocar varios machine learning y análisis proyectos incluidos en lenguaje natural y las interfaces de voz, búsqueda cognitiva, análisis de video, los sistemas de recomendación y sistemas de soporte técnico de toma de decisiones de marketing. Se puede contactar con zvitop@gmail.com.

Gracias al siguiente experto técnico de Microsoft por revisar este artículo: Ashish Sahu


Discuta sobre este artículo en el foro de MSDN Magazine