Un algoritmo fonético como soundex sólo optimizado para el idioma inglés
Una descripción de la metaphone algoritmo está disponible en esta página también hay el doble metaphone algoritmo que también está implementado en C y con una descripción de ASpell sitio
ya Hay un metaphone aplicación en delphi puede encontrar en SourceForge que versión es mucho mejor que este
El código que se encuentra debajo, Lo obtuve por la traducción de la Metaphone.cc la unidad de la htDig motor de búsqueda, obras en la C bien, pero la traducción que hice no es la mejor, ¿por Qué? porque he traducido sobre todo el uso de la C enfoque y no el de Delphi.
también me gustaría fomentar la investigación sobre la mejor (más rápido con menos código hinchado) traduce este algoritmo, estoy trabajando en uno. Si le sucede que tiene una mejor traducción de correos.
NOTAS: Este algoritmo, así como soundex están sólo en inglés así que no hay soporte para unicode, o el apoyo a las ñ, á, é, í, y varios caracteres
función MetaPhone3(const Palabra:Cadena KeyLength: Integer = 10): Cadena
& nbsp & nbsp función (x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['F','J','L','M','N','R']
& nbsp & nbsp fin
& nbsp & nbsp función Vocal(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en [ ' ','E','I','O','U']
& nbsp & nbsp fin
& nbsp & nbsp función Varson(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['C','G','P',S,'T']
& nbsp & nbsp fin
& nbsp & nbsp función Noghf(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['B', 'D', 'H']
& nbsp & nbsp fin
& nbsp & nbsp función FrontV(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['E', 'I', ' Y ' ]
& nbsp & nbsp fin
var
& nbsp & nbsp i: Integer
& nbsp & nbsp Tmp:Cadena
begin
& nbsp & nbsp Tmp := Trim(en Mayúsculas(Palabra))
& nbsp & nbsp i := 1
& nbsp & nbsp mientras i > 0)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] ['G', 'K', 'P']) y (Tmp[i 1] = 'N')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o ((Tmp[i] = ' ') y (Tmp[i 1] = 'E'))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o ((Tmp[i] = 'W') y (Tmp[i 1] = 'R')) entonces Eliminar(Tmp, i, 1)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = 'W') y (Tmp[i 1] = 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Tmp, 2, 1)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = 'X') entonces Tmp[i] := S
& nbsp & nbsp & nbsp & nbsp i := pos(' ', Tmp)
& nbsp & nbsp & nbsp & nbsp si i > 0) Tmp[i] := #0
& nbsp & nbsp fin
& nbsp & nbsp i := 0
& nbsp & nbsp Tmp := Tmp #0
& nbsp & nbsp mientras (Length(Resultado) < KeyLength)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] =#0) entonces Break
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = Tmp[i-1]) y (Tmp[i] <> 'C')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp
& nbsp & nbsp & nbsp & nbsp si Mismo(Tmp[i]) o (Vocal(Tmp[i]) y (Tmp[i-1] = #0))
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Continuar
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp caso Tmp[i] de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'B': si ((i>=2) y (Tmp[i-1] <> 'M')) o (i = 1) entonces Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'C':
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si FrontV(Tmp[i 1]) y (Tmp[i-1] <> S)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (Copia(Tmp, i, 2) = 'CH') o (Copia (Tmp, i ,3) = 'CIA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Copia(Tmp, i, 2) = 'CH') inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Copia(Tmp, i, 3) = 'CIA')entonces inc(i, 2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'D': si (Copia(Tmp, i, 2) = 'DG') y FrontV(Tmp[i 3])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i,3)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'J'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'T'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G': si ((Tmp[i 1] <> 'G') o Vocal(Tmp[i 1])) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ((Tmp[i 1]<>'N') o ((Tmp[i 1] = #0) y (Tmp[i 2]<>'E')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o (Tmp[i 3] <>'D')) y ((Tmp[i 1] <> 'D') o FrontV(Tmp[i 1])))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (FrontV(Tmp[i 1])) y (Tmp[i 2] <> 'G')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'J'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (Tmp[i 1] = 'H') y no noghf(Tmp[i -3]) y (Tmp[i -4] <> 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'H': si no Varson(Tmp[i-1]) y (no Vocal(Tmp[i-1]) o Vocal(Tmp[i 1]))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'H'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'K': si (Tmp[i-1] <> 'C') entonces Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'P': si (Tmp[i 1] = 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'P': Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp S: si (Tmp[i 1] = 'H') o ((Copia(Tmp, i, 2) = 'SI')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (Tmp[i 3] en ['O', ' ']))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'T': si (Tmp[i 1] = 'I') y (Tmp[i 2] en ['O', ' '])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else if (Tmp[i 1] = 'H') entonces Resultado := Resultado '0' persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Tmp[i 1] <> 'C') o (Tmp[i 2] <> 'H') entonces Resultado := Resultado 'T'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'V': Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'W', ' Y ' : si Vocal(Tmp[i 1]) Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'X': Resultado := Resultado 'KS'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'Z': Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp fin
fin
El algoritmo methapone
El algoritmo methapone : Multi-millones de consejos para hacer su vida mas facil.
Un algoritmo fonetico como soundex solo optimizado para el idioma ingles
Una descripcion de la metaphone algoritmo esta disponible en esta pagina tambien hay el doble metaphone algoritmo que tambien esta implementado en C y con una descripcion de ASpell sitio
ya Hay un metaphone aplicacion en delphi puede encontrar en SourceForge que version es mucho mejor que este
El codigo que se encuentra debajo, Lo obtuve por la traduccion de la Metaphone.cc la unidad de la htDig motor de busqueda, obras en la C bien, pero la traduccion que hice no es la mejor, ¿por Que? porque he traducido sobre todo el uso de la C enfoque y no el de Delphi.
tambien me gustaria fomentar la investigacion sobre la mejor (mas rapido con menos codigo hinchado) traduce este algoritmo, estoy trabajando en uno. Si le sucede que tiene una mejor traduccion de correos.
NOTAS: Este algoritmo, asi como soundex estan solo en ingles asi que no hay soporte para unicode, o el apoyo a las ñ, a, e, i, y varios caracteres
funcion MetaPhone3(const Palabra:Cadena KeyLength: Integer = 10): Cadena
& nbsp & nbsp funcion (x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['F','J','L','M','N','R']
& nbsp & nbsp fin
& nbsp & nbsp funcion Vocal(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en [ ' ','E','I','O','U']
& nbsp & nbsp fin
& nbsp & nbsp funcion Varson(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['C','G','P',S,'T']
& nbsp & nbsp fin
& nbsp & nbsp funcion Noghf(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['B', 'D', 'H']
& nbsp & nbsp fin
& nbsp & nbsp funcion FrontV(x: Char): Boolean
& nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp Resultado := x en ['E', 'I', ' Y ' ]
& nbsp & nbsp fin
var
& nbsp & nbsp i: Integer
& nbsp & nbsp Tmp:Cadena
begin
& nbsp & nbsp Tmp := Trim(en Mayusculas(Palabra))
& nbsp & nbsp i := 1
& nbsp & nbsp mientras i > 0)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] ['G', 'K', 'P']) y (Tmp[i 1] = 'N')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o ((Tmp[i] = ' ') y (Tmp[i 1] = 'E'))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o ((Tmp[i] = 'W') y (Tmp[i 1] = 'R')) entonces Eliminar(Tmp, i, 1)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = 'W') y (Tmp[i 1] = 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Tmp, 2, 1)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = 'X') entonces Tmp[i] := S
& nbsp & nbsp & nbsp & nbsp i := pos(' ', Tmp)
& nbsp & nbsp & nbsp & nbsp si i > 0) Tmp[i] := #0
& nbsp & nbsp fin
& nbsp & nbsp i := 0
& nbsp & nbsp Tmp := Tmp #0
& nbsp & nbsp mientras (Length(Resultado) < KeyLength)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] =#0) entonces Break
& nbsp & nbsp & nbsp & nbsp si (Tmp[i] = Tmp[i-1]) y (Tmp[i] <> 'C')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp
& nbsp & nbsp & nbsp & nbsp si Mismo(Tmp[i]) o (Vocal(Tmp[i]) y (Tmp[i-1] = #0))
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Continuar
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp caso Tmp[i] de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'B': si ((i>=2) y (Tmp[i-1] <> 'M')) o (i = 1) entonces Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'C':
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si FrontV(Tmp[i 1]) y (Tmp[i-1] <> S)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (Copia(Tmp, i, 2) = 'CH') o (Copia (Tmp, i ,3) = 'CIA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Copia(Tmp, i, 2) = 'CH') inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Copia(Tmp, i, 3) = 'CIA')entonces inc(i, 2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'D': si (Copia(Tmp, i, 2) = 'DG') y FrontV(Tmp[i 3])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i,3)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'J'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'T'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G': si ((Tmp[i 1] <> 'G') o Vocal(Tmp[i 1])) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ((Tmp[i 1]<>'N') o ((Tmp[i 1] = #0) y (Tmp[i 2]<>'E')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp o (Tmp[i 3] <>'D')) y ((Tmp[i 1] <> 'D') o FrontV(Tmp[i 1])))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (FrontV(Tmp[i 1])) y (Tmp[i 2] <> 'G')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'J'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (Tmp[i 1] = 'H') y no noghf(Tmp[i -3]) y (Tmp[i -4] <> 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'H': si no Varson(Tmp[i-1]) y (no Vocal(Tmp[i-1]) o Vocal(Tmp[i 1]))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'H'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'K': si (Tmp[i-1] <> 'C') entonces Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'P': si (Tmp[i 1] = 'H')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'P': Resultado := Resultado 'K'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp S: si (Tmp[i 1] = 'H') o ((Copia(Tmp, i, 2) = 'SI')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (Tmp[i 3] en ['O', ' ']))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'T': si (Tmp[i 1] = 'I') y (Tmp[i 2] en ['O', ' '])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Resultado 'X'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else if (Tmp[i 1] = 'H') entonces Resultado := Resultado '0' persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Tmp[i 1] <> 'C') o (Tmp[i 2] <> 'H') entonces Resultado := Resultado 'T'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'V': Resultado := Resultado 'F'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'W', ' Y ' : si Vocal(Tmp[i 1]) Resultado := Resultado Tmp[i]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'X': Resultado := Resultado 'KS'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'Z': Resultado := Resultado S
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp fin
fin