A API sugerida neste artigo foi desenvolvida em JavaScript, assim ela poderá ser incorporada a qualquer Sistema Web independente da linguagem (PHP, ASP, Java e outras).

A chamada da API funciona a partir de 2 parâmetros de entrada: O primeiro parâmetro deve ser um Array com N linhas (são os dados onde a API pesquisará, dados, provavelmente extraídos do banco de dados), e o segundo parâmetro é o que o usuário deseja procurar, ou seja, o que deverá ser procurado dentro do Array. O retorno será também um Array, entretanto o retorno irá conter apenas as linhas/registros que coincidiram com a palavra ou frase que o usuário deseja encontrar.

Internamente a API trabalha com 2 algoritmos fonéticos: BuscaBr e Soundex. Para cada palavra que o usuário deseja procurar são gerados os códigos BuscaBr e Soundex respectivamente, e o mesmo é feito com o Array que contém os dados onde deverá ser feita a pesquisa. Quando um dos códigos, seja o BuscaBr ou o Soundex, da palavra que deverá ser encontrada é idêntico a um dos códigos do Array que contém os dados do banco, esta linha é armazenada em um Array auxiliar para posteriormente ser retornada, ou seja, a API identificou aquela linha como possível candidata ao que o usuário estava procurando.

A identificação da proximidade entre dois códigos fonéticos é feita através de um Processo Comparador que utiliza a Distância de Levenshtein, essa distância verifica quantos caracteres são necessários mudar para que o código gerado pela palavra errada seja idêntico ao gerado pela palavra certa, por exemplo, o código BK e BC tem distância igual a 1, pois para transformar o código BC em BK basta trocar o caractere "C" por "K". Quando a distância é igual a 0, significa que os códigos são idênticos. Na Figura 1 é ilustrado o funcionamento interno da API.

Funcionamento da API

Figura 1: Funcionamento da API

Testes e resultados piloto

Para compor a base de testes pilotos foram coletadas 26 palavras, de sites de compra coletiva, que poderiam causar erros grafemáticos - erros que afetam a representação grafemática da palavra, no entanto, não interferem com a sua realização auditiva ou fonia.

Como exemplo um erro grafemático comum é a escrita da palavra "habitante" sem o "h", isso porque o "h" é um grafema que não apresenta realização fonética, por isso fica difícil de reproduzi-lo graficamente.

Essas 26 palavras foram submetidas a um grupo de 20 usuários desse tipo de comércio online, os usuários deveriam escrever as palavras apenas ouvindo, sem ter acesso a sua grafia correta. Entre todas as palavras submetidas a teste, foram identificadas 14 que apareciam com a grafia errada em aproximadamente todos os testes.

Logo abaixo apresentaremos a tabela (Figura 2) com estas 14 palavras e as grafias erradas que foram encontradas no teste. Utilizando a Distância de Levenshtein calculamos a proximidade do código Soundex e do código BuscaBR da palavra errada para com o código Soundex e o código BuscaBR da palavra correta, gerados pelo API.

A coluna 2 da tabela abaixo mostra a grafia errada e entre parênteses a distância de Levenshtein, onde "0" (zero) significa que o código gerado por essa palavra é idêntico ao código gerado pela palavra de grafia correta, "1" (um) significa que o código gerado por essa palavra possui 1 caractere diferente do código gerado pela palavra de grafia correta, e assim por diante.

A taxa de acerto é calculada através da média aritmética de todas as grafias erradas daquela determinada palavra, ou seja, se a palavra Laser possui 3 palavras com grafias erradas e a API conseguiu gerar o mesmo código para as 3, se comparado ao código da palavra Laser correta, então ela teve um acerto de 100%, acertou 3 de 3.

Tabela de relação de teste por palavra

Figura 2: Tabela de relação de teste por palavra

A Taxa Média Total de Acerto da API foi de 71,43%, esse valor diz respeito ao valor probabilístico que a mesma tem em acertar determinada palavra, mesmo que sua grafia esteja errada, ou seja, gerar um código Soundex ou Buscabr para a palavra errada, idêntico ao código da palavra correta.

Aplicação real

Para analise em um ambiente real, a API foi alimentada com um Array Unidimensional contendo 306 promoções dos mais diversos tipos. A mesma também foi submetida a 20 usuários. As seguintes métricas foram utilizadas para a análise da eficiência da API em cada consulta: Tempo de Resposta, Quantidade de Linhas retornadas corretamente e erroneamente (as linhas corretas possuem ao menos 1 palavra que o usuário procurava e as linhas erradas não possuem nenhuma palavra pelo qual o usuário procura), na tabela abaixo (Figura 3) essas métricas podem ser visualizadas em testes reais.

É importante salientar que para uma linha ser considerada "totalmente errada" as palavras encontradas nesta não podem ter nenhuma semelhança com a digitada pelo usuário, Exemplo: O usuário desejava procurar a palavra "Hour", porém digitou "Our", a API retorna uma das linhas com a palavra "Ouro", mesmo que esta não tenha nenhuma utilidade para o usuário, considerando a distância de Levenshtein de "Our" para "Ouro" sendo quase zero, a API não cometeu um erro.

Dada as métricas acima, teremos o tempo de resposta médio e a taxa de acerto média para a Aplicação Real proposta.

Tabela de relação de testes na aplicação real

Figura 3: Tabela de relação de testes na aplicação real

A taxa média de acerto neste caso real foi de 69,86% e o tempo de resposta médio foi de 768,30ms. Perceba que a taxa de acerto média é muito próxima da taxa de acerto média que fora calculada na seção anterior.

Como usar a API

Para utilizá-la basta importar o arquivo JavaScript na página do seu projeto. Na seção de downloads deste artigo você irá fazer o download e um arquivo comprimido que possui 2 arquivos: O arquivo JavaScript principal da API e um arquivo HTML, neste arquivo HTML você tem um exemplo completo de como utilizar a API. Abaixo você pode ver como está sendo feita a chamada à API.

Conclusão

A construção de uma ferramenta própria para identificação de erros através da fonética é difícil e onerosa, isto porque as variações da língua portuguesa são inúmeras, diferentemente da língua inglesa. Quando aplicada sozinha pode ser que esta não seja tão eficiente sem uma otimização adequada, porém ao utilizá-la em conjunto com outros motores de busca (search engines) esta pode se tornar ponto chave ao retornar resultados satisfatórios ao usuário.