Interpretação semântica¶
Este capítulo apresenta o formato de tags de interpretação semântica suportado pela biblioteca de ASR, e fornece detalhes de implementação relevantes, bem como apresenta ferramentas de teste que podem ser utilizadas no desenvolvimento e depuração de gramáticas com interpretação semântica.
A biblioteca de ASR suporta que, nas gramáticas SRGS, sejam inseridas tags de interpretação semântica no formato SISR (Semantic Interpretation for Speech Recognition). Esta seção supõe que o leitor já esteja familiarizado com o padrão SISR. Caso este não seja o caso, recomenda-se consultar a especificação para detalhes da sintaxe adotada e sua semântica correspondente.
O padrão SISR define dois formatos de tags semânticas: o formato literal e o formato em scripts. A biblioteca de ASR suporta ambos os formatos, conforme apresentado nas próximas seções.
Interpretação literal¶
O formato literal é uma maneira bastante simples de se associar uma cadeia de caracteres a cada sentença reconhecida pela gramática. Devido a sua simplicidade, o formato possui pouca flexibilidade, sendo adequado apenas a gramáticas bastante simples, como listas de comandos ou gramáticas de confirmação.
A fim de se utilizar tags no formato literal em gramáticas ABNF, deve-se utilizar a declaração tag-format no cabeçalho do arquivo de gramática, informando, por meio dela, que o formato adotado será semantics/1.0-literals.
tag-format <semantics/1.0-literals>;
No formato XML, utiliza-se o atributo tag-format do elemento grammar.
<grammar tag-format="semantics/1.0-literals" ...>
Caso uma gramática possua tags de interpretação mas não declare o formato delas no cabeçalho, considera-se que as tags estão no formato literal. Abaixo, segue um exemplo de gramática com tags no formato literal, armazenada no arquivo sim_nao.gram.
#ABNF 1.0 UTF-8;
tag-format <semantics/1.0-literals>;
root $root;
$root = $sim {SIM} | $nao {NAO};
$sim = sim | confirmo | [é] isso [mesmo] | correto;
$nao = não [confirmo] | [está] (errado | incorreto);
A gramática pode ser testada em linha de comando, a partir de um texto de
entrada, por meio da ferramenta grammar-parse
. A ferramenta recebe como
entrada um arquivo de gramática e uma sequência de palavras, e escreve na
saída padrão o resultado semântico produzido (caso haja algum), em formato
JSON. Abaixo encontram-se alguns exemplos do uso da ferramenta para teste
da gramática sim_nao.gram.
$ grammar-parse sim_nao.gram sim
"SIM"
$ grammar-parse sim_nao.gram é isso mesmo
"SIM"
$ grammar-parse sim_nao.gram não
"NAO"
$ grammar-parse sim_nao.gram está incorreto
"NAO"
O resultado aparece na saída padrão entre aspas, pois está no formato JSON.
Interpretação com scripts¶
A biblioteca de ASR também suporta o formato em scripts definido pela especificação SISR. Para tanto, o formato de tags semantics/1.0 deve ser utilizado nas gramáticas.
tag-format <semantics/1.0>;
<grammar tag-format="semantics/1.0" ...>
Abaixo segue um exemplo de uma gramática de números, utilizando tags em formato script. A gramática, intitulada numeros.gram, reconhece números por extenso entre zero e noventa e nove, e retorna o valor numérico correspondente.
#ABNF 1.0 UTF-8;
tag-format <semantics/1.0>;
root $numero;
$numero = $digito_0_9 | $dezena_10_19 | $dezena_20_90;
$digito_0_9 = zero {out=0} | $digito_1_9;
$digito_1_9 = um {out=1}
| dois {out=2}
| três {out=3}
| quatro {out=4}
| cinco {out=5}
| seis {out=6}
| sete {out=7}
| oito {out=8}
| nove {out=9};
$dezena_10_19 = dez {out=10}
| onze {out=11}
| doze {out=12}
| treze {out=13}
| catorze {out=14}
| quinze {out=15}
| dezesseis {out=16}
| dezessete {out=17}
| dezoito {out=18}
| dezenove {out=19};
$dezena_20_90 = vinte {out=20}
| vinte e $digito_1_9 {out = 20 + rules.latest()}
| trinta {out=30}
| trinta e $digito_1_9 {out = 30 + rules.latest()}
| quarenta {out=40}
| quarenta e $digito_1_9 {out = 40 + rules.latest()}
| cinquenta {out=50}
| cinquenta e $digito_1_9 {out = 50 + rules.latest()}
| sessenta {out=60}
| sessenta e $digito_1_9 {out = 60 + rules.latest()}
| setenta {out=70}
| setenta e $digito_1_9 {out = 70 + rules.latest()}
| oitenta {out=80}
| oitenta e $digito_1_9 {out = 80 + rules.latest()}
| noventa {out=90}
| noventa e $digito_1_9 {out = 90 + rules.latest()}
;
Gramáticas em formato script também podem ser testadas por meio da ferramenta
grammar-parse
.
$ grammar-parse numeros.gram vinte e cinco
25
$ grammar-parse numeros.gram quarenta e dois
42
Caso se deseje imprimir valores na tela durante a execução da interpretação
semântica, pode-se utilizar a função debug
, conforme exemplificado na
gramática pizza.gram abaixo.
#ABNF 1.0 UTF-8;
tag-format <semantics/1.0>;
root $root;
$root = [$quero] $quant (pizza | pizzas) [de] $sabor
{debug("Texto:", meta.quero.text);
out.quant = rules.quant;
out.sabor = rules.sabor}
;
$quero = [eu] (quero | queria | gostaria de) [uma];
$quant = uma {out=1}
| duas {out=2}
| três {out=3}
| quatro {out=4}
| cinco {out=5}
| seis {out=6}
| sete {out=7}
| oito {out=8}
| nove {out=9};
$sabor = escarola {out="ESCAROLA"}
| marguerita {out="MARGUERITA"}
| calabresa {out="CALABRESA"};
Abaixo encontram-se alguns exemplos de execução da ferramenta grammar-parse
sobre a gramática pizza.gram com algumas sentenças de exemplo.
$ grammar-parse pizza.gram quero uma pizza de calabresa
Texto: quero
{"quant":1,"sabor":"CALABRESA"}
$ grammar-parse pizza.gram gostaria de duas pizzas de escarola
Texto: gostaria de
{"quant":2,"sabor":"ESCAROLA"}
É possível, conforme à especificação SISR, referenciar gramáticas externas em formato literal no corpo de gramáticas em script, e vice-versa.