Ela disse – a máquina disse: falando com computadores Helga Waage Os aplicativos de reconhecimento de fala, os NPCs (Non Playing Characters ou Personagens do Mestre) de jogos e os assistentes de conversação da Web são exemplos de sistemas de diálogo nos quais a linguagem escrita ou falada é utilizada para interagir com o sistema, em vez do pressionamento de um botão ou da seleção de um ícone. Em sua forma mais simples, um sistema de diálogo utiliza texto como entrada ou saída. No caso dos aplicativos de reconhecimento de fala ou multimodais, o comando ou a onda de áudio sempre pode ser transformado em um texto equivalente. As características a seguir definem os sistemas de diálogo: são abertos (o usuário pode falar qualquer coisa que desejar), de iniciativa mista (o usuário pode interromper ou não responder ao agente a qualquer momento, quando for a sua vez); e com propensão a erros (o agente deve ser capaz de gerenciar problemas com soletração, pronúncia, entrada desconhecida e rudeza em geral em nome do respectivo usuário). A maioria desses sistemas utiliza o inglês como único idioma e somente alguns são multilíngües. Muitos desses sistemas nem mesmo são desenvolvidos como sistemas de diálogo; são projetados como aplicativos para solucionar um problema específico. Isso é particularmente verdadeiro para os aplicativos de reconhecimento de fala, que são comumente estruturados como aplicativos da Web habilitados por voz. Isso está sujeito a alterações à medida que forem sendo efetuadas mais pesquisas sobre os sistemas de diálogo por reconhecimento de fala. O sistema de diálogo mais antigo foi a Eliza, uma terapeuta Rogeriana criado por Joseph Weizenbaum nos anos 60. Eliza não tinha qualquer conhecimento por si só; o sistema participava do diálogo transformando a entrada do usuário em uma pergunta. Usuário: Os homens são todos iguais. Eliza: De que forma? Usuário: Eles estão sempre nos importunando com alguma coisa. Eliza: Pode me dar um exemplo específico? Usuário: Bem, meu namorado me fez vir aqui. Eliza: O seu namorado fez você vir aqui? Usuário: Ele diz que eu estou deprimida a maior parte do tempo. Eliza: Sinto muito por saber que você está deprimida. Usuário: É verdade. Eu não estou feliz. Eliza: Você acha que vir aqui lhe ajudará a não se sentir infeliz? Usuário: Eu preciso de ajuda, disso tenho certeza. Eliza: O que significaria para você se obtivesse ajuda? Usuário: Talvez eu pudesse aprender a conviver com a minha mãe. Eliza: Conte-me mais sobre a sua família. [INSERIR 69Eliza-Page.jpg] Uma conversa on-line com a ELIZA de Weizenbaum Mesmo que as deficiências do diálogo sejam óbvias e este não seja muito útil, o programa é conhecido até os dias de hoje, e vários exemplos de clones seus podem ser encontrados na Internet. O desenvolvimento de um sistema de diálogo envolve três grandes preocupações arquiteturais: como o sistema deve gerenciar o fluxo de diálogos? Que nível de entendimento da linguagem o sistema deve gerenciar? Como o diálogo deve ser desenvolvido e escrito no sistema? Todas essas questões são relevantes tendo em vista o projeto multilíngüe. Gerenciador de diálogos O gerenciador de diálogos lida com o fluxo de diálogos no sistema. Em uma visão muito simplificada, cada parte pode, em sua vez de falar, continuar a linha do diálogo atual ou introduzir um novo tópico. Esse modelo é comumente representado como uma árvore no gerenciador de diálogos. O sistema reconhece a entrada do usuário comparando-a com modelos, que são palavras ou expressões regulares de algum tipo. Após a entrada ter sido combinada, a resposta adequada será selecionada ou gerada e enviada ao usuário como texto ou por meio de texto para reconhecimento de fala. As linhas de diálogos são organizadas através das ramificações da árvore e cada nova linha obtém um novo nó na raiz. [INSERIR 69DialogueTree.gif] Uma árvore de diálogos em um caractere de jogo iniciado com a instrução “you are program” Na figura acima, os modelos são indicados por um T e as respostas por um A. O circuito de disparo da árvore é uma instrução próxima às linhas de “you are program” (você é programa). O programa de controle de diálogos pode selecionar quatro respostas diferentes. Algumas delas — como a resposta: I don’t see how you come up with all those ideas. Of course I’m not a program. Are you? (Eu não sei de onde você tira essas suas idéias. Claro que eu não sou um programa; você é?) — levam a uma resposta sim/não. A árvore de diálogos ouve as respostas sim/não possíveis e, desse modo, suporta um sub-diálogo breve sobre essa pequena crise de identidade dos participantes. Se o usuário disser mais alguma coisa, o gerenciador de diálogos descartará esse sub-diálogo, por não ter mais importância, e quaisquer respostas sim/não serão consideradas no contexto atual. Esse procedimento é muito direto. A parte complicada é gerenciar respostas inesperadas do usuário. Em um sistema de diálogo não existe uma maneira de encurralar o usuário. Se a interface for baseada em texto, o usuário poderá ler e possivelmente reler as respostas antes de responder; em um aplicativo de reconhecimento de fala, o usuário poderá perder detalhes importantes, simplesmente porque deu um espirro. Ao gerenciar a entrada do usuário, devemos, conseqüentemente, prever várias formas de palavras que esperamos que sejam ditas pelo usuário — além de sinônimos comuns. Também devemos estar preparados para gerenciar entradas inesperadas como a expressão oh, ajuda, problemas comuns de ortografia (no caso de uma entrada com base em texto) e assim por diante. Na ilustração “you are program”, os modelos sim/não não especificam realmente quais palavras o modelo deve comparar. Os modelos usam uma referência para um conjunto de palavras que significam sim ou não respectivamente — palavras como sim, claro e certamente ou não, negativo ou de forma alguma. A estrutura de diálogos não varia muito entre os idiomas. Por exemplo, a estrutura em um aplicativo com base em voz para instituições bancárias é semelhante, independentemente do idioma utilizado. Na figura abaixo, temos uma parte de um sub-diálogo na qual o usuário está recarregando um cartão de telefone pré-pago para um telefone especificado. A transação permite que o usuário digite o número do telefone no teclado do telefone. O agente transfere o valor especificado (padrão $10) de uma conta bancária determinada. A rota ideal através do diálogo é realçada, mas rotas alternativas suportam valores diferentes, contas diferentes, assistência ao usuário e gerenciamento de erros. cmdNoInput e cmdNoMatch são usados para gerenciar a situação cenário na qual o usuário não fala nada ou fala algo incompreensível para o agente. [INSERIR 69SubDialogue.gif] Um sub-diálogo em um aplicativo para instituições bancárias O diálogo seria o mesmo para outros idiomas. De fato, esse diálogo foi traduzido do islandês; e ainda que o texto em inglês pudesse ser um pouco melhorado, a estrutura é a mesma para os dois idiomas. O formato do número de telefone provavelmente será diferente em países distintos (em vez dos idiomas) e também precisa ser levado em conta. Nesse exemplo, utilizamos o teclado para digitar o número telefônico e apenas suportamos poucas opções para o recarregamento, ou melhor, $5, $10, $15 e $20. Esses números são falados diferentemente. Se precisarmos suportar todos os números, teríamos que alterar um pouco a estrutura para idiomas como o inglês, no qual seria necessário verificar cuidadosamente a entrada numérica extra porque muitos números são foneticamente semelhantes, como thirteen (13) e thirty (30). Em muitos outros idiomas isso não é importante. As diferenças culturais podem também afetar a estrutura do diálogo. Por exemplo, se estivermos criando um sistema de auxílio à lista telefônica, será necessário levar em conta o gerenciamento de nomes em uma listagem. Na maioria dos países, a lista telefônica é classificada pelo sobrenome seguido do nome ou possivelmente por apenas uma inicial. Na Islândia, as listas telefônicas são classificadas pelo nome seguido pelo sobrenome e finalmente por quaisquer nomes ou iniciais intermediários. A estrutura dos diálogos precisa refletir essas questões e, em alguns casos, o aplicativo precisa ser personalizado pelo menos para os idiomas que divergem do caso comum. Entendimento do idioma A parte de entendimento do idioma do sistema depende muito, é claro, do próprio idioma — especificamente se o sistema deve ser multilingüe ou suportar apenas um idioma. Um programa de computador hoje não tem um entendimento real de um idioma. Na melhor das hipóteses, ele pode mapear uma frase recebida de acordo com alguma representação interna de sua visão de mundo e responder de uma forma que possa ser compreendida como inteligente. Qual o nível de entendimento necessário é uma decisão importante do projeto para qualquer sistema que lida com linguagem natural. Um corretor ortográfico, por exemplo, precisa ter um léxico abrangente do idioma suportado. Ele fica ainda mais eficiente quando adicionamos um corretor gramatical, no qual o sistema pode distinguir verbos e substantivos e nos informar sobre sentenças incompletas, formas incorretas de palavras e assim por diante. [INSERIR 69EnglishNumbVer.gif] Um exemplo de verificação de números em inglês É relativamente simples ter um léxico como um componente no sistema de controle de diálogos; entretanto, quanto mais regras — como regras de sintaxe — forem adicionadas, mais complexo se tornará o sistema. É mais fácil criar um sistema independente de idiomas que utiliza uma gramática simples do que criar um sistema que utiliza uma gramática complexa para entender o que o usuário quis dizer. Se levarmos em conta a situação nos sistemas de reconhecimento de voz, veremos que isso também ocorre com eles: os sistemas de reconhecimento de palavras distintas estão disponíveis para diversos idiomas. Sistemas de reconhecimento de palavras distintas bem projetados possuem o modelo de idioma como um componente independente, ao passo que os sistemas de reconhecimento de fala contínuos, além de dependerem muito da sintaxe do idioma, são menos comuns e mais difíceis de trocar de idioma. O tom de voz nos sistemas de diálogo pode variar muito, mas em geral as pessoas esperam um tom polido porém mais informal, afinal de contas, elas estão tendo uma conversa e não fazendo uma correspondência formal. A natureza das conversações é que elas tendem a ser gramaticalmente informais; as pessoas usam sentenças incompletas, abreviações e gírias em vez de um estilo formal de escrita. Portanto, não há necessidade de muita análise gramatical e, de fato, isso pode não ser apropriado. Ainda que valorizemos as ferramentas usadas em um editor de texto, não ficaríamos contentes com um aplicativo por voz que nos corrigisse continuamente e nos lembrasse do uso de frases gramaticalmente corretas quando tudo o que queremos saber é o saldo da nossa conta bancária. Portanto, os sistemas de diálogo não precisam de uma base sintática complexa e podem, em muitos casos, depender exclusivamente de um léxico. No caso dos aplicativos por voz, isso mapeia bem as formas gramaticais das palavras, conforme usado pelos padrões comuns, como VoiceXML. A desvantagem é que o sistema de diálogo não reconhecerá a diferença entre o termo casa em Quando você casa? e casa de bonecas. O sistema não perceberá que uma sentença é uma pergunta e a outra é uma afirmação. Na maioria dos casos, nós apenas selecionaríamos um significado do homônimo e pronto. Se esse artifício não fosse possível, precisaríamos de um esclarecimento do usuário, como fizemos antes com os números foneticamente semelhantes. Um outro problema com um enfoque baseado puramente no léxico é que não reconhecemos negações. Não temos uma forma fácil de diferenciar Eu tenho um cachorro de Eu não tenho um cachorro. Pronomes pessoais são difíceis também de gerenciar, pois se estivermos observando apenas a palavra, não teremos como saber, por exemplo, a quem o pronome ela está se referindo. Por fim, os verbos são bastante ignorados nos sistemas de diálogo baseados em léxico, a não ser que sejam os únicos fatores de diferenciação entre duas perguntas, como Quando o vôo sairá? e Quando o vôo saiu? Em uma solução com base em sintaxe esses problemas são reduzidos, porém, quando mais estruturas de sintaxe forem colocadas no sistema de diálogo, mais dependente de idiomas ele se tornará. Um sistema de diálogo com base em léxico pode solucionar problemas específicos, conforme necessário; fornecendo modelos para negações, por exemplo, se forem importantes para o aplicativo. É possível solicitar esclarecimentos para pronomes pessoais e incluir diversas formas de verbos. Podemos também adicionar uma sintaxe simples para auxiliar no processo de combinação de modelos, desde que possamos manter as partes dependentes de idioma independentes do resto do sistema. Escrevendo o diálogo A maioria dos sistemas de controle de diálogos possui um sistema de edição proprietário, no qual o diálogo pode ser configurado como uma árvore ou como perguntas e respostas. Algumas versões primitivas usam bancos de dados de arquivos de texto ou estruturas em XML. A diferença principal entre os sistemas monolíngües e os sistemas multilíngües é o fato de a dependência ao idiomas ter sido desenvolvida no sistema principal, se o sistema foi desenvolvido de modo que o pacote de idiomas possa ser substituído por outro idioma ou se o idioma utilizado foi tratado como conteúdo no sistema. Embora um sistema de diálogo possa ser escrito de forma multilíngüe desde o início, é geralmente mais fácil escrever o diálogo primeiro em um idioma e, em seguida, traduzir o sistema modificando a estrutura para os novos idiomas. Se o desenvolvimento do aplicativo baseou-se na premissa de que ele necessitaria suportar vários idiomas, a tradução deveria ser um processo simples e as modificações estruturais deveriam limitar-se a pequenos trechos acerca das verificações ou diferenças de formatos. Esse enfoque funciona muito bem para aplicativos simples, nos quais a maioria dos dados é conhecida de antemão e as partes variáveis das respostas são bem estruturadas. Isso é mais difícil quando uma parte significativa do conteúdo é de origem externa, como um provedor de notícias. Mesmo que a origem do conteúdo esteja geralmente em um único idioma, vários problemas podem surgir quando integramos texto desestruturado de terceiros a um sistema de controle de diálogos. A maioria desses problemas se relaciona ao “se” e “como” reformular as sentenças, como gerenciar números e assim por diante, e estão fora do âmbito deste artigo. Conclusão Os sistemas de diálogo, como os aplicativos por voz e os caracteres de jogos artificiais, em geral podem ser desenvolvidos em um núcleo baseado em léxico — possivelmente com uma gramática simples — em vez de um núcleo baseado em sintaxe. A maioria desses sistemas não precisa depender da análise semântica da entrada;em vez disso, o autor do aplicativo escreve o conteúdo ou a estrutura do conteúdo. Se o idioma e a estrutura do idioma forem abstraídos em um componente modular dentro do sistema, como é o caso dos sistemas com base em léxico, o aplicativo poderá ser traduzido para outros idiomas com uma certa facilidade. O próprio diálogo é escrito ou configurado em um sistema externo, em vez de ser programado como parte do aplicativo. Certamente, é muito mais complexo escrever um sistema de gerenciamento de diálogos do que uma instância de um aplicativo de diálogos. Mas após o esforço inicial, a escrita de novos aplicativos ou traduções de aplicativos antigos torna-se muito simples. Helga Waage é diretora técnica da Hex Software na Islândia.