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.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: