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:

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.Text
Public 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 Function
End 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

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 Twitter
 

Referências:


José Carlos Macoratti