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:
- Converter palavra para letras maiúsculas;
- Remover acentuação e pontuação (hífen, apóstrofo, etc.);
- 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 |
- Remover vogais (A, E, I, O, U) e H;
- Se a palavra começar com U ou W, dever ser substituído por V;
- Se a última letra da palavra for M, R ou S, ela deve ser removida;
- Remover letras duplicadas (squeeze);
- 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