Tôi đang thử nghiệm triển khai metaphone cho C# và so sánh kết quả của nó với hàm metaphone() dựng sẵn từ PHP. Tuy nhiên, tôi đã đi qua một lỗi (đó là previously documented in PHP's issue tracker và thảo luận về a mailing list), nhưng tôi đang cố gắng để hiểu mã C đằng sau lỗi của họ vì lợi ích cá nhân của riêng tôi.Lỗi triển khai thực hiện metaphone PHP
Về cơ bản, theo thuật toán metaphone, hầu hết các trường hợp của -gh- phải được hiển thị im lặng. Trong trường hợp kiểm tra cụ thể của "wright", tôi mong đợi (và tạo bằng thuật toán của riêng tôi), khóa metaphone của "RT"
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
Tuy nhiên, hàm metaphone của PHP trả về RFT. Rõ ràng, nó chuyển đổi -gh- thành một F, như thể nó ở cuối một từ (ví dụ "thô"), nhưng trong trường hợp của từ "wright", điều này là không chính xác, bởi vì -gh- không đến cuối từ. Nhìn vào các tập tin metaphone.c trong việc phân phối nguồn PHP, tôi nhìn thấy một vài điều quan trọng:
/* 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')
Và sau đó trên đường dây 342:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
Có thể ai đó giúp tôi hiểu những gì chính xác chức năng NOGHTOF hiện tại và tại sao mã này không chính xác hiển thị F cho -gh- trong "wright"? Tôi không thực sự là một anh chàng C, vì vậy mã không rõ ràng với tôi.
Sau đó, có lẽ ai đó có thể gửi bản vá cho danh sách và sửa lỗi này! –
SO cần thêm câu hỏi như thế này :) –