phonétique algorithme tel que soundex seulement optimisé pour la langue anglaise
Une description de l'algorithme metaphone est disponible à cette page, il y a aussi le double metaphone algorithme qui est également mis en œuvre sur C et avec une description à ASpell site
Il y a déjà un metaphone de mise en œuvre de delphi, vous pouvez le trouver sur SourceForge cette version est bien meilleure que ce
Le code est ci-dessous, J'ai obtenu par la traduction de la Metaphone.cc l'unité de la htDig moteur de recherche, il travaille dans C bien mais la traduction que j'ai faite n'est pas la meilleure, Pourquoi? parce que j'ai traduit le plus souvent en utilisant le C de l'approche et de ne pas le Delphi.
je tiens également à encourager la recherche sur le mieux (plus rapide, moins de code de ballonnement) traduit cet algorithme, je suis en train de travailler sur une seule. Si vous avez une meilleure traduction à la poste.
NOTE: Cet algorithme ainsi que soundex sont uniquement en anglais donc pas de support de l'unicode, ou l'appui -, á, é, í et miscelaneous caractères
fonction MetaPhone3(const Mot:String KeyLength: Integer = 10): String
& nbsp & nbsp fonction Même(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Résultat := x de ['F',J,L,'M','N', ' R ' ]
& nbsp & nbsp fin
& nbsp & nbsp fonction Voyelle(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Résultat := x de ['A','E','I','O','U']
& nbsp & nbsp fin
& nbsp & nbsp fonction Varson(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de [ ' C ' ,'G','P','S','T']
& nbsp & nbsp fin
& nbsp & nbsp fonction Noghf(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de ['B', 'D', 'H']
& nbsp & nbsp fin
& nbsp & nbsp fonction FrontV(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de ['E', 'I', 'Y']
& nbsp & nbsp fin
var
& nbsp & nbsp i: Integer
& nbsp & nbsp Tmp:String
begin
& nbsp & nbsp Tmp := Trim(Majuscules(Mot))
& nbsp & nbsp j' := 1
& nbsp & nbsp while i > 0)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp si (Tmp[i] de ['G', ' K ' , 'P']) et (Tmp[i 1] = 'N')
& ! & ! & ! & ! & ! & nbsp ou ((Tmp[i] = 'A') et (Tmp[i 1] = 'E'))
& ! & ! & ! & ! & ! & nbsp ou ((Tmp[i] = ' W ' ) et (Tmp[i 1] = ' R ' )) Supprimer(Tmp, i, 1)
& ! & ! & ! & nbsp si (Tmp[i] = ' W ' ) et (Tmp[i 1] = 'H') puis
& ! & ! & ! & ! & ! & nbsp Supprimer(Tmp, 2, 1)
& ! & ! & ! & nbsp si (Tmp[i] = 'X') Tmp[i] := 'S'
& ! & ! & ! & ! i := pos(' ', Tmp)
& ! & ! & ! & nbsp si i > 0) Tmp[i] := #0
& nbsp & nbsp fin
& nbsp & nbsp i := 0
& nbsp & nbsp Tmp := Tmp #0
& nbsp & nbsp while (Length () < KeyLength)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp inc(i)
& ! & ! & ! & nbsp si (Tmp[i] =#0) Break
& ! & ! & ! & nbsp si (Tmp[i] = Tmp[i-1]) et (Tmp[i] <> ' C ' ) puis
& ! & ! & ! & ! & ! & nbsp
& ! & ! & ! & nbsp si Même(Tmp[i]) ou (Voyelle(Tmp[i]) et (Tmp[i-1] = #0)) puis
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp Continuer
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp cas Tmp[i] de
& ! & ! & ! & ! & ! & nbsp 'B': si ((i>=2) et (Tmp[i-1] <> 'M')) ou i = 1) Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp ' C ' :
& ! & ! & ! & ! & ! & nbsp begin
& ! & ! & ! & ! & ! & ! & ! & nbsp si FrontV(Tmp[i 1]) et (Tmp[i-1] <> 'S') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat 'S'
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(i)
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Copier(Tmp, i, 2) = 'CH') ou (Copier (Tmp, i ,3) = 'CIA') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat 'X'
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Copier(Tmp, i, 2) = 'CH') inc(i)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Copier(Tmp, i, 3) = 'CIA')inc(i, 2)
& ! & ! & ! & ! & ! & ! & ! & nbsp autre Résultat := Résultat ' K '
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp 'D': si (Copier(Tmp, i, 2) = 'DG') et FrontV(Tmp[i 3]) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(i,3)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat J
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat 'T'
& ! & ! & ! & ! & ! & nbsp 'G': si ((Tmp[i 1] <> 'G') ou Voyelle(Tmp[i 1])) et
& ! & ! & ! & ! & ! & ! & ! & nbsp ((Tmp[i 1]<>'N') ou ((Tmp[i 1] = #0) et (Tmp[i 2]<>'E')
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ou (Tmp[i 3] <>'D')) et ((Tmp[i 1] <> 'D') ou pas FrontV(Tmp[i 1]))) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & nbsp & nbsp & nbsp si (FrontV(Tmp[i 1])) et (Tmp[i 2] <> 'G') puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat 'J'
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat ' K '
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Tmp[i 1] = 'H') et pas noghf(Tmp[i -3]) et (Tmp[i -4] <> 'H') puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'F'
& ! & ! & ! & ! & ! & nbsp 'H': sinon Varson(Tmp[i-1]) et (pas Voyelle(Tmp[i-1]) ou Voyelle(Tmp[i 1])) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'H'
& ! & ! & ! & ! & ! & nbsp ' K ' : si (Tmp[i-1] <> ' C ' ) Résultat := Résultat ' K '
& ! & ! & ! & ! & ! & nbsp 'P': si (Tmp[i 1] = 'H') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'F'
& ! & ! & ! & ! & ! & ! & ! & nbsp else Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp 'Q': Result := Result ' K '
& ! & ! & ! & ! & ! & nbsp 'S': si (Tmp[i 1] = 'H') ou ((Copier(Tmp, i, 2) = 'SI')
& ! & ! & ! & ! & ! & ! & ! & nbsp et (Tmp[i 3] de ['O','A'])) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'X'
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := Résultat 'S'
& ! & ! & ! & ! & ! & nbsp 'T': si (Tmp[i 1] = 'I') et (Tmp[i 2] de ['O','A']) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'X'
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Tmp[i 1] = 'H') Result := Result '0' else
& ! & ! & ! & ! & ! & ! & ! & nbsp si (Tmp[i 1] <> ' C ' ) ou (Tmp[i 2] <> 'H') Résultat := Résultat 'T'
& ! & ! & ! & ! & ! & nbsp 'V': Résultat := Résultat 'F'
& ! & ! & ! & ! & ! & nbsp ' W ' ,'Y': si Voyelle(Tmp[i 1]) Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp 'X': Résultat := Résultat 'KS'
& ! & ! & ! & ! & ! & nbsp 'Z': Résultat := Résultat 'S'
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
L'algorithme methapone
L'algorithme methapone : Plusieurs milliers de conseils pour vous faciliter la vie.
phonetique algorithme tel que soundex seulement optimise pour la langue anglaise
Une description de l'algorithme metaphone est disponible a cette page, il y a aussi le double metaphone algorithme qui est egalement mis en œuvre sur C et avec une description a ASpell site
Il y a deja un metaphone de mise en œuvre de delphi, vous pouvez le trouver sur SourceForge cette version est bien meilleure que ce
Le code est ci-dessous, J'ai obtenu par la traduction de la Metaphone.cc l'unite de la htDig moteur de recherche, il travaille dans C bien mais la traduction que j'ai faite n'est pas la meilleure, Pourquoi? parce que j'ai traduit le plus souvent en utilisant le C de l'approche et de ne pas le Delphi.
je tiens egalement a encourager la recherche sur le mieux (plus rapide, moins de code de ballonnement) traduit cet algorithme, je suis en train de travailler sur une seule. Si vous avez une meilleure traduction a la poste.
NOTE: Cet algorithme ainsi que soundex sont uniquement en anglais donc pas de support de l'unicode, ou l'appui -, a, e, i et miscelaneous caracteres
fonction MetaPhone3(const Mot:String KeyLength: Integer = 10): String
& nbsp & nbsp fonction Meme(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Resultat := x de ['F',J,L,'M','N', ' R ' ]
& nbsp & nbsp fin
& nbsp & nbsp fonction Voyelle(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Resultat := x de ['A','E','I','O','U']
& nbsp & nbsp fin
& nbsp & nbsp fonction Varson(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de [ ' C ' ,'G','P','S','T']
& nbsp & nbsp fin
& nbsp & nbsp fonction Noghf(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de ['B', 'D', 'H']
& nbsp & nbsp fin
& nbsp & nbsp fonction FrontV(x: Char): Boolean
& nbsp & nbsp begin
& ! & ! & ! & nbsp Result := x de ['E', 'I', 'Y']
& nbsp & nbsp fin
var
& nbsp & nbsp i: Integer
& nbsp & nbsp Tmp:String
begin
& nbsp & nbsp Tmp := Trim(Majuscules(Mot))
& nbsp & nbsp j' := 1
& nbsp & nbsp while i > 0)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp si (Tmp[i] de ['G', ' K ' , 'P']) et (Tmp[i 1] = 'N')
& ! & ! & ! & ! & ! & nbsp ou ((Tmp[i] = 'A') et (Tmp[i 1] = 'E'))
& ! & ! & ! & ! & ! & nbsp ou ((Tmp[i] = ' W ' ) et (Tmp[i 1] = ' R ' )) Supprimer(Tmp, i, 1)
& ! & ! & ! & nbsp si (Tmp[i] = ' W ' ) et (Tmp[i 1] = 'H') puis
& ! & ! & ! & ! & ! & nbsp Supprimer(Tmp, 2, 1)
& ! & ! & ! & nbsp si (Tmp[i] = 'X') Tmp[i] := 'S'
& ! & ! & ! & ! i := pos(' ', Tmp)
& ! & ! & ! & nbsp si i > 0) Tmp[i] := #0
& nbsp & nbsp fin
& nbsp & nbsp i := 0
& nbsp & nbsp Tmp := Tmp #0
& nbsp & nbsp while (Length () < KeyLength)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp inc(i)
& ! & ! & ! & nbsp si (Tmp[i] =#0) Break
& ! & ! & ! & nbsp si (Tmp[i] = Tmp[i-1]) et (Tmp[i] <> ' C ' ) puis
& ! & ! & ! & ! & ! & nbsp
& ! & ! & ! & nbsp si Meme(Tmp[i]) ou (Voyelle(Tmp[i]) et (Tmp[i-1] = #0)) puis
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp Continuer
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp cas Tmp[i] de
& ! & ! & ! & ! & ! & nbsp 'B': si ((i>=2) et (Tmp[i-1] <> 'M')) ou i = 1) Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp ' C ' :
& ! & ! & ! & ! & ! & nbsp begin
& ! & ! & ! & ! & ! & ! & ! & nbsp si FrontV(Tmp[i 1]) et (Tmp[i-1] <> 'S') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat 'S'
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(i)
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Copier(Tmp, i, 2) = 'CH') ou (Copier (Tmp, i ,3) = 'CIA') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat 'X'
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Copier(Tmp, i, 2) = 'CH') inc(i)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Copier(Tmp, i, 3) = 'CIA')inc(i, 2)
& ! & ! & ! & ! & ! & ! & ! & nbsp autre Resultat := Resultat ' K '
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp 'D': si (Copier(Tmp, i, 2) = 'DG') et FrontV(Tmp[i 3]) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(i,3)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat J
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat 'T'
& ! & ! & ! & ! & ! & nbsp 'G': si ((Tmp[i 1] <> 'G') ou Voyelle(Tmp[i 1])) et
& ! & ! & ! & ! & ! & ! & ! & nbsp ((Tmp[i 1]<>'N') ou ((Tmp[i 1] = #0) et (Tmp[i 2]<>'E')
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ou (Tmp[i 3] <>'D')) et ((Tmp[i 1] <> 'D') ou pas FrontV(Tmp[i 1]))) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & nbsp & nbsp & nbsp si (FrontV(Tmp[i 1])) et (Tmp[i 2] <> 'G') puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat 'J'
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat ' K '
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Tmp[i 1] = 'H') et pas noghf(Tmp[i -3]) et (Tmp[i -4] <> 'H') puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'F'
& ! & ! & ! & ! & ! & nbsp 'H': sinon Varson(Tmp[i-1]) et (pas Voyelle(Tmp[i-1]) ou Voyelle(Tmp[i 1])) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'H'
& ! & ! & ! & ! & ! & nbsp ' K ' : si (Tmp[i-1] <> ' C ' ) Resultat := Resultat ' K '
& ! & ! & ! & ! & ! & nbsp 'P': si (Tmp[i 1] = 'H') puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'F'
& ! & ! & ! & ! & ! & ! & ! & nbsp else Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp 'Q': Result := Result ' K '
& ! & ! & ! & ! & ! & nbsp 'S': si (Tmp[i 1] = 'H') ou ((Copier(Tmp, i, 2) = 'SI')
& ! & ! & ! & ! & ! & ! & ! & nbsp et (Tmp[i 3] de ['O','A'])) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'X'
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := Resultat 'S'
& ! & ! & ! & ! & ! & nbsp 'T': si (Tmp[i 1] = 'I') et (Tmp[i 2] de ['O','A']) puis
& ! & ! & ! & ! & ! & ! & ! & nbsp Result := Result 'X'
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (Tmp[i 1] = 'H') Result := Result '0' else
& ! & ! & ! & ! & ! & ! & ! & nbsp si (Tmp[i 1] <> ' C ' ) ou (Tmp[i 2] <> 'H') Resultat := Resultat 'T'
& ! & ! & ! & ! & ! & nbsp 'V': Resultat := Resultat 'F'
& ! & ! & ! & ! & ! & nbsp ' W ' ,'Y': si Voyelle(Tmp[i 1]) Result := Result Tmp[i]
& ! & ! & ! & ! & ! & nbsp 'X': Resultat := Resultat 'KS'
& ! & ! & ! & ! & ! & nbsp 'Z': Resultat := Resultat 'S'
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin