Partilhar via


O que é correspondência de padrões?

A correspondência de padrões pode ser personalizada para agrupar intenções de padrão e entidades dentro de um PatternMatchingModelarquivo . Usando esse agrupamento, é possível acessar tipos de entidade mais avançados que ajudam a tornar o reconhecimento de intenção mais preciso.

Para localidades suportadas, consulte aqui.

Padrões vs. frases exatas

Existem dois tipos de strings usadas no matcher de padrões: "frases exatas" e "padrões". É importante entender as diferenças.

Frases exatas são cadeias de caracteres das palavras exatas que você deseja corresponder. Por exemplo:

"Leva-me ao sétimo andar".

Um padrão é uma frase que contém uma entidade marcada. As entidades são marcadas com "{}" para definir o lugar dentro do padrão e o texto dentro do "{}" faz referência ao ID da entidade. Dado o exemplo anterior, talvez você queira extrair o nome do piso em uma entidade chamada "floorName". Você faria isso com um padrão como este:

"Leve-me ao chão {floorName}"

Estrutura de tópicos de um PatternMatchingModel

O PatternMatchingModel contém uma ID para fazer referência a esse modelo, uma lista de PatternMatchingIntent objetos e uma lista de PatternMatchingEntity objetos.

Intenções de correspondência de padrões

PatternMatchingIntent Os objetos representam uma coleção de frases que são usadas para avaliar a fala ou o IntentRecognizertexto no . Se as frases forem correspondidas, o IntentRecognitionResult retornado terá o ID do PatternMatchingIntent que foi correspondido.

Entidades de correspondência de padrões

PatternMatchingEntity objetos representam uma referência de entidade individual e suas propriedades correspondentes que dizem como IntentRecognizer tratá-lo. Todos os PatternMatchingEntity objetos devem ter um ID presente em uma frase ou então ele não é correspondido.

Restrições de nomenclatura de entidades

Nomes de entidades contendo caracteres ':' atribuem uma função a uma entidade.

Tipos de Entidades

Qualquer Entidade

A entidade "Qualquer" corresponde a qualquer texto que apareça nesse slot, independentemente do texto que ele contém. Se considerarmos nosso exemplo anterior usando o padrão "Take me to floor {floorName}", o usuário pode dizer algo como:

"Leve-me para o estacionamento 2

Neste caso, a entidade "floorName" corresponderia ao "parking 2".

Essas entidades são correspondências preguiçosas que tentam corresponder ao menor número possível de palavras, a menos que apareçam no início ou no final de um enunciado. Considere o seguinte padrão:

"Leve-me ao chão {floorName1} {floorName2}"

Neste caso, a frase "Leve-me para o estacionamento 2" corresponderia e devolveria floorName1 = "estacionamento" e floorName2 = "2".

Pode ser complicado lidar com texto extra capturado. Talvez o usuário continuasse falando e o enunciado capturasse mais do que seu comando. "Leve-me para o estacionamento 2 sim Janice eu ouvi falar sobre isso vamos". Neste caso, o floorName1 estaria correto, mas floorName2 = "2 yes Janice eu ouvi falar sobre isso let's". É importante estar ciente da forma como as Entidades correspondem e ajustar o seu cenário adequadamente. O tipo Qualquer entidade é o tipo mais básico e menos preciso de correspondência feita.

Listar entidade

A entidade "Lista" é composta por uma lista de frases que orientam o mecanismo sobre como combiná-la. A entidade "List" tem dois modos. "Rigoroso" e "Fuzzy".

Vamos supor que temos uma lista de andares para o nosso elevador. Como estamos lidando com fala, adicionamos entradas usando o formato lexical também.

"1", "2", "3", "lobby", "rés do chão", "um", "dois", "três"

Quando uma entidade do tipo ID "Lista" é usada no modo "Estrito", o mecanismo só corresponde se o texto no slot aparecer na lista.

"Take Me to Floor One" combinará.

"Take Me to Floor 5" não.

É importante notar que toda a intenção não corresponderá, não apenas a entidade.

Quando uma entidade do tipo ID "List" é usada no modo "Fuzzy", o mecanismo ainda corresponde à intenção e retorna o texto que apareceu no slot no enunciado, mesmo que não esteja na lista. Esta correspondência é útil nos bastidores para ajudar a melhorar o reconhecimento de voz.

Aviso

As entidades da lista difusa são implementadas, mas não integradas na parte de reconhecimento de fala. Portanto, eles corresponderão às entidades, mas não melhorarão o reconhecimento de fala.

Entidade inteira pré-construída

A entidade "PrebuiltInteger" é usada quando você espera obter um inteiro nesse slot. Ele não corresponderá à intenção se um inteiro não puder ser encontrado. O valor de retorno é uma representação de cadeia de caracteres do número.

Exemplos de valores válidos de correspondência e retorno

"Dois mil cento e cinquenta e cinco" -> "2155"

"primeiro" -> "1"

"a" -> "1"

"Quatro Oh Sete Um" -> "4071"

Se houver texto que não seja reconhecível como um número, a entidade e a intenção não corresponderão.

Exemplos de uma correspondência inválida

"A terceira"

"Primeiro andar eu acho"

"segundo mais três"

"trinta e três e enfim"

Considere o nosso exemplo de elevador.

"Leve-me ao chão {floorName}"

Se "floorName" é uma entidade inteira pré-construída, a expectativa é que qualquer texto que esteja dentro do slot represente um inteiro. Aqui, um número de andar corresponderia bem, mas um andar com um nome como "lobby" não.

Agrupamento de itens obrigatórios e opcionais

No padrão, é permitido incluir palavras ou entidades que "poderiam" estar presentes no enunciado. Isso é especialmente útil para determinantes como "o", "a" ou "an". Isso não tem nenhuma diferença funcional em relação à codificação rígida das muitas combinações, mas pode ajudar a reduzir o número de padrões necessários. Indique itens opcionais com "[" e "]". Indique os itens necessários com "(" e ")". Você pode incluir vários itens no mesmo grupo separando-os com um caractere '|'.

Para ver como isso reduziria o número de padrões necessários, considere o seguinte conjunto:

"Leve-me para {floorName}"

"Leve-me o {floorName}"

"Leve-me {floorName}"

"Leve-me para {floorName} por favor"

"Leve-me o {floorName} por favor"

"Leve-me {floorName} por favor"

"Traga-me {floorName} por favor"

"Traga-me para {floorName} por favor"

Todos eles podem ser reduzidos a um único padrão com agrupamento e itens opcionais. Primeiro, é possível agrupar "para" e "o" juntos como palavras opcionais assim: "[to | o]", e segundo podemos tornar o "por favor" opcional também. Por último, podemos agrupar o "trazer" e o "levar" conforme necessário.

"(Trazer | Leve-me) [para | o] {floorName} [por favor]"

Também é possível incluir entidades opcionais. Imagine que há vários níveis de estacionamento e você quer corresponder à palavra antes do {floorName}. Você pode fazer isso com um padrão como este:

"Leve-me para [{floorType}] {floorName}"

Os opcionais também são úteis se você estiver usando o reconhecimento de palavras-chave e uma função push-to-talk. Isso significa que às vezes a palavra-chave está presente e às vezes não. Supondo que sua palavra-chave fosse "computador", seu padrão seria mais ou menos assim.

"[Computador] Leve-me para {floorName}"

Nota

Embora seja útil usar itens opcionais, aumenta as chances de colisões de padrões. É aqui que dois padrões podem corresponder à mesma frase falada. Se isso ocorrer, às vezes pode ser resolvido separando os itens opcionais em padrões separados.

Funções de entidade

Dentro do padrão, pode haver um cenário em que você queira usar a mesma entidade várias vezes. Considere o cenário de reservar um voo de uma cidade para outra. Neste caso, a lista de cidades é a mesma, mas é necessário saber de qual cidade vem o usuário e qual cidade é o destino. Para fazer isso, você pode usar uma função atribuída a uma entidade usando um ':'.

"Reserve um voo de {city:from} para {city:destination}"

Dado um padrão como este, haverá duas entidades no resultado rotuladas como "cidade:de" e "cidade:destino", mas ambas farão referência à entidade "cidade" para fins de correspondência.

Prioridade de correspondência de intenção

Às vezes, vários padrões correspondem ao mesmo enunciado. Neste caso, o motor dá prioridade aos padrões da seguinte forma.

  1. Frases exatas.
  2. Padrões com mais Entidades.
  3. Padrões com entidades inteiras.
  4. Padrões com entidades de lista.
  5. Padrões com quaisquer entidades.
  6. Padrões com mais bytes correspondentes.
    • Exemplo: O padrão "select {something} à esquerda" terá prioridade maior do que "select {something}".

Próximos passos