{"slug":"tu-khang-hy-tu-dien-den-thuat-toan-parser-quizzman-fanqie","title":"Từ Khang Hy Tự Điển đến thuật toán: Hành trình xây dựng Parser của Quizzman Fanqie Engine","summary":"Parser Fanqie Engine mô hình hóa quy ước biên tập Khang Hy: AB切, tone override AB切某聲, 讀若, 叶韻 — grammar parser âm vận, không chỉ regex.","excerpt":"Parser Fanqie Engine mô hình hóa quy ước biên tập Khang Hy: AB切, tone override AB切某聲, 讀若, 叶韻 — grammar parser âm vận, không chỉ regex.","markdown":"Series 2 · Bài 4 — Parser Khang Hy. [Bài 3](https://wiki.quizzman.com/wiki/vuong-luc-va-triet-ly-quizzman-fanqie-engine-am-he-khong-lay-tuc-doc)\n\n# Từ Khang Hy Tự Điển đến thuật toán: Hành trình xây dựng Parser của Quizzman Fanqie Engine\nTrước khi Quizzman Fanqie Engine có thể suy diễn Hán Việt từ phản thiết, một bài toán khó hơn nhiều đã phải được giải quyết: **làm thế nào để máy tính hiểu được cách các học giả thời Thanh ghi chú ngữ âm trong Khang Hy Tự Điển?** Khác với dữ liệu hiện đại có cấu trúc rõ ràng, các mục từ trong Khang Hy là sự pha trộn của phản thiết, chú âm, nhiều nguồn vận thư, các ký hiệu âm vận và vô số ngoại lệ được ghi bằng văn ngôn. Quá trình xây dựng parser vì vậy không đơn thuần là viết mã nguồn, mà bắt đầu từ việc khảo sát hàng chục nghìn mục từ để tìm ra những quy luật biên tập mà người xưa sử dụng.\n# Bài toán đầu tiên: Khang Hy không phải cơ sở dữ liệu\nNhiều người nghĩ rằng Khang Hy Tự Điển chỉ là một \"database\" khổng lồ.\n\nThực tế hoàn toàn ngược lại.\n\nKhang Hy là một tác phẩm biên soạn theo văn phong học thuật của thế kỷ XVIII.\n\nMột mục từ có thể đồng thời chứa:\n\ngiải thích nghĩa;\ndị thể;\nchú giải;\nnhiều nguồn vận thư;\nnhiều phản thiết;\nnhiều cách đọc;\nghi chú của người biên soạn.\nKhông có một định dạng cố định như XML hay JSON.\n\nMáy tính không thể đọc trực tiếp.\n\nMuốn xây dựng một engine âm vận học, trước hết phải biến những ghi chép này thành dữ liệu có cấu trúc.\n\n# Bước đầu tiên: Khảo sát pattern của toàn bộ Khang Hy\nThay vì viết parser ngay, Quizzman dành nhiều thời gian để khảo sát cách Khang Hy trình bày thông tin.\n\nMục tiêu không phải đọc từng chữ.\n\nMục tiêu là trả lời:\n\nNgười biên soạn Khang Hy thường ghi thông tin ngữ âm theo những mẫu nào?\nSau quá trình khảo sát, có thể nhận thấy phần lớn dữ liệu âm đọc đều xoay quanh một số nguồn quen thuộc:\n\n《廣韻》\n《集韻》\n《唐韻》\n《韻會》\n《正韻》\nTrong đó, **Quảng Vận** và **Tập Vận** xuất hiện với tần suất đặc biệt cao và trở thành nguồn dữ liệu quan trọng nhất đối với Fanqie Engine.\n\nĐiều này giúp parser biết được đâu là phần cần ưu tiên phân tích, đâu chỉ là chú giải bổ sung.\n\n# Không phải mọi phản thiết đều giống nhau\nSau khi xác định được vị trí của các mục Quảng Vận và Tập Vận, vấn đề khó hơn mới xuất hiện.\n\nPhản thiết trong Khang Hy không chỉ có một dạng.\n\nVí dụ đơn giản nhất là:\n\nAB切\nĐây là dạng quen thuộc nhất.\n\nParser chỉ cần tách:\n\nthượng tự;\nhạ tự.\nTuy nhiên trên thực tế còn rất nhiều biến thể khác.\n\nVí dụ:\n\nAB切某聲\nAB切又音\nAB切音某\nAB切讀若……\nAB切叶某韻\n又作……\n又與某同\n俗作……\nMỗi mẫu mang ý nghĩa học thuật khác nhau.\n\nNếu parser coi tất cả đều là phản thiết chuẩn, kết quả suy diễn sẽ sai ngay từ đầu.\n\n# Khó nhất là nhận diện \"override\"\nTrong số các mẫu xuất hiện trong Khang Hy, nhóm khó xử lý nhất là:\n\nAB切C聲\nThoạt nhìn, nhiều người sẽ nghĩ đây chỉ là:\n\nAB切\nkèm một lời chú thích.\n\nThực tế không phải vậy.\n\nTrong rất nhiều trường hợp, phần:\n\nC聲\nkhông phải lời giải thích.\n\nNó **ghi đè (override)** thanh điệu của phản thiết.\n\nĐiều này cực kỳ quan trọng.\n\nNếu parser chỉ lấy:\n\nAB切\nengine sẽ suy luận theo thanh điệu của hạ tự.\n\nTrong khi người biên soạn Khang Hy lại muốn nói:\n\nVần và thanh mẫu lấy theo phản thiết, **nhưng thanh điệu phải đổi sang C聲**.\nĐây là một trong những quy tắc khó phát hiện nhất khi xây dựng parser.\n\n# Chữ 好 là một ví dụ điển hình\nMột trong những trường hợp khiến parser phải được thiết kế lại nhiều lần là chữ:\n\n好\nNếu chỉ nhìn phản thiết, engine sẽ thu được một hồ sơ Middle Chinese.\n\nNhưng trong Khang Hy, mục từ còn kèm theo ghi chú về thanh điệu.\n\nĐiều này khiến parser phải hiểu rằng:\n\nphản thiết vẫn hợp lệ;\nnhưng thanh điệu không còn hoàn toàn do phản thiết quyết định;\nphần \"某聲\" đóng vai trò **ghi đè thuộc tính thanh**.\nNếu không xử lý đúng mẫu này, toàn bộ pipeline phía sau sẽ phục dựng sai Middle Chinese.\n\nĐây cũng là lý do Quizzman không xem parser là một bộ tách chuỗi ký tự, mà là một **bộ phân tích ngữ pháp (grammar parser)** dành riêng cho văn bản âm vận học.\n\n# \"讀若\" không phải phản thiết\nMột nhóm pattern khác cũng cần được xử lý riêng là:\n\n讀若……\nĐây không phải phản thiết.\n\nNgười biên soạn chỉ muốn nói:\n\nĐọc gần giống chữ...\nĐiều đó có nghĩa:\n\nđây là dữ liệu tham khảo;\nkhông đủ để xây dựng hồ sơ Middle Chinese chuẩn;\nkhông nên được đưa vào pipeline phản thiết như Quảng Vận.\nParser vì vậy phải nhận diện chính xác đây là **phonetic hint** chứ không phải **fanqie record**.\n\n# \"叶韻\" không mô tả phát âm chuẩn\nMột trường hợp khác rất dễ gây nhầm lẫn là:\n\n叶某韻\nhay:\n\n協韻\nĐây là những ghi chú dùng trong thơ ca.\n\nMục đích của chúng là:\n\nĐiều chỉnh cách đọc để hiệp vần.\nĐiều đó không đồng nghĩa với phát âm chuẩn trong hệ thống âm vị.\n\nNếu parser coi đây là cách đọc chính thức, engine sẽ đưa rất nhiều ngoại lệ không đúng vào dữ liệu.\n\nDo đó Quizzman tách riêng nhóm **rhyme note** khỏi nhóm **phonological evidence**.\n\n# Parser không chỉ đọc, mà còn phân loại\nSau quá trình khảo sát, parser của Quizzman không còn đơn giản là:\n\nRegex\n\n↓\n\nFanqie\nThay vào đó, mỗi đoạn chú giải đều được phân loại trước.\n\nVí dụ:\n\nBảng: Pattern | Phân loại\n\nAB切 | Fanqie chuẩn\nAB切某聲 | Fanqie + Tone Override\n讀若 | Phonetic Hint\n叶韻 | Rhyme Annotation\n又音 | Alternate Reading\n俗音 | Colloquial Reading\n古音 | Historical Reading\nChỉ sau khi biết một đoạn thuộc loại nào, engine mới quyết định cách xử lý.\n\n# Parser quyết định chất lượng của toàn bộ engine\nRất nhiều người nghĩ rằng phần khó nhất của Fanqie Engine là thuật toán suy diễn Hán Việt.\n\nThực tế, điều đó chỉ đúng một nửa.\n\nNếu parser phân loại sai ngay từ đầu, thì:\n\nMiddle Chinese sẽ sai;\nProjection sẽ sai;\nTone Resolver sẽ sai;\nCandidate Ranking cũng sẽ sai.\nNói cách khác, **mọi thuật toán phía sau đều phụ thuộc vào chất lượng của parser**.\n\nĐó là lý do Quizzman dành rất nhiều thời gian nghiên cứu cấu trúc học thuật của Khang Hy Tự Điển trước khi viết bất kỳ dòng mã nào. Thay vì xem Khang Hy là một văn bản cần \"đọc\", Quizzman xem đây là một hệ thống quy ước cần được **mô hình hóa**. Chính quá trình khảo sát pattern, phân loại các dạng phản thiết và nhận diện những trường hợp đặc biệt như **AB切某聲**, **讀若** hay **叶韻** đã đặt nền móng cho toàn bộ Quizzman Fanqie Engine sau này.\n","html":"<nav class=\"series-nav\" aria-label=\"Chuỗi Fanqie Series 2\"><p><strong>Series 2 · Nền tảng học thuật</strong> — Bài 4</p><ul><li>← Bài 1: <a href=\"https://wiki.quizzman.com/wiki/nen-tang-hoc-thuat-quizzman-fanqie-engine-tu-quang-van-den-nguyen-tai-can\">Quảng Vận → Nguyễn Tài Cẩn</a></li><li>← Bài 2: <a href=\"https://wiki.quizzman.com/wiki/vi-sao-phuc-dung-middle-chinese-khong-phai-la-doan\">Phục dựng MC không phải đoán</a></li><li>← Bài 3: <a href=\"https://wiki.quizzman.com/wiki/vuong-luc-va-triet-ly-quizzman-fanqie-engine-am-he-khong-lay-tuc-doc\">Vương Lực · Âm hệ không lấy tục đọc</a></li><li>Chuyên mục: <a href=\"https://wiki.quizzman.com/category/phien-thiet\">Phiên thiết</a></li></ul></nav>\n<blockquote class=\"ai-answer\"><p>Trước khi Quizzman Fanqie Engine có thể suy diễn Hán Việt từ phản thiết, một bài toán khó hơn nhiều đã phải được giải quyết: <strong>làm thế nào để máy tính hiểu được cách các học giả thời Thanh ghi chú ngữ âm trong Khang Hy Tự Điển?</strong> Khác với dữ liệu hiện đại có cấu trúc rõ ràng, các mục từ trong Khang Hy là sự pha trộn của phản thiết, chú âm, nhiều nguồn vận thư, các ký hiệu âm vận và vô số ngoại lệ được ghi bằng văn ngôn. Quá trình xây dựng parser vì vậy không đơn thuần là viết mã nguồn, mà bắt đầu từ việc khảo sát hàng chục nghìn mục từ để tìm ra những quy luật biên tập mà người xưa sử dụng.</p></blockquote>\n<h2>Bài toán đầu tiên: Khang Hy không phải cơ sở dữ liệu</h2>\n<p>Nhiều người nghĩ rằng Khang Hy Tự Điển chỉ là một &quot;database&quot; khổng lồ.</p>\n<p>Thực tế hoàn toàn ngược lại.</p>\n<p>Khang Hy là một tác phẩm biên soạn theo văn phong học thuật của thế kỷ XVIII.</p>\n<p>Một mục từ có thể đồng thời chứa:</p>\n<ul>\n<li>giải thích nghĩa;</li>\n<li>dị thể;</li>\n<li>chú giải;</li>\n<li>nhiều nguồn vận thư;</li>\n<li>nhiều phản thiết;</li>\n<li>nhiều cách đọc;</li>\n<li>ghi chú của người biên soạn.</li>\n</ul>\n<p>Không có một định dạng cố định như XML hay JSON.</p>\n<p>Máy tính không thể đọc trực tiếp.</p>\n<p>Muốn xây dựng một engine âm vận học, trước hết phải biến những ghi chép này thành dữ liệu có cấu trúc.</p>\n<h2>Bước đầu tiên: Khảo sát pattern của toàn bộ Khang Hy</h2>\n<p>Thay vì viết parser ngay, Quizzman dành nhiều thời gian để khảo sát cách Khang Hy trình bày thông tin.</p>\n<p>Mục tiêu không phải đọc từng chữ.</p>\n<p>Mục tiêu là trả lời:</p>\n<blockquote><p>Người biên soạn Khang Hy thường ghi thông tin ngữ âm theo những mẫu nào?</p></blockquote>\n<p>Sau quá trình khảo sát, có thể nhận thấy phần lớn dữ liệu âm đọc đều xoay quanh một số nguồn quen thuộc:</p>\n<ul>\n<li>《廣韻》</li>\n<li>《集韻》</li>\n<li>《唐韻》</li>\n<li>《韻會》</li>\n<li>《正韻》</li>\n</ul>\n<p>Trong đó, <strong>Quảng Vận</strong> và <strong>Tập Vận</strong> xuất hiện với tần suất đặc biệt cao và trở thành nguồn dữ liệu quan trọng nhất đối với Fanqie Engine.</p>\n<p>Điều này giúp parser biết được đâu là phần cần ưu tiên phân tích, đâu chỉ là chú giải bổ sung.</p>\n<h2>Không phải mọi phản thiết đều giống nhau</h2>\n<p>Sau khi xác định được vị trí của các mục Quảng Vận và Tập Vận, vấn đề khó hơn mới xuất hiện.</p>\n<p>Phản thiết trong Khang Hy không chỉ có một dạng.</p>\n<p>Ví dụ đơn giản nhất là:</p>\n<pre><code>AB切</code></pre>\n<p>Đây là dạng quen thuộc nhất.</p>\n<p>Parser chỉ cần tách:</p>\n<ul>\n<li>thượng tự;</li>\n<li>hạ tự.</li>\n</ul>\n<p>Tuy nhiên trên thực tế còn rất nhiều biến thể khác.</p>\n<p>Ví dụ:</p>\n<pre><code>AB切某聲</code></pre>\n<pre><code>AB切又音</code></pre>\n<pre><code>AB切音某</code></pre>\n<pre><code>AB切讀若……</code></pre>\n<pre><code>AB切叶某韻</code></pre>\n<pre><code>又作……</code></pre>\n<pre><code>又與某同</code></pre>\n<pre><code>俗作……</code></pre>\n<p>Mỗi mẫu mang ý nghĩa học thuật khác nhau.</p>\n<p>Nếu parser coi tất cả đều là phản thiết chuẩn, kết quả suy diễn sẽ sai ngay từ đầu.</p>\n<h2>Khó nhất là nhận diện &quot;override&quot;</h2>\n<p>Trong số các mẫu xuất hiện trong Khang Hy, nhóm khó xử lý nhất là:</p>\n<pre><code>AB切C聲</code></pre>\n<p>Thoạt nhìn, nhiều người sẽ nghĩ đây chỉ là:</p>\n<pre><code>AB切</code></pre>\n<p>kèm một lời chú thích.</p>\n<p>Thực tế không phải vậy.</p>\n<p>Trong rất nhiều trường hợp, phần:</p>\n<pre><code>C聲</code></pre>\n<p>không phải lời giải thích.</p>\n<p>Nó <strong>ghi đè (override)</strong> thanh điệu của phản thiết.</p>\n<p>Điều này cực kỳ quan trọng.</p>\n<p>Nếu parser chỉ lấy:</p>\n<pre><code>AB切</code></pre>\n<p>engine sẽ suy luận theo thanh điệu của hạ tự.</p>\n<p>Trong khi người biên soạn Khang Hy lại muốn nói:</p>\n<blockquote class=\"ai-answer\"><p>Vần và thanh mẫu lấy theo phản thiết, <strong>nhưng thanh điệu phải đổi sang C聲</strong>.</p></blockquote>\n<p>Đây là một trong những quy tắc khó phát hiện nhất khi xây dựng parser.</p>\n<h2>Chữ 好 là một ví dụ điển hình</h2>\n<p>Một trong những trường hợp khiến parser phải được thiết kế lại nhiều lần là chữ:</p>\n<pre><code>好</code></pre>\n<p>Nếu chỉ nhìn phản thiết, engine sẽ thu được một hồ sơ Middle Chinese.</p>\n<p>Nhưng trong Khang Hy, mục từ còn kèm theo ghi chú về thanh điệu.</p>\n<p>Điều này khiến parser phải hiểu rằng:</p>\n<ul>\n<li>phản thiết vẫn hợp lệ;</li>\n<li>nhưng thanh điệu không còn hoàn toàn do phản thiết quyết định;</li>\n<li>phần &quot;某聲&quot; đóng vai trò <strong>ghi đè thuộc tính thanh</strong>.</li>\n</ul>\n<p>Nếu không xử lý đúng mẫu này, toàn bộ pipeline phía sau sẽ phục dựng sai Middle Chinese.</p>\n<p>Đây cũng là lý do Quizzman không xem parser là một bộ tách chuỗi ký tự, mà là một <strong>bộ phân tích ngữ pháp (grammar parser)</strong> dành riêng cho văn bản âm vận học.</p>\n<h2>&quot;讀若&quot; không phải phản thiết</h2>\n<p>Một nhóm pattern khác cũng cần được xử lý riêng là:</p>\n<pre><code>讀若……</code></pre>\n<p>Đây không phải phản thiết.</p>\n<p>Người biên soạn chỉ muốn nói:</p>\n<blockquote><p>Đọc gần giống chữ...</p></blockquote>\n<p>Điều đó có nghĩa:</p>\n<ul>\n<li>đây là dữ liệu tham khảo;</li>\n<li>không đủ để xây dựng hồ sơ Middle Chinese chuẩn;</li>\n<li>không nên được đưa vào pipeline phản thiết như Quảng Vận.</li>\n</ul>\n<p>Parser vì vậy phải nhận diện chính xác đây là <strong>phonetic hint</strong> chứ không phải <strong>fanqie record</strong>.</p>\n<h2>&quot;叶韻&quot; không mô tả phát âm chuẩn</h2>\n<p>Một trường hợp khác rất dễ gây nhầm lẫn là:</p>\n<pre><code>叶某韻</code></pre>\n<p>hay:</p>\n<pre><code>協韻</code></pre>\n<p>Đây là những ghi chú dùng trong thơ ca.</p>\n<p>Mục đích của chúng là:</p>\n<blockquote><p>Điều chỉnh cách đọc để hiệp vần.</p></blockquote>\n<p>Điều đó không đồng nghĩa với phát âm chuẩn trong hệ thống âm vị.</p>\n<p>Nếu parser coi đây là cách đọc chính thức, engine sẽ đưa rất nhiều ngoại lệ không đúng vào dữ liệu.</p>\n<p>Do đó Quizzman tách riêng nhóm <strong>rhyme note</strong> khỏi nhóm <strong>phonological evidence</strong>.</p>\n<h2>Parser không chỉ đọc, mà còn phân loại</h2>\n<p>Sau quá trình khảo sát, parser của Quizzman không còn đơn giản là:</p>\n<pre><code>Regex\n\n↓\n\nFanqie</code></pre>\n<p>Thay vào đó, mỗi đoạn chú giải đều được phân loại trước.</p>\n<p>Ví dụ:</p>\n<div class=\"table-wrap\"><table><thead><tr><th>Pattern</th><th>Phân loại</th></tr></thead><tbody><tr><td>AB切</td><td>Fanqie chuẩn</td></tr><tr><td>AB切某聲</td><td>Fanqie + Tone Override</td></tr><tr><td>讀若</td><td>Phonetic Hint</td></tr><tr><td>叶韻</td><td>Rhyme Annotation</td></tr><tr><td>又音</td><td>Alternate Reading</td></tr><tr><td>俗音</td><td>Colloquial Reading</td></tr><tr><td>古音</td><td>Historical Reading</td></tr></tbody></table></div>\n<p>Chỉ sau khi biết một đoạn thuộc loại nào, engine mới quyết định cách xử lý.</p>\n<h2>Parser quyết định chất lượng của toàn bộ engine</h2>\n<p>Rất nhiều người nghĩ rằng phần khó nhất của Fanqie Engine là thuật toán suy diễn Hán Việt.</p>\n<p>Thực tế, điều đó chỉ đúng một nửa.</p>\n<p>Nếu parser phân loại sai ngay từ đầu, thì:</p>\n<ul>\n<li>Middle Chinese sẽ sai;</li>\n<li>Projection sẽ sai;</li>\n<li>Tone Resolver sẽ sai;</li>\n<li>Candidate Ranking cũng sẽ sai.</li>\n</ul>\n<p>Nói cách khác, <strong>mọi thuật toán phía sau đều phụ thuộc vào chất lượng của parser</strong>.</p>\n<p>Đó là lý do Quizzman dành rất nhiều thời gian nghiên cứu cấu trúc học thuật của Khang Hy Tự Điển trước khi viết bất kỳ dòng mã nào. Thay vì xem Khang Hy là một văn bản cần &quot;đọc&quot;, Quizzman xem đây là một hệ thống quy ước cần được <strong>mô hình hóa</strong>. Chính quá trình khảo sát pattern, phân loại các dạng phản thiết và nhận diện những trường hợp đặc biệt như <strong>AB切某聲</strong>, <strong>讀若</strong> hay <strong>叶韻</strong> đã đặt nền móng cho toàn bộ Quizzman Fanqie Engine sau này.</p><p class=\"series-next\">→ Series 2 · Bài 5: <a href=\"https://wiki.quizzman.com/wiki/vi-sao-quizzman-fanqie-engine-khong-hardcode-hon-50000-chu-han\">Vì sao Quizzman Fanqie Engine không hardcode hơn 50.000 chữ Hán?</a></p>","tags":["Chữ Hán","Lập trình","Ngôn ngữ","Phiên thiết","Thuật toán"],"author":"System Legacy","publishedAt":"2026-07-15T08:56:23.369Z","updatedAt":"2026-07-17T02:35:24.080Z","published_at":"2026-07-15T08:56:23.369Z","updated_at":"2026-07-17T02:35:24.080Z","view_count":8,"canonical":"https://wiki.quizzman.com/wiki/tu-khang-hy-tu-dien-den-thuat-toan-parser-quizzman-fanqie","url":"https://wiki.quizzman.com/wiki/tu-khang-hy-tu-dien-den-thuat-toan-parser-quizzman-fanqie","markdownUrl":"https://wiki.quizzman.com/api/articles/tu-khang-hy-tu-dien-den-thuat-toan-parser-quizzman-fanqie.md","apiUrl":"https://wiki.quizzman.com/api/articles/tu-khang-hy-tu-dien-den-thuat-toan-parser-quizzman-fanqie"}