Soundex Sql Server Português

Pessoal, bom dia.

O post de hoje é para falar sobre a adaptação do SOUNDEX para o português/BR. Em parceria com o Kleber Moura, adicionei o projeto como Oppen Source no SOURCEFORGE e gostaria da colaboração de vocês para testes/melhorias, etc.

O link original do projeto é:
http://sourceforge.net/p/soundexsqlserverportugues/wiki/Inicial/

Lá você poderá encontrar os códigos fontes mais atuais. Abaixo transcrevo o Wiki do Source Forge para o meu blog.

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

Confira meu perfil profissional no LinkedIn e faça parte da minha rede. https://lnkd.in/w9kyFR

Abraços,
Bruno F. Antognolli

2 respostas em “Soundex Sql Server Português

Deixe um comentário

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.