Julho de 2018

Volume 33 – Número 7

Serviços Cognitivos – Melhorando as Classificações de Intenção LUIS

Por Zvi Topol | Julho de 2018

O Language Intelligence Service Luis (reconhecimento vocal), que faz parte dos serviços Cognitivos da Microsoft, oferece uma solução de machine learning para compreensão de idioma natural. Há muitos casos de uso do LUIS, incluindo bots de bate-papo, interfaces de voz e mecanismos de pesquisa cognitiva.

Em resumo, quando é fornecido um textual entrada do usuário, também conhecido como uma expressão, LUIS retorna a intenção detectada por trás de declaração, ou seja, o que o usuário deseja perguntar sobre. Ela também detecta as diferentes entidades — referências a objetos reais — que aparecem na declaração. Além disso, ele gera uma pontuação de confiança para cada tentativa e uma entidade detectado. Esses são números no intervalo [0, 1], com 1 indicando o maior confiança sobre a detecção e 0 sendo menos confiante sobre ele.

Artigos anteriores da MSDN Magazine abordei os fundamentos de LUIS em detalhes. Em particular, eu recomendo que você consulte o artigo, "Habilitar a linguagem Natural interação com o LUIS," por Ashish Sahu (msdn.com/magazine/mt745095) para obter mais informações sobre como começar com o LUIS.

Este artigo se concentra em duas ferramentas de código-fonte aberto, Scattertext e verde-LIMÃO, que pode ajudar você a entendem a detecção e a classificação das intenções pelo LUIS. (Os itens a seguir, usarei classificação e detecção de maneira intercambiável.)

Em particular, mostrarei como essas ferramentas podem ser usadas para lançar uma luz sobre o processo de classificação e explicar por que LUIS está certo sobre sua intenção detecção em alguns casos — normalmente situações em que as tentativas de principais detectadas para uma determinada expressão têm semelhantes pontuações de confiança, por exemplo uma divisão 50-50 entre dois propósitos. É mais provável para a saída a intenção de errado em tais situações.

Embora LUIS atualmente dá suporte a alguns recursos de solução de problemas, incluindo o Active Directory de aprendizado ajudar a identificar e treinar novamente de declarações é incerto sobre, não há nenhuma visualização de nível de palavra e ferramentas de análise pode ainda mais ajudam a resolver tais incertezas. Scattertext e verde-LIMÃO podem ajudar a superar essa limitação.

Agora vamos dar uma olhada em um caso simples de FinTech que servirá como um exemplo em execução. Imagine que você trabalha para um banco e você recebeu com perguntas de usuário de compreensão que se enquadram em duas categorias:

  • Perguntas sobre pessoais bancária contas, tais como:
    "Qual é meu saldo da conta de economia?"
    "Qual é a transação mais recente em minha conta corrente?"
    "Eu gostaria de ter meu demonstrativo de economia seja enviado novamente"
    "Eu recebei salário meu abril ainda?"
    "Quando foi o último pagamento de auto celular processado?"
    "Quais são taxas de anual para minhas contas de economia?"
    "O que é o saldo em minha conta corrente?"
  • Perguntas ou solicitações de outros serviços bancários, incluindo hipotecas empréstimos automático e assim por diante, como:
    "Eu gostaria de ter obter assistência sobre taxas de hipoteca"
    "Quem posso falar com esses financiamentos sobre?"
    "Qual é a taxa anual para a conta de economia de um ano?"
    "Quais termos vocês oferecem para hipotecas?"
    "Quem é responsável por esses financiamentos?"
    "Quais são as taxas de anuais para as contas de economia?"
    "Como são suas taxas de hipoteca em comparação com outros bancos?"

O plano é usar o LUIS para compreensão de idioma natural das solicitações de usuário. Uma maneira de fazer isso é para duas tentativas de criar e treinar LUIS para detectá-los.

Vamos chamar PersonalAccountsIntent de intenção da primeira categoria e OtherServicesIntent de intenção da segunda categoria. Em seguida, você pode usar os exemplos de expressão listados anteriormente para treinar o LUIS. Ele criará uma intenção "capturar tudo" terceiro chamada automaticamente nenhum para declarações gerais, o que devem ser muito diferentes do que as duas primeiras tentativas. Você também pode fornecer exemplos adicionais para a intenção None.

Após o treinamento, você pode publicar seu modelo em produção. Você também pode ver as declarações, juntamente com as pontuações de confiança para os propósitos diferentes na UI LUIS, conforme mostrado na Figura 1.

Declarações de PersonalAccountsIntent com suas pontuações de confiança
Figura 1 PersonalAccountsIntent declarações com suas pontuações de confiança

O painel oferece algumas estatísticas básicas de resumidas sobre o aplicativo. Se você examinar o painel no Figura 1, você observará que a menor pontuação de confiança para PersonalAccountsIntent é 0.59 e é obtida para a declaração "quais são taxas de anual para minhas contas de economia?" A pontuação de confiança para essa expressão a ser classificado como OtherServicesIntent é bonita fecha em 0.44. Isso significa que LUIS não é muito certos sobre como classificar essa intenção.

O ideal é que suas intenções ser distinguíveis uns dos outros com um alto grau de certeza, ou seja, para ter uma intenção com uma pontuação de confiança muito alta, enquanto as outras intenções têm pontuações muito baixa. Se você visitar novamente as listas de expressão para ambas as intenções, você verá que há outra muito semelhantes expressão exemplo ("qual é a taxa anual para a conta de economia de um ano?") que é rotulado de maneira diferente como OtherServicesIntent.

Usando esse insight, você pode ajustar seus exemplos de expressão para usar palavras diferentes e distintas.

Aqui, apresentei sete exemplos de expressão para cada tentativa. Mas e se houve vários propósitos (no momento da gravação LUIS pode classificar até 500 intenções diferentes) e muitos outros exemplos de expressão para cada tentativa?

Sem dúvida, uma abordagem sistemática mais é necessário para resolver tal um desafio. A seguir, mostrarei como Scattertext e verde-LIMÃO podem ajudar.

Noções básicas sobre a classificação de intenção usando Scattertext

Scattertext é uma ferramenta de software livre escrita em Python por Jason Kessler. Você encontrará o código-fonte e um tutorial em bit.ly/2G0DLmpe um artigo intitulado "Scattertext: uma ferramenta baseada em navegador para a visualização como Corpora difere," que explica a ferramenta em detalhes, em bit.ly/2G05ow6.

Scattertext foi concebido como uma ferramenta para visualizar as diferenças e semelhanças entre duas coleções de artigos de texto, também conhecido como corpora e tem vários recursos que você pode achar útil; Por exemplo, ele também suporta emojis.

Neste artigo, vou usar a ferramenta para produzir uma visualização das diferenças e semelhanças entre os exemplos de expressão para as duas tentativas, PersonalAccountsIntent e OtherServicesIntent.

Para instalar o Scattertext, que exige o Python versão 3, siga as instruções de instalação no tutorial. Eu também recomendamos que você instala Spacy, uma biblioteca de processamento de linguagem Natural do código-fonte aberto (spacy.io) e Pandas (pandas.pydata.org), outra biblioteca de software livre que lhe permite trabalhar com dados tabulares na memória.

Agora, preciso alimentar os exemplos de expressão Scattertext. Para fazer isso, vou criar uma tabela CSV com duas colunas, uma para as declarações e outro para as tentativas. A coluna de expressão incluirá os exemplos de expressão como uma cadeia de caracteres, separada pelo caractere de nova linha. (Se você estiver usando o Excel, você pode usar Alt + Enter para inserir várias linhas em uma única célula.) A coluna intenção incluirá os rótulos das intenções, nesse caso, PersonalAccountsIntent e OtherServicesIntent. Portanto, para este exemplo, o resultado é uma tabela CSV 2 x 2.

Agora você pode usar o Python para executar o código Figura 2. O código irá carregar a tabela CSV em um quadro de dados do Panda e, em seguida, entregá-lo a Scattertext, especificar alguns parâmetros relacionados a categorias (as intenções) e o formato de saída.

Figura 2 código para visualização 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 produzirá uma página HTML que inclui uma visualização que mostra as palavras superior exclusivo para cada tentativa, bem como aqueles compartilhados por ambas as intenções. Também há uma caixa de pesquisa que permite que você procure palavras específicas, que, se encontrado, são destacados na visualização. Em uma visualização lotada, isso pode ser muito útil. Figura 3 mostra a saída de Scattertext para este exemplo.

Visualização de Scattertext
Figura 3 Scattertext visualização

Scattertext works frequências de palavra para obter exemplos de expressão de cada tentativa de contagem e exibindo as palavras de uma maneira que torna mais fácil determinar diferenças e semelhanças entre as tentativas. Neste ponto, as contagens de incluem apenas expressões de uma palavra (unigrams). No entanto, se você tiver expressões que incluem várias palavras, como "automático pagamento", você pode fazer o pré-processamento para especificar o que você deseja. Por exemplo, você poderia representar "pay automática" como "auto_pay".

A visualização Figura 3 mostra as duas tentativas — OtherServicesIntent no X axis e PersonalAccountsIntent no eixo Y. Palavras que aparecem mais perto da parte inferior direita serão mais prováveis aparecem nos exemplos de expressão para OtherServicesIntent, como "hipotecas" e "taxas", enquanto as palavras que aparecem na parte superior esquerda são aqueles que têm maior probabilidade aparecem nos exemplos de expressão para PersonalAccountsIntent, como "Meu" e "conta". Palavras na diagonal são provavelmente aparecerão nos exemplos de expressão para ambas as intenções, por exemplo, "economia" ou "o que."

Aprendizado que determinadas palavras aparecem com frequência nos exemplos de expressão as ambas as intenções pode ajudar você a ajustar os exemplos de expressão para melhorar a precisão e a confiança de classificação.

Uma maneira de fazê-lo é pela adição de mais diferentes palavras ou, até mesmo reformulando exemplos de expressão do cada tentativa que incluem as palavras com frequência em ambos para renderizá-los mais distinguíveis.

A vantagem de usar Scattertext é que é possível obter o valor da ferramenta de mesmo para pequenos conjuntos de dados, como o meu exemplo de brinquedo com apenas sete exemplos de expressão para cada tentativa. Claramente, os mais expressão exemplos por intenção que tiver, mais complicado torna-se encontrar as diferenças e semelhanças entre eles. Scattertext pode ajudar você a avaliar as diferenças e semelhanças de uma maneira rápida de visual.

Também vale a pena observar que você pode usar Scattertext de modo semelhante quando você tiver mais de duas tentativas, comparando os pares de tentativas por vez.

Explicar a intenção classificações usando verde-LIMÃO

Agora vamos dar uma olhada em uma ferramenta de software livre chamada verde-LIMÃO ou Local explicação independente de modelo que é interpretado, que permite que você explique classificação intencional. Você encontrará o código-fonte e um tutorial em bit.ly/2I4Mp9ze um artigo de pesquisa acadêmica intitulado, "por que devo confiar você?: Explicando as previsões de qualquer classificador"(bit.ly/2ocHXKv).

Verde-LIMÃO é escrito em Python e você pode seguir as instruções de instalação no tutorial antes de executar o código no Figura 4.

Figura 4 usando verde-LIMÃO para analisar as declarações

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')

Verde-LIMÃO permite que você explique classificadores por modalidades diferentes, incluindo imagens e texto. Vou usar a versão de texto de verde-LIMÃO, que gera informações de nível de palavra sobre as várias palavras na declaração. Enquanto estou usando o LUIS como meu classificador de preferência, uma ampla gama de classificadores pode ser inserida em verde-LIMÃO; Essencialmente, eles são tratados como caixas pretas.

A versão de verde-LIMÃO texto aproximadamente funciona da seguinte maneira: Ele cria aleatoriamente várias modificações ou exemplos de expressão de entrada, removendo qualquer número de palavras, em seguida, chama LUIS em cada um deles. O número de amostras é controlado pelo num_samples parâmetro, que, em Figura 4 é definido como 500. Para a expressão de exemplo, declarações modificadas podem incluir variações, como "are anual para as contas" e "quais anual taxas para meu economias."

Verde-LIMÃO usa as pontuações de confiança retornadas do LUIS para ajustar um modelo linear que, em seguida, estima os efeitos das palavras individuais em pontuações de confiança de classificação. Essa estimativa ajuda a identificar como a pontuação de confiança provavelmente será alterado se você remover palavras de declaração e execute o classificador novamente (como mostrar mais tarde).

O requisito principal somente para o classificador é gerar pontuações de confiança para os rótulos confidenciais. Pontuações de confiança sobre as categorias diferentes são tratadas como uma distribuição de probabilidade e, portanto, devem estar no intervalo de [0,1] e soma como 1. LUIS gera as pontuações de confiança nesse intervalo para as tentativas de definido e adicional intenção None, mas aqueles não há garantia que somam para 1. Portanto, ao usar verde-LIMÃO, eu vai normalizar as pontuações de LUIS a somar 1. (Isso é feito no call_with_utterance a função).

O código listado na Figura 4 usa verde-LIMÃO para produzir uma explicação sobre a previsão para a expressão, "quais são taxas de anual para minhas contas de economia?" Em seguida, gera uma visualização, HTML, que é apresentada na Figura 5.

Verde-LIMÃO saída para o "quais são taxas de anual para minhas contas de economia?" Expressão
Figura 5 verde-LIMÃO de saída para o "quais são taxas de anual para minhas contas de economia?" Utterance

Na Figura 5 você pode ver as probabilidades previstas para a declaração enfoca aqui PersonalAccountsIntent em vez de dois outros propósitos, OtherServicesIntent e nenhum. (Observe que as probabilidades são muito próximo ao, mas não exatamente o mesmo que a saída de pontuações de confiança pelo LUIS devido a normalização). Você também pode ver as palavras mais significativas para classificar a intenção como PersonalAccountsIntent (essas são as palavras sobre as barras azuis e também são realçadas em azul no texto de expressão). O peso da barra indica o efeito sobre a pontuação de confiança de classificação a palavra deve ser removida da declaração. Portanto, por exemplo, "Meu" é a palavra com o efeito mais significativo para detectar a intenção da expressão nesse caso. Se eu fosse removê-lo da declaração, a pontuação de confiança deve ser esperada para reduzir, 0,30, de 0.56 a 0.26. Essa é uma estimativa gerada pelo verde-LIMÃO. Na verdade, quando a remoção da palavra e alimentar a expressão "quais são as taxas de anuais para as contas de economia?" do LUIS, o resultado é que a pontuação de confiança para PersonalAccountsIntent é 0.26 e a intenção agora é classificada como OtherServicesIntent, com uma confiança pontuação de sobre 0.577 (consulte Figura 6).

Figura 6 resultados para o "quais são taxas de anual para minhas contas de economia?" 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": []
}

Outras palavras importantes são "contas" e "economia", que fornece informações semelhantes àquelas fornecidas pelo Scattertext junto com "my".

Duas palavras importantes com pesos negativos significativos são "anual" e "taxas". Isso significa que a removê-las da declaração aumentaria as pontuações de confiança para a expressão a ser classificada como PersonalAccountsIntent. Scattertext mostrou que "taxas de" é mais comuns nos exemplos de expressão para OtherServicesIntent, portanto, isso não é uma grande surpresa.

No entanto, há algo novo para ser aprendido de verde-LIMÃO — a palavra "anual" é significativa para LUIS determinar a intenção nesse caso, pertencente a PersonalAccountsIntent e removê-lo é esperado para aumentar a pontuação de confiança PersonalAccountsIntent por 0.27. Na verdade, se eu remover anual antes de alimentá declaração, posso obter uma pontuação de confiança mais alta para a intenção de PersonalAccountsIntent, ou seja, 0.71 (consulte Figura 7).

Figura 7 resultados para o "quais são as taxas para minhas contas de economia?" 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": []
}

Dessa forma, LIMÃO ajuda a identificar as palavras importantes que orientam as pontuações de confiança de classificação. Portanto, ele pode fornecer insights que ajudam você a ajustar seus exemplos de expressão para aumentar a precisão de classificação de intenção.

Conclusão

Já mostrei que ao desenvolver um aplicativo com base em NLU, previsão intencional para algumas declarações pode ser bastante desafiador e poderá ajudaram por uma melhor compreensão de como ajustar os exemplos de expressão para melhorar a precisão de classificação.

A tarefa de compreender as diferenças no nível do word e as semelhanças entre declarações pode gerar diretrizes concretas no processo de ajuste fino.

Apresentei duas ferramentas de código aberto, Scattertext e verde-LIMÃO, que fornecem orientação de nível de palavra ao identificar palavras importantes que afetam a previsão de intenção. Scattertext visualiza as diferenças e semelhanças de frequências de palavra nos exemplos de expressão, enquanto verde-LIMÃO identifica palavras importantes que afetam as pontuações de confiança de intenção de classificação.

Espero que essas ferramentas ajudará você a melhor com base em NLU produtos de build usando o LUIS.


Zvi Topoltem trabalhado como um cientista de dados em vários segmentos verticais da indústria, incluindo a análise de marketing, mídia e entretenimento e Internet das coisas Industrial. Ele foi entregue e levar vários machine learning e análise de projetos incluindo linguagem natural e interfaces de voz, pesquisa cognitiva, análise de vídeo, sistemas de recomendação e sistemas de suporte a decisões de marketing. Ele pode ser contatado pelo zvitop@gmail.com.

Agradecemos ao seguinte especialista técnico da Microsoft pela revisão deste artigo: Ashish Sahu


Discuta esse artigo no fórum do MSDN Magazine