Estoy probando la implementación de metaphon para C# y comparando sus resultados con la función metaphone incorporada() de PHP. Sin embargo, he encontrado un error (que es previously documented in PHP's issue tracker y discutido en a mailing list), pero estoy tratando de entender el código C detrás de su error para mi propio interés personal.Error de implementación PHP metaphon
Básicamente, de acuerdo con el algoritmo de metafonía, la mayoría de las instancias de -gh- se deben silenciar. En el caso de la prueba específica de "Wright", espero (y generar con mi propio algoritmo) una clave metaphone de "RT"
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
Sin embargo, la función de PHP metaphone vuelve RFT. Claramente, está convirtiendo el -gh- en una F, como si estuviera al final de una palabra (por ejemplo, "rough"), pero en el caso de la palabra "wright", esto es incorrecto, porque -gh- does no venido al final de la palabra Mirando el archivo metaphone.c en la distribución fuente PHP, veo algunas cosas claves:
/* These prevent GH from becoming F */
#define NOGHTOF(c) (ENCODE(c) & 16) /* BDH */
...
/* Go N letters back. */
#define Look_Back_Letter(n) (w_idx >= n ? toupper(word[w_idx-n]) : '\0')
Y a continuación, en la línea 342:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
Puede alguien ayudarme a entender qué es exactamente la función NOGHTOF qué y por qué este código está representando incorrectamente una F para el -gh- en "wright"? No soy realmente un tipo C, por lo que el código no está del todo claro para mí.
¡Entonces quizás alguien pueda enviar un parche a la lista y solucionar este error! –
SO necesita más preguntas como esta :) –