As funções deste projeto foram desenvolvidas e adaptadas para substituir a função nativa "SOUNDEX" do SQL SERVER. A função SOUNDEX originalmente foi projetada para o idioma inglês ao utilizá-la para o português algumas particularidades do idioma não foram levados em consideração e com isso a busca perde eficácia.
"O Soundex é um índice para codificação de nomes, que se preocupa mais com o som do que com a forma de como um nome está escrito. Ele foi usado inicialmente para codificar sobrenomes (surnames) pela Administração de Arquivos e Registros Nacionais dos Estados Unidos (National Archives and Records Administration)75. Nomes que possuem o mesmo som, mas estão escritos de forma diferente, têm o mesmo código [Soundex].
O método foi criado e patenteado em 1918, por Margaret O’Dell e Robert C. Russel [Knuth 1973]. O departamento de censo dos Estados Unidos (U.S. Bureau of Census) codificou todos os registros relativos aos censos de 1880 a 1920 [Branting 2003] e [Oliveira 2007], utilizando Soundex.
O algoritmo Soundex produz um código padrão, composto pela primeira letra da palavra a ser codificada, seguida por três dígitos numéricos. Os dígitos variam de 0 a 6. Os seis números significativos representam classes fonéticas dos sons da fala humana: bilabial, labiodental, dental, alveolar, velar e glotal [Knuth 1973], [Bhagat e Hovy 2007] e [Oliveira 2007]. " [SOARES V.F.]¹
O Soundex iguala o código dos fonemas e realiza uma busca através dos códigos, sendo assim os valores "X" se igual a "CH", por exemplo.
Uma breve explicação dos arquivos do projeto
01_FUNC_FONETIZAR_DDL.sql
Função principal, parâmetros de entrada:
@STR VARCHAR(5000) = String de consulta
@CONSULTA CHAR(1) = Deve receber "0" ou "1"
@Consulta recebe 0: Resultado não adiciona caractere "%"
@Consulta recebe 1: Resultado adiciona "%" para utilização da condição "like". Ex:
SELECT DBO.FUNC_FONETIZAR('TIJELA',0)
Resultado: 68C8A1
SELECT DBO.FUNC_FONETIZAR('TIJELA',1)
Resultado: %68C8A1%
02_FUNC_FONETIZAR_PARTICULA_DDL.sql
Realiza tratamentos, atribui valores para os códigos fonéticos e iguala fonemas semelhantes.
03_FUNC_REMOVE_ACENTO_DDL.sql
Remove acentos para comparações.
04_FUNC_SOMENTE_LETRAS_DDL.sql
Retira caracteres especiais
05_FUNC_SUBSTITUI_TERMINACAO_DDL.sql
Substitui terminações
06_FUNC_TRATA_CONSOANTE_MUDA_DDL.sql
Trata consoantes mudas
07_TABLE_TESTEFONETICO.sql
Tabela de teste com 29853 palavras² para testes.
Abaixo alguns resultados que foram obtidos e exemplos de utilização
--Resultado Esperado: Pesquisar a palavra "CALSSADO", simulando um erro de grafia para a palavra "CALÇADO"
--Resultado Obtido: CALCADA / CALCADO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CALSSADO',0));
--Resultado Esperado: Pesquisar a palavra "CAUSSADO", simulando um erro de grafia para a palavra "CALÇADO"
--Resultado Obtido: CALCADA / CALCADO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CAUSSADO',0));
--Resultado Esperado: Pesquisar a palavra "CHICARA", simulando um erro de grafia para a palavra "XÍCARA"
--Resultado Obtido: XICARA
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CHICARA',0));
--Resultado Esperado: Pesquisar a palavra "TIJELA", simulando um erro de grafia para a palavra "TIGELA"
--Resultado Obtido: TIGELA
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('TIJELA',0));
--Resultado Esperado: Pesquisar a palavra "SUMISSO", simulando um erro de grafia para a palavra "SUMIÇO"
--Resultado Obtido: SUMICO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('SUMISSO',0));
Referências
¹SOARES V.F.: http://codims.lprm.inf.ufes.br/publicacoes/dissertacaoVinicius.pdf
²Palavras retiradas de: http://alcor.concordia.ca/~vjorge/Palavras-Cruzadas/Lista-de-Palavras.txt