VB .NET - Uma implementação do algoritmo Soundex
|  | Neste artigo eu vou apresentar uma implementação do algoritmo SOUNDEX, desenvolvido pelo governo americano (U.S National Archives and Records Administration). | 
A algum tempo atrás eu escrevi um artigo - SQL - Pesquisa fonética com Soundex (VB6) - onde abordei o algoritmo SOUNDEX e mostrei como usar a função Soundex do SQL Server.
Este algoritmo foi criado pelo governo Americano para recuperar nomes para a administração da Seguridade Social em seu banco de dados. O algoritmo é simples e esta explicado a seguir: (Conforme conteúdo de : http://www.archives.gov/research/census/soundex.html)
Nota: Lembre-se que o algoritmo leva em consideração a fonética da língua inglesa para o qual foi desenvolvido, portanto não vai funcionar corretamente para o idioma português.
Conceitos Básicos
Cada código 
soundex é 
formado por uma letra e três números, como o W-252. 
- A letra é sempre a primeira letra do nome; 
- Os números são atribuídos às letras restantes de acordo com o guia soundex a 
seguir;
- São adicionados zeros ao final se necessário para produzir um código de quatro 
caracteres; 
- As letras adicionais são desconsideradas;
- Se a string tem letras duplas, eles devem ser tratadas como uma única letra. 
Por exemplo:  Gutierrez está codificada G-362 (G, 3 para o T, 
6 para a primeira R, segundo R ignorado, 2 para o Z).
Exemplos:
- Washington está codificada W-252 (W, 2 para o S, 5 para o N, 2 
para o G, demais letras desconsideras).
- Lee é codificado como L-000 (L, 000 acrescentados).
Nota : Para verificar o código Soundex acesse a calculadora Soundex on-line no link: http://www.eogn.com/soundex/
| Número | Letra Correspondente | As 
    letras A, E, I, O, U, H, W, e Y são desconsideradas | 
| 1 | B , F , P , V | |
| 2 | C , S , G , J . K , Q , X , Z | |
| 3 | D , T | |
| 4 | L | |
| 5 | M , N | |
| 6 | R | 
O valor 0 (zero) é atribuído as demais letras ou palavras muito curtas.
Exemplo:
A palavra SOUNDEX tem o valor SOUNDEX igual a S532 .
Veja se chegou a este resultado: S(é mantido) , OU(não considerados), N=5 , D=3 , E(não considerado) , X=2
Vamos então partir para parte prática que é implementar o algoritmo SOUNDEX na linguagem VB .NET.
Recursos usados :
Implementando o algoritmo SOUNDEX no VB .NET
Abra o VS Express 2013 for Windows Desktop e clique em New Project;
A seguir selecione a linguagem Visual Basic e o template Windows Forms Application;
Informe o nome Soundex_VBNET e clique no botão OK;
|  | 
A seguir selecione o formulário padrão form1.vb e altere o seu nome para frmAlunos e a seguir inclua, a partir da ToolBox, os seguintes controles:
2 Label - Informe a palavra e Valor Soundex
2 TextBox - txtPalavra e txtSoundex
1 Button - btnCalcular
Define o leiaute do formulário conforme a figura abaixo:
|  | 
A seguir vamos incluir uma classe chamada Soundex no projeto onde iremos definir o método CalcularSoundex que irá realizar o cálculo baseado no algoritmo SOUNDEX.
No menu PROJECT clique em Add Class e informe o nome Soundex.
A seguir defina o método CalcularSoundex conforme o código a seguir:
| Imports System.TextPublic Class Soundex    Public Shared Function CalcularSoundex(palavra As String) As String        Dim Resultado As New StringBuilder()        Try
            If palavra IsNot Nothing AndAlso palavra.Length > 0 Then
                Dim CodigoAnterior As String = "", CodigoAtual As String = "", LetraAtual As String = ""                Resultado.Append(palavra.Substring(0, 1))                For i As Integer = 1 To palavra.Length - 1
                    LetraAtual = palavra.Substring(i, 1).ToLower()
                    CodigoAtual = ""                    If "bfpv".IndexOf(LetraAtual) > -1 Then
                        CodigoAtual = "1"
                    ElseIf "cgjkqsxz".IndexOf(LetraAtual) > -1 Then
                        CodigoAtual = "2"
                    ElseIf "dt".IndexOf(LetraAtual) > -1 Then
                        CodigoAtual = "3"
                    ElseIf LetraAtual = "l" Then
                        CodigoAtual = "4"
                    ElseIf "mn".IndexOf(LetraAtual) > -1 Then
                        CodigoAtual = "5"
                    ElseIf LetraAtual = "r" Then
                        CodigoAtual = "6"
                    End If                    If CodigoAtual <> CodigoAnterior Then
                        Resultado.Append(CodigoAtual)
                    End If                    If Resultado.Length = 4 Then
                        Exit For
                    End If                    If CodigoAtual <> "" Then
                        CodigoAnterior = CodigoAtual
                    End If
                Next
            End If            If Resultado.Length < 4 Then
                Resultado.Append(New [String]("0"c, 4 - Resultado.Length))
            End If            Return Resultado.ToString().ToUpper()        Catch ex As Exception
            Throw ex
        End Try
    End FunctionEnd Class | 
No evento Click do botão de comando btnCalcular insira o código que chama a função CalcularSoundex passando a palavra informada na caixa de texto e retorna o valor exibido em txtSoundex:
|  Private Sub btnCalcular_Click(sender As Object, e As EventArgs) Handles btnCalcular.Click        If txtPalavra.Text = String.Empty Then
            MessageBox.Show("Informe uma palavra...")
            Return
        End If        If txtPalavra.Text.Length < 2 Then
            MessageBox.Show("Informe uma palavr com dois caracteres....")
            Return
        End If        Try
            txtSoundex.Text = Soundex.CalcularSoundex(txtPalavra.Text)
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try    End Sub
 | 
Executando o projeto e calculando o Soundex para uma palavra que já foi calculada no site http://www.eogn.com/soundex/ verificamos que os valores coincidem mostrando que a implementação esta correta:

Abaixo a versão do mesmo código na linguagem C# : (Eu não testei esse código apenas converti)
| public static string CalcularSoundex(string palavra)
{
	StringBuilder Resultado = new StringBuilder();
	try {
		if (palavra != null && palavra.Length > 0) {
			string CodigoAnterior = "";
			string CodigoAtual = "";
			string LetraAtual = "";			Resultado.Append(palavra.Substring(0, 1));			for (int i = 1; i <= palavra.Length - 1; i++) {
				LetraAtual = palavra.Substring(i, 1).ToLower();
				CodigoAtual = "";				if ("bfpv".IndexOf(LetraAtual) > -1) {
					CodigoAtual = "1";
				} else if ("cgjkqsxz".IndexOf(LetraAtual) > -1) {
					CodigoAtual = "2";
				} else if ("dt".IndexOf(LetraAtual) > -1) {
					CodigoAtual = "3";
				} else if (LetraAtual == "l") {
					CodigoAtual = "4";
				} else if ("mn".IndexOf(LetraAtual) > -1) {
					CodigoAtual = "5";
				} else if (LetraAtual == "r") {
					CodigoAtual = "6";
				}				if (CodigoAtual != CodigoAnterior) {
    				      Resultado.Append(CodigoAtual);
				}				if (Resultado.Length == 4) {
				     break; 
				}				if (!string.IsNullOrEmpty(CodigoAtual)) {
				     CodigoAnterior = CodigoAtual;
				}
			}
		}		if (Resultado.Length < 4) {
			Resultado.Append(new String('0', 4 - Resultado.Length));
		}		return Resultado.ToString().ToUpper();	} catch (Exception ex) {
		throw ex;
     }
} | 
Pegue o projeto 
completo aqui: 
 Soundex_VBNET.zip
 
Soundex_VBNET.zip
Porque nem mesmo seus irmãos criam nele.
Disse-lhes, pois, Jesus: Ainda não é chegado o meu tempo, mas o vosso tempo sempre está pronto.
O mundo não vos pode odiar, mas ele me odeia a mim, porquanto dele testifico que as suas obras são más.
João 7:5-7
Bons códigos... 

| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
             Gostou ?
  Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter
 
Referências: