Desenvolvimento - C#

Implementando Algoritmo BuscaBR

O BuscaBR nada mais é do que uma rotina para indexar sua base de dados.

por Leandro Braçaroto



As empresas cada vez mais têm a necessidade de melhorar o acesso às informações armazenadas nas grandes bases de dados que possuem, isso tem levado à necessidade de melhoria na forma de consulta para torná-las mais eficientes. Como se já não bastasse às dificuldades que são geradas através da grafia da língua falada ou escrita quer pela ortografia e gramática oficial ou pelas influências externas à língua portuguesa utilizada no Brasil também possui as suas regras ortográficas e gramaticais além de uma grande quantidade de influências internas e externas que dificultam o seu aprendizado. Também o estrangeirismo é muito presente e termina por criar novas palavras que são incorporadas na sua grafia original ou sofrem aportuguesamento, gerando assim, novas dificuldades e às vezes criando exceções as regras existentes.

Isso deixa as bases de dados cada vez mais desorganizadas e nem sempre temos o retorno esperado quando fazemos uma consulta.

Devido a isso foi criado a rotina SOUNDEX (registrado por Robert Russell e Margaret Odell) nos Estados Unidos em 1918 para tentar minimizar as informações, a rotina codificava os fonemas para corrigir a grafia errada das palavras, mas a rotina supria as necessidades norte americanas, mas na realidade brasileira comprometeu a eficiência. Devido a isso foi criado uma função capaz de abordar todas as características da língua portuguesa, com base em um estudo das deficiências do Soundex foi desenvolvido uma análise detalhada dos fonemas da língua portuguesa e também os erros de grafia que foram cometidos. Por fim, chegou-se a função PL/SQL (registrado pelo Oracle) com o nome de BUSCABR e que na língua portuguesa foi bastante eficaz.

O que é o BuscaBR?

Nada mais é do que uma rotina para indexar sua base de dados.

Como funciona?

É trabalhado baseado em algumas regras, vou dar exemplo em endereços, normalmente um endereço pode ser salvo como Rua Ivaí, R. Ivaí ou R Ivaí, isso quando não resolvem escrever R. Hivaí, Ivay e por aí vai.

Para mais informações sobre o BuscaBR, basta acessar o endereço e baixar o pdf original dos criadores www.unibratec.com.br/jornadacientifica/diretorio/NOVOB.pdf, este artigo tem como objetivo exemplificar a rotina BuscaBR.

Abaixo demonstro em um algoritmo utilizando o BuscaBR, no pdf acima existe algumas incompatibilidades que foram corrigidas abaixo. Vale lembrar que toda a lógica é do algoritmo BuscaBR. Acompanhe passo a passo a implementação em C# .Net:

          

Vou iniciar o algorítmo passando o Endereço "RUA BALTAZAR LISBOA" na variável "_entrada". Vejamos o que ocorrerá com o registro.

1. Devemos retirar os caracteres especiais e converter todas as letras para Maiúsculo;

                StringBuilder sb;

                sb = new StringBuilder(Validador.obterTextoENumero(_entrada).ToUpper());

2. Agora eliminamos todos os acentos;

                sb.Replace("Á", "A");

                sb.Replace("À", "A");

                sb.Replace("Ã", "A");

                sb.Replace("Ê", "E");

                sb.Replace("É", "E");

                sb.Replace("Í", "I");

                sb.Replace("Ó", "O");

                sb.Replace("Õ", "O");

                sb.Replace("Ú", "U");

3. Substituimos Y por I;

                sb.Replace("Y", "I");

              

4. Substituimos BR por B;

                sb.Replace("BR", "B");

                sb.Replace("BL", "B");

              

5. Substituimos PH por F;

                sb.Replace("PH", "F");

               

6. Substituimos GR, MG, NG, RG por G;

                sb.Replace("MG", "G");

                sb.Replace("NG", "G");

                sb.Replace("RG", "G");

7. Substituimos GE, GI, RJ, MJ, NJ por J;

                sb.Replace("GE", "J");

                sb.Replace("GI", "J");

                sb.Replace("RJ", "J");

                sb.Replace("MJ", "J");

                sb.Replace("NJ", "J");

                sb.Replace("GR", "G");

                sb.Replace("GL", "G");

8. Substituimos CE, CI e CH por S

                sb.Replace("CE", "S");

                sb.Replace("CI", "S");

                sb.Replace("CH", "S");

 

9. Substituimos CT por T

                sb.Replace("CT", "T");

                sb.Replace("CS", "S");

10. Substituimos Q, CA, CO, CU, C por K;

                sb.Replace("Q", "K");

                sb.Replace("CA", "K");

                sb.Replace("CO", "K");

                sb.Replace("CU", "K");

                sb.Replace("CK", "K");

                sb.Replace("C", "K");

11. Substituimos LH por L;

                sb.Replace("LH", "L");

                sb.Replace("RM", "SM");

12. Substituimos N, RM, GM, MD, SM e Terminação AO por M;

                sb.Replace("N", "M");

                sb.Replace("GM", "M");

                sb.Replace("MD", "M");

13. Substituimos NH por N;

                sb.Replace("NH", "N");

14. Substituimos PR por P;

                sb.Replace("PR", "P");

15. Substituimos Ç, X, TS, C, Z, RS por S;

                sb.Replace("X", "S");

                sb.Replace("TS", "S");

                sb.Replace("C", "S");

                sb.Replace("Z", "S");

                sb.Replace("RS", "S");

16. Substituimos LT, TR, CT, RT, ST por T;

                sb.Replace("TR", "T");

                sb.Replace("TL", "T");

                sb.Replace("LT", "T");

                sb.Replace("RT", "T");

                sb.Replace("ST", "T");

17. Substituimos W por V;

                sb.Replace("W", "V");

18. Eliminamos as terminações S, Z, R, R, M, N, AO e L;

                int tam = sb.Length - 1;

                if (tam > -1)

                {

                    if (sb[tam] == "S" || sb[tam] == "Z" || sb[tam] == "R" || sb[tam] == "M" || sb[tam] == "N" || sb[tam] == "L")

                    {

                        sb.Remove(tam, 1);

                    }

                }

                tam = sb.Length - 2;

                if (tam > -1)

                {

                    if (sb[tam] == "A" && sb[tam + 1] == "O")

                    {

                        sb.Remove(tam, 2);

                    }

                }

                // ---------

                sb.Replace("Ç", "S");

19. Substituimos L por R;

                sb.Replace("L", "R");

20. O BuscaBr diz para eliminamos todas as vogais e o H, porém ao implementar notamos que não seria necessário eliminarmos as vogais, isso dificultaria muito a busca dos dados "pós BuscaBR";

Devido a isto criei uma variável "_usarVogais" para só eliminar quando for solicitado o que não é o caso deste artigo.

                if (!_usarVogais)

                {

                    sb.Replace("A", "");

                    sb.Replace("E", "");

                    sb.Replace("I", "");

                    sb.Replace("O", "");

                    sb.Replace("U", "");

                }

                sb.Replace("H", "");

21. Eliminamos todas as letras em duplicidade;

                StringBuilder frasesaida = new StringBuilder();

                frasesaida.Append(sb[0]);

                for (int i = 1; i <= sb.Length - 1; i += 1)

                {

                    if (frasesaida[frasesaida.Length - 1] != sb[i] || char.IsDigit(sb[i]))

                        frasesaida.Append(sb[i]);

                }

               

Iniciamos nosso registro com o valor: "RUA BALTAZAR LISBOA", no final de todo o processo nossa (frasesaida) estará com o valor "BATASAR RISBOA". O Endereço "Rua Barão do Rio Branco" ficará: "BARAO RIO BAMK".

Mas Leandro, você quer dizer que ao invés de eu salvar o Endereço correto do meu usuário eu vou salvar esse endereço criado pelo algorítmo?

De uma certa forma sim, mas claro, não deve nunca substituir o endereço original do usuário. Você deverá fazer uma coluna à parte.

Eu criei uma tabela no banco com o nome de Indices onde possuo as colunas Endereço e Código do Usuário. Desta forma faço as buscas na tabela Indices com o endereço corrigido e junto pego o código do usuário e puxo o restante dos dados da tabela Usuários.

Desta forma teremos a certeza que em nosso banco de dados temos registros gravados corretamente, sem o erro básico de escrita acaba com nossa base de dados.

Qualquer dúvida não deixe de perguntar, também no meu blog www.leandrobracaroto.com no post referente ao artigo.

Leandro Braçaroto

Leandro Braçaroto - Formado em Processamento de Dados pela UNOPAR - Universidade do Norte do Paraná, experiências como analista e desenvolvedor Web desde 2003 (ASP e PHP), atualmente trabalha com VB.NET e C#, AJAX com banco de dados SQL SERVER e MYSQL. Aprimora seus conhecimentos estudando estas e outras tecnologias.