Vì sao Parser Khang Hy Tự Điển khó hơn Parser HTML? Hành trình Reverse Engineering một bộ từ điển hơn 300 năm tuổi
Series 2 · Nền tảng học thuật — Bài 10
- ← Bài 1: Quảng Vận → Nguyễn Tài Cẩn
- ← Bài 2: Phục dựng MC không phải đoán
- ← Bài 3: Vương Lực · Âm hệ
- ← Bài 4: Parser Khang Hy (tổng quan)
- ← Bài 5: Không hardcode 50.000 chữ
- ← Bài 6: Hơn 200 quy luật
- ← Bài 7: Pure Projection & Lexical
- ← Bài 8: Candidate Ranking
- ← Bài 9: Nhiều phản thiết & vận thư
- Chuyên mục: Phiên thiết
Khi nghe đến "parser", nhiều lập trình viên sẽ nghĩ ngay đến HTML, XML, JSON hay Markdown. Đây đều là những định dạng có cú pháp (grammar) được định nghĩa rất rõ ràng. Chỉ cần đọc tài liệu đặc tả là có thể xây dựng parser. Thế nhưng, Quizzman Fanqie Engine lại phải giải quyết một bài toán hoàn toàn khác: làm thế nào để máy tính hiểu được Khang Hy Tự Điển (康熙字典) – một bộ từ điển được biên soạn từ đầu thế kỷ XVIII bằng văn ngôn Hán cổ, không có grammar chính thức, không có tài liệu kỹ thuật và chứa vô số cách ghi chú ngữ âm khác nhau. Đây cũng là một trong những phần nghiên cứu tốn nhiều thời gian nhất trong quá trình phát triển Fanqie Engine.
Parser HTML có một lợi thế rất lớn
Nếu cần xây dựng một HTML Parser, công việc tương đối rõ ràng.
HTML có:
- đặc tả (Specification);
- cú pháp chính thức;
- quy tắc lồng thẻ;
- quy tắc đóng mở;
- quy tắc xử lý lỗi.
Ví dụ:
<div class="card">
<h1>Hello</h1>
</div>
Parser biết rất rõ:
- đâu là thẻ mở;
- đâu là thẻ đóng;
- đâu là thuộc tính;
- đâu là nội dung.
Toàn bộ grammar đều được công bố công khai.
Nhiệm vụ của lập trình viên chỉ là hiện thực lại grammar đó.
Nhưng Khang Hy không có grammar
Khang Hy Tự Điển hoàn toàn khác.
Không có bất kỳ tài liệu nào nói rằng:
Nếu gặp chuỗi này thì hãy hiểu như thế này.
Không có BNF.
Không có EBNF.
Không có RFC.
Không có chuẩn Unicode dành riêng cho phản thiết.
Mỗi mục từ là kết quả của cách biên soạn học thuật cách đây hơn ba trăm năm.
Muốn parser được, trước hết phải trả lời một câu hỏi khó hơn nhiều:
Người xưa đã viết theo những quy luật nào?
Không thể viết parser ngay
Một sai lầm rất dễ mắc phải là:
Mở Khang Hy ra.
Viết Regex.
Ví dụ.
(.)(.)切
Tưởng như vậy là đủ.
Thực tế chỉ sau vài trăm mục từ đầu tiên, parser sẽ bắt đầu thất bại.
Bởi vì dữ liệu không hề thống nhất.
Ví dụ.
AB切
AB切某聲
AB切又音
AB切讀若……
讀若……
叶某韻
俗音……
又作……
古作……
Nếu coi tất cả đều là phản thiết.
Toàn bộ dữ liệu sẽ bị phân tích sai.
Bước đầu tiên là khảo sát, không phải lập trình
Thay vì viết parser ngay.
Quizzman thực hiện một công việc giống nghiên cứu ngôn ngữ học hơn.
Đó là khảo sát hàng chục nghìn mục từ để tìm xem:
- những mẫu nào xuất hiện thường xuyên;
- những ghi chú nào mang ý nghĩa ngữ âm;
- những ghi chú nào chỉ là chú thích.
Có thể hình dung quy trình như sau.
Khang Hy
↓
Quan sát
↓
Thống kê
↓
Pattern
↓
Grammar
↓
Parser
Parser chỉ xuất hiện ở bước cuối cùng.
Mục tiêu đầu tiên là nhận diện nguồn
Một mục trong Khang Hy thường không chỉ có một phản thiết.
Nó còn trích dẫn rất nhiều vận thư.
Ví dụ.
廣韻
↓
...
集韻
↓
...
唐韻
↓
...
Đối với con người.
Đây chỉ là phần chú thích.
Đối với Quizzman.
Đây là metadata cực kỳ quan trọng.
Parser phải biết:
- phản thiết này lấy từ đâu;
- nguồn nào đang được trích dẫn;
- đâu là phản thiết chính;
- đâu chỉ là tham khảo.
Nếu không nhận diện đúng nguồn.
Candidate Ranking sẽ mất toàn bộ cơ sở để đánh giá.
Không phải mọi "切" đều giống nhau
Điểm khó tiếp theo nằm ở chính phản thiết.
Nhiều người nghĩ chỉ cần gặp chữ:
切
là có thể lấy hai chữ phía trước.
Nhưng thực tế.
Sau khi khảo sát Khang Hy, Quizzman phát hiện rất nhiều pattern khác nhau.
Ví dụ.
AB切
Đây là phản thiết chuẩn.
Nhưng còn có:
AB切某聲
AB切又音
AB切音某
AB切讀若……
Mặc dù đều chứa chữ "切".
Ý nghĩa của chúng hoàn toàn khác nhau.
Khó nhất là dạng "AB切某聲"
Đây là một trong những phát hiện quan trọng nhất khi xây dựng parser.
Thoạt nhìn.
AB切某聲
giống như:
AB切
kèm thêm vài chữ giải thích.
Nhưng sau khi khảo sát nhiều mục từ.
Quizzman nhận thấy điều đó không đúng.
Trong rất nhiều trường hợp.
Phần:
某聲
không phải chú thích.
Nó thay đổi chính hồ sơ ngữ âm.
Nói cách khác.
Parser phải hiểu rằng:
- thanh mẫu vẫn lấy theo phản thiết;
- vận vẫn lấy theo phản thiết;
- nhưng thanh điệu phải được ghi đè theo ghi chú phía sau.
Nếu parser bỏ qua chi tiết này.
Middle Chinese Reconstruction sẽ sai ngay từ đầu.
"讀若" không phải phản thiết
Một nhóm khác cũng dễ gây nhầm lẫn là:
讀若……
Nếu dịch sát.
Đây chỉ là:
đọc giống như...
Nó không mô tả đầy đủ:
- thanh mẫu;
- vận;
- thanh.
Do đó.
Đây không phải dữ liệu thích hợp để phục dựng Middle Chinese.
Parser phải nhận diện:
讀若
↓
Phonetic Hint
chứ không phải:
讀若
↓
Fanqie
"叶韻" cũng không phải phát âm chuẩn
Một trường hợp khác là:
叶韻
hay:
協韻
Những ghi chú này xuất hiện chủ yếu trong thơ ca.
Chúng mô tả:
- cách đọc để hiệp vần;
- hoặc một biến thể phục vụ thi ca.
Nếu parser coi đây là phát âm chuẩn.
Engine sẽ đưa rất nhiều dữ liệu sai vào hệ thống.
Do đó.
Quizzman phân loại riêng:
叶韻
↓
Rhyme Annotation
không đi vào pipeline suy diễn Hán Việt.
Parser thực chất là một Grammar Classifier
Sau nhiều lần điều chỉnh.
Quizzman không còn coi parser là một bộ Regex.
Thay vào đó.
Parser hoạt động giống một bộ phân loại ngữ pháp.
Ví dụ.
| Pattern | Loại |
|---|---|
| AB切 | Fanqie |
| AB切某聲 | Fanqie + Tone Override |
| 讀若 | Phonetic Hint |
| 叶韻 | Rhyme Annotation |
| 又音 | Alternate Reading |
| 古音 | Historical Reading |
| 俗音 | Colloquial Reading |
Chỉ sau khi xác định đúng loại.
Engine mới quyết định cách xử lý.
Reverse Engineering thay vì Parsing
Điểm đặc biệt của Quizzman là:
Nhóm phát triển không có grammar chính thức để tham khảo.
Grammar được xây dựng theo chiều ngược lại.
Hàng chục nghìn mục từ
↓
Quan sát
↓
Thống kê
↓
Tìm quy luật
↓
Mô hình hóa
↓
Grammar
↓
Parser
Trong khoa học máy tính.
Quá trình này thường được gọi là Reverse Engineering.
Không phải hiện thực hóa một đặc tả đã có.
Mà là khôi phục lại đặc tả từ chính dữ liệu.
Parser quyết định chất lượng của toàn bộ Fanqie Engine
Rất nhiều người cho rằng phần khó nhất của Quizzman Fanqie Engine là thuật toán suy diễn Hán Việt.
Thực tế, mọi thuật toán phía sau đều bắt đầu từ parser.
Nếu parser hiểu sai một mục từ trong Khang Hy:
- phản thiết sẽ sai;
- hồ sơ Middle Chinese sẽ sai;
- thanh điệu sẽ sai;
- Candidate Ranking cũng sẽ sai.
Vì vậy, parser không đơn thuần là bước "đọc dữ liệu", mà là nền móng của toàn bộ hệ thống.
Điều khiến Quizzman Fanqie Engine khác biệt không chỉ là khả năng xử lý phản thiết, mà còn là quá trình reverse engineering cách biên soạn của Khang Hy Tự Điển để biến những ghi chép học thuật hơn ba thế kỷ trước thành một hệ thống dữ liệu có cấu trúc, đủ chính xác để máy tính có thể tiếp tục suy luận và giải thích bằng các thuật toán âm vận học.
→ Series 2 · Bài 11: Vì sao Quizzman không dùng AI để tự học quy luật âm vận?