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

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

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ụ.

PatternLoạ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?