Testuję implementację metafonu dla języka C# i porównywanie jej wyników z wbudowaną funkcją metaphone() z PHP. Jednak natknąłem się na błąd (który jest previously documented in PHP's issue tracker i omówiony na a mailing list), ale staram się zrozumieć kod C za ich błędów dla mojego osobistego zainteresowania.Błąd implementacji metafonu PHP
Zasadniczo, zgodnie z algorytmem metafonowym, większość przypadków -gh- powinno być cichych. W konkretnym przypadku testowego „Wright”, oczekuję (i generować z mojego własnego algorytmu) klucza Metaphone z „RT”
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
Jednak funkcja Metaphone PHP zwraca RFT. Najwyraźniej konwertuje -gh- na F, jak gdyby znajdowało się na końcu słowa (np. "Szorstki"), ale w przypadku słowa "wright" jest to niepoprawne, ponieważ -gh- nie przychodzi na końcu tego słowa. Patrząc na pliku metaphone.c w źródłowej dystrybucji PHP, widzę kilka kluczowych rzeczy:
/* 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')
a następnie na linii 342:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
Czy ktoś może mi pomóc zrozumieć, co dokładnie funkcję NOGHTOF robi i dlaczego ten kod niepoprawnie renderuje F dla -gh- w "wright"? Naprawdę nie jestem facetem w C, więc kod nie jest dla mnie jasny.
Wtedy może ktoś może przesłać łatkę do listy i naprawić ten błąd! –
SO potrzebuje więcej pytań takich jak to :) –