Busca fonética com JavaScript e BuscaBR

Muitas vezes, em banco de dados para cadastro de pessoas ou outros textos, nos deparamos com nomes ou palavras diferentes, mas com pronuncia parecida. Ou então quando, por exemplo, o nome do cliente está registrado como Phelipe, e o usuário está buscando por Felipe. 

Algoritmos Fonéticos

Soundex

Para facilitar essas buscas foram criados os algoritmos de pesquisas fonéticas. O primeiro deles é o Soundex, que data de 1918 e foi desenvolvido pelo governo dos Estados Unidos da América para a busca de nomes no cadastro social. Ele mantém a primeira letra do nome e remove todas as outras ocorrências de a, e, i, o, u, y, h, w. E depois substitui as consoantes conforme tabela abaixo, mantendo sempre a primeira letra.

b, f, p, v 1
c, g, j, k, q, s, x, z 2
l 4
m, n 5
r 6

Outras regras são:

  • Se duas ou mais letras com o mesmo número são adjacentes no nome original, ou separadas por ‘h’ ou ‘w’, reter apenas a primeira letra;
  • Se o nome for muito pequeno, preencher com zeros a direita até atingir 3 dígitos;
  • Se o nome for muito grande, manter apenas os 3 primeiros dígitos.

Exemplos:

Robert R163
Rupert R163
Ashcroft A261

 

Como você deve imaginar, este algoritmo pode não se aplicar a língua portuguesa, pois foi desenvolvido para o idioma inglês, que tem a pronuncia de várias silabas diferentes da nossa.

Metaphone

Foi publicado em 1990 por Lawrence Philips, e é basicamente uma melhora do Soundex utilizando informações sobre as variações de ortografia e pronúncia, para que a codificação seja mais precisa. Este algoritmo conta com a execução de 19 passos e tem diversos erros na proposta. Outras duas versões melhoradas do metaphone foram lançadas: o Double Metaphone (2000) e o Metaphone 3 (2009).

Como são quase 20 passos e não é o foco deste artigo não iremos mostra-los aqui, mas se você se interessou existem muito material na WEB. E ele também não atende à língua portuguesa.

BuscaBR

O buscaBR foi proposto por Fred Jorge em 2007, melhorado por Marcos Rodrigues em 2010 e por Gabriel Sobrinho em 2011. Apesar da complexidade do idioma português o buscaBR conta com regras simples, e pode ser facilmente implementado em qualquer linguagem. Veja as regras:

  1. Converter palavra para letras maiúsculas;
  2. Remover acentuação e pontuação (hífen, apóstrofo, etc.);
  3. Substituir as letras conforme a tabela a seguir:
Substituir Por
Ç S
BL, BR B
PH F
GL, GR, MG, NG, RG G
Y I
GE, GI, RJ, MJ J
CA, CO, CU, CK, Q K
N M
AO, AUM, GM, MD, OM, ON M
PR P
L R
CE, CI, CH, CS, RS, TS, X, Z S
TR, TL T
CT, RT, ST, PT T
  1. Remover vogais (A, E, I, O, U) e H;
  2. Se a palavra começar com U ou W, dever ser substituído por V;
  3. Se a última letra da palavra for M, R ou S,  ela deve ser removida;
  4. Remover letras duplicadas (squeeze);
  5. Pronto!

Veja alguns exemplos:

Entrada Entrada Saída
Wilson Uilson V
Walter Valter VT
Feijão Feijaum FJ

buscaBR.js – Implementação do algoritmo em JavaScript/Node.js

Para facilitar nossa vida, criei um pacote JS para uso do buscaBR, de forma bem simples, podendo ser usado tanto como pacote node.js como em aplicações de browser se for necessário.

Teste aqui

 

Instalação

A instalação é simples. Se usando node.js instale com NPM.

npm install busca-br

Se você for usar no browser salve este arquivo: AQUI na pasta de sua aplicação.
Ou inclua:

 

Usando

É possível fazer a busca do termo em um array de termos.
Em node.js:

var buscaBR = require('busca-br');
buscaBR.search('feijaum',['arroz','feijão','feijoada'],function(res){
    console.log(res);
});

O retorno é um array de objetos JSON informando o termo encontrado e o index que ele está no array passado.


Direto no Browser:

Resposta de forma síncrona

A função searchSync(str, array) faz a pesquisa de forma sincrona e retorna um array de objetos JSON com os resultados encontrados. Veja:

var buscabr = new buscaBR();
  var resultado = buscabr.searchSync('feijaum',['arroz','feijão','feijoada']);
  console.log(resultado);

Codificando

Se você deseja somente codificar o texto, para salvar no banco de dados por exemplo, use o método encode();

 var buscabr = require('busca-br').encode;
 console.log(buscabr('paralelepipedo'));

Ou no browser…

 var buscabr = new buscaBR();
  alert(buscaBR.encode('paralelepipedo'));

Concluindo

Se você encontrar algum erro ou desejar contribuir com a biblioteca estou a disposição no GitHub

Referencias

https://speakerdeck.com/sobrinho/algoritmos-de-pesquisa

https://en.wikipedia.org/wiki/Metaphone

Jayr Alencar

Doutorando em Ciências da Computação no Centro de Informática da Universidade Federal do Pernambuco (CIn - UFPE); Mestre pela mesma instituição; Formado em Análise e Desenvolvimento de Sistemas; Católico; Fã de O Senhor do Anéis.

Você pode gostar...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *