Neste artigo falaremos sobre um Algoritmo Fonético chamado SOUNDEX, desenvolvido pelo Governo Americano a fim de melhorar a pesquisa de determinados dados em sua base de dados.

Algoritmos fonéticos são algoritmos que realizam comparações com base na fonética das palavras, desconsiderando a escrita da mesma, isso significa que palavras como: WATCHER e WUATCHER deverão ser consideradas foneticamente iguais, assim sendo, um usuário que buscar por WUATCHER, encontrará WATCHER.

A vantagem disso está na melhoria dos motores de busca (search engine) atuais, pois é muito comum que um usuário não encontre o que deseja, pois não sabe exatamente como se escreve, ainda mais em inglês.

Vamos utilizar como base neste artigo o próprio site do U.S National Archives and Records Administration, que pode ser acessado na lista de links presente no final deste artigo.

Vale ressaltar aqui que este algoritmo foi desenvolvido para língua Inglesa (Americana), por isso é recomendável que você não o aplique a palavras em português, pois este apresenta falhas notórias, a causa disso é a diferença fonética de ambas as línguas (inglesa e portuguesa).

Como funciona o Soundex

O objetivo principal deste algoritmo é converter a palavra em um código, com base em várias regras, sendo assim, a comparação entre 2 palavras é feita pelo seu código Soundex, como já era de se esperar.

A palavra WATCHER, por exemplo, possui o código Soundex W-326 e a palavra WUATCHER possui também o mesmo código Soundex, consequentemente, quando a comparação for feita a palavra será foneticamente a mesma, pois W-326 = W-326.

Para realizar a conversão, você deverá conhecer as regras para converter cada caractere para um código Soundex respectivo. Logo abaixo apresentaremos essas regras:

Regra 1: Todo código Soundex possui obrigatoriamente 1 letra e 3 números, onde a primeira letra é sempre a primeira letra da palavra. Perceba a palavra WATCHER como o código gerado foi W-326 (primeira letra = W).

Regra 2: A tabela abaixo representa qual número cada caractere deve ser substituído. Por exemplo, significa que se você encontrar o caractere “D” na palavra, substituía este pelo número “3”.

Tabela de Conversão para Soundex

Figura 1: Tabela de Conversão para Soundex

Regra 3: Provavelmente você notará que há alguns caracteres que não serão encontrados na tabela acima, isso porque eles devem ser simplesmente descartados pois não influenciam na fonética da palavra. São eles: A, E, I, O, U, H, W, e Y.

Regra 4: Caso a palavra possua alguma letra “dupla”, tal como: GG, RR, ZZ e etc, você deverá considerar apenas como 1 letra. Ex: Em vez de atribuir para o RR = 66, nós faríamos RR = 6.

Regra 5: Caso a palavra possua duas letras diferentes, uma ao lado da outra, com o mesmo código Soundex, você deverá considerar apenas como 1 código. Ex: P e F possuem o mesmo código Soundex, sendo assim, em vez de fazermos PF = 11, faríamos PF = 1. Outro exemplo: em vez de CK = 22, faríamos CK = 2.

Regra 6: Caso a palavra possua um prefixo tal como: Van, Con, De, Di, La ou Le, você pode codificar tanto seu prefixo como a palavra sem o prefixo e usar um ou outro código.

Por exemplo: a palavra VanDeusen pode ser V-532 (Van) ou D-250 (Deusen). Outra coisa importante é que prefixos como Mc e Mac não valem para essa regra.

Regra 7: Se uma vogal (A,E,I,O,U) separar duas consoantes que possuem o mesmo código Soundex, somente a consoante à direita da vogal é codificada, consequentemente, a consoante à esquerda não é codificada.

Por exemplo: na palavra Tymczak, os caracteres “z” e “k” são separados pela vogal “a”. Então temos que apenas a consoante “k” será codificada. Lembre-se que “z” é igual a 2 e “k” também é igual a 2, se estes tivessem código diferente a regra 7 não seria aplicada.

Regra 8: Se o caractere “H” ou “W” separar 2 consoantes que possuem o mesmo código Soundex, então apenas a consoante do lado direito deste caractere será codificado.

Por exemplo: na palavra Ashcraft, o caractere “h” separa as consoantes “s” e “c”, como ambas as consoantes possuem o código Soundex igual a 2, apenas o caractere “c” será codificado. O que gerará no final o código A-261.

Regra 9: De acordo com a Regra 1, todo código deve ter 4 caracteres (1 letra + 3 números). Ocorre que algumas vezes, depois de testar todas as regras acima, o tamanho do código gerado é menor que 4, para este caso em específico adicionamos uma quantidade de números “0” ao fim do código até completar 4 caracteres.

Por exemplo: A palavra AGE, gera o código “A-2” que não é suficiente para atender a regra 1, neste caso adicionamos mais 2 zeros ao final, que resulta em A-200.

Praticando

Após muita introdução e regras a serem aplicadas, vamos praticar o uso destas. Há um site que realiza o cálculo Soundex das palavras, você pode utilizá-lo para verificar se de fato o seu algoritmo foi aplicado de forma correta e está gerando os códigos corretos. Você pode acessá-lo na lista de links localizada ao final deste artigo.

Vamos começar com uma palavra fácil: LOVE.

1º Passo – A primeira letra (“L”) é conservada.

Código gerado até o momento: L-

2º Passo – A segunda letra (“O”) é ignorada, pois de acordo com a regra 3 ela não deve ser codificada.

Código gerado até o momento: L-

3º Passo – A terceira letra (“V”) é codificada com o valor 1, seguindo a tabela disposta na regra 2.

Código gerado até o momento: L-1

4º Passo – Perceba que só foram gerados 2 caracteres, faltando ainda 2 caracteres para completar os 4 que dizem na regra 1. Preenchemos então com mais 2 zeros, de acordo com a regra 9.

Código gerado até o momento: L-100

Vamos a um palavra mais complexa: ALWAYS.

1º Passo – A primeira letra (“A”) é conservada. Atente aqui ao fato de que mesmo sendo uma vogal, SEMPRE a primeira letra será conservada.

Código gerado até o momento: A-

2º Passo – A segunda letra (“L”) é codificada com o valor 4.

Código gerado até o momento: A-4

3º Passo – A terceira letra (“W”) é descartada, de acordo com a regra 3.

Código gerado até o momento: A-4

4º Passo – A quarta letra (“A”) também é descartada, de acordo com a regra 3.

Código gerado até o momento: A-4

5º Passo – A quinta letra (“Y”) também é descartada, de acordo com a regra 3.

Código gerado até o momento: A-4

6º Passo – A sexta e última letra (“S”) é codificada com o valor 2, de acordo com a tabela presente na regra 2.

Código gerado até o momento: A-42

7º Passo – Ainda falta 1 caractere para completar os 4 exigidos, então iremos preencher com zeros no final, neste caso apenas 1 zero.

Código gerado até o momento: A-420

Conclusão

O algoritmo aqui explicado é aplicado nas mais diversas áreas, e muitos projetos já foram desenvolvidos com ele. Um bom exemplo é aplicação dele em documentos ASR, que tem por objetivo a tradução de voz em texto.

Recomendo a utilização deste caso você esteja trabalhando principalmente com a língua inglesa, pois aqui ele se faz muito útil.

Links

Leitura adicional: