Categorias
O algoritmo methapone
Um algoritmo fonético, como soundex otimizado somente para o idioma inglês
Existe uma descrição do algoritmo metaphone disponível nesta página. Também existe o algoritmo metaphone duplo, que também está implementado em C e com uma descrição no site ASpell.
Existe já uma implementação metaphone em delphi. Você pode encontrá-la em SourceForge. Essa versão é muito melhor do que esta.
O código está abaixo. Obti-o traduzindo a unidade de Metaphone.cc unidade do motor de busca htDig. Ele funciona bem em C, mas a tradução que fiz não é a melhor; porquê? Porque eu traduzi principalmente usando a abordagem C, e não a Delphi.
Gostaria também de incentivar a investigação em uma melhor (mais rápido e com menos códigos) tadução deste algoritmo, estou trabalhando em uma. Se acontecer de você ter uma tradução melhor, não hesite em postá-la.
NOTA: o algoritmo, bem como soundex estão somente em inglês de forma que não possuem nenhum código único de suporte, ou suporte para ñ, á, é, í e outros carateres diversos.
função MetaPhone3(const Word:String; KeyLength: Integer = 10): linha;
função Mesma(x: Car): Boolean;
começar
Resultado := x in ['F','J','L','M','N','R'];
final;
função Vogal(x: Car): Boolean;
começar
Resultado := x in ['A','E','I','O','U'];
final;
função Varson(x: Car): Boolean;
começar
Resultado := x in ['C','G','P','S','T'];
final;
função Noghf(x: Car): Boolean;
começar
Resultado := x em ['B', 'D', 'H'];
final;
função FrontV(x: Char): Boolean;
começar
Resultado := x in ['E', 'I', 'Y']
end;
var
i: Integer;
Tmp:String;
começar
Tmp := Trim(UpperCase(Word));
i := 1;
enquanto (i > 0) do
começar
se (Tmp[i] em ['G', 'K', 'P']) e (Tmp[i+1] = 'N')
ou ((Tmp[i] = 'A') e (Tmp[i+1] = 'E'))
ou ((Tmp[i] = 'W') e (Tmp[i+1] = 'R')) e, em seguida, Apagar(Tmp, i, 1);
if (Tmp[i] = 'W') e (Tmp[i+1] = 'H') e, em seguida
Apagar(Tmp, 2, 1);
se (Tmp[i] = 'X') então Tmp[i] := 'S';
i := pos(' ', Tmp);
se (i > 0) então Tmp[i] := #0;
final;
i := 0;
Tmp := Tmp + #0;
enquanto (Length(Resultado) < KeyLength) do
começar
inc(i);
se (Tmp[i] =#0) então Break;
se (Tmp[i] = Tmp[i-1]) e (Tmp[i] <> 'C') então
Continuar;
se Same(Tmp[i]) ou (Vowel(Tmp[i]) e (Tmp[i-1] = #0)) então
começar
Resultado := Resultado + Tmp[i];
Continuar;
final;
caso Tmp[i] de
'B': se ((i>=2) e (Tmp[i-1] <> 'M')) ou (i = 1) então Resultado := Resultado + Tmp[i];
'C':
começar
se FrontV(Tmp[i+1]) e (Tmp[i-1] <> 'S') então
começar
Resultado := Resultadi + 'S';
inc(i);
e também se (Copy(Tmp, i, 2) = 'CH') ou (Copy (Tmp, i ,3) = 'CIA') então
começar
Resultado := Resultdo + 'X';
se (Copy(Tmp, i, 2) = 'CH') então inc(i);
se (Copy(Tmp, i, 3) = 'CIA')então inc(i, 2);
final também Resultado := Resultado + 'K';
final;
'D': se (Copy(Tmp, i, 2) = 'DG') e FrontV(Tmp[i+3]) então
começar
inc(i,3);
Resultado := Resultado + 'J';
final também
Resultado := Resultado + 'T';
'G': se ((Tmp[i+1] <> 'G') ou Vowel(Tmp[i+1])) e
((Tmp[i+1]<>'N') ou ((Tmp[i+1] = #0) e (Tmp[i+2]<>'E')
ou (Tmp[i+3] <>'D')) e ((Tmp[i+1] <> 'D') ou não FrontV(Tmp[i+1]))) então
começar
se (FrontV(Tmp[i+1])) e (Tmp[i+2] <> 'G') então
Resultado := Resultado + 'J'
ou
Resultado := Resultado + 'K';
final ou se (Tmp[i+1] = 'H') e não noghf(Tmp[i -3]) e (Tmp[i -4] <> 'H') então
Resultado := Resultado + 'F';
'H': se não Varson(Tmp[i-1]) e (not Vowel(Tmp[i-1]) ou Vowel(Tmp[i+1])) então
Resultado:= Resultado + 'H';
'K': se (Tmp[i-1] <> 'C') então Resultado:= Resultado + 'K';
'P': se (Tmp[i+1] = 'H') então
Resultado:= Resultado + 'F'
ou Resultado:= Resultado + Tmp[i];
'Q': Resultado:= Resultado + 'K';
'S': se (Tmp[i+1] = 'H') ou ((Copy(Tmp, i, 2) = 'SI')
e (Tmp[i+3] em ['O','A'])) então
Resultado:= Resultado + 'X'
ou
Resultado:= Resultado + 'S';
'T': se (Tmp[i+1] = 'I') e (Tmp[i+2] em ['O','A']) então
Resultado:= Resultado + 'X'
ou se (Tmp[i+1] = 'H') então Resultado:= Resultado + '0' ou
se (Tmp[i+1] <> 'C') ou (Tmp[i+2] <> 'H') então Resultado:= Resultado + 'T';
'V': Resultado:= Resultado + 'F';
'W','Y': se Vogal(Tmp[i+1]) então Resultado:= Resultado + Tmp[i];
'X': Resultado:= Resultado + 'KS';
'Z': Resultado:= Resultado + 'S';
final;
final;
final;