Xin chào. Tôi xin giới thiệu Gukhanmun, một thư viện chuyển văn bản Hán-Hàn sang dạng chỉ dùng chữ Hàn. Hy vọng nó sẽ hữu ích khi xử lý các văn bản như tư liệu cổ, tài liệu Hán-Hàn, báo cũ hay công văn xưa.
Thoạt nhìn thì có vẻ chỉ cần tra bảng đối chiếu cách đọc cho từng chữ là đủ, nhưng khi thực sự triển khai sẽ nhanh chóng thấy rằng cách đó rất khó cho ra kết quả đúng. Ngay cả với cùng một chữ Hán, nếu đứng ở đầu từ thì quy tắc biến âm đầu có thể được áp dụng, và khi nhiều chữ ghép lại thành một từ thì cách phát âm cũng có thể khác với cách đọc từng chữ riêng lẻ. 「庫間」 không phải là “gogan” mà là “gotgan”, 「標識」 không phải là “pyosik” mà là “pyoji”, và dạng trộn Hán tự với chữ Hàn như 「汽車gil」 thì có thêm âm nối thành “gichatgil”. Các con số viết bằng Hán tự cũng khá phức tạp: 「二〇一六年」 đúng là “2016-nyeon”, nhưng 「十一月」 là “11-wol”, còn 「一千二百三十四」 là “1234”, nên ngay trong cùng một kiểu ký số cũng phải xác định đang theo cách biểu diễn nào.
Trước đây tôi từng tạo thư viện Haskell Seonbi với mục đích tương tự, nhưng lần này tôi viết lại bằng Rust, tập trung phạm vi vào việc chuyển đổi Hán tự. Thư viện tích hợp sẵn Từ điển chuẩn tiếng Hàn nên có thể dùng ngay mà không cần cài thêm từ điển riêng, đồng thời xử lý văn bản thường, HTML và Markdown. Kết quả đầu ra có thể là chỉ giữ lại chữ Hàn, chú thích kèm Hán tự bằng dấu ngoặc như hanja(漢字), hoặc xuất ra dưới dạng HTML ruby markup. Tôi cũng thêm preset chính tả Nam Hàn/Bắc Hàn và tùy chọn chú thích Hán tự khi có từ đồng âm khác nghĩa.
Phần tôi chú trọng nhất là thuật toán phân tách. Cách chọn mục dài nhất từ trái sang phải sẽ cắt 「資本論理」 thành 「資本論」+「理」 và đọc thành “jabonroni”. Gukhanmun chạy quy hoạch động (thuật toán Viterbi) trên lattice để tách thành 「資本」+「論理」 và tìm ra cách đọc “jabonnonri”.
Một trong những lý do tôi chọn viết bằng Rust ngay từ đầu là để dễ tái sử dụng trong nhiều ngôn ngữ khác nhau. CLI có thể tải từ GitHub Releases, crate Rust gukhanmun có trên crates.io, còn phía JavaScript thì có hai bản là WebAssembly(@gukhanmun/wasm) và Node.js native addon(@gukhanmun/napi), đều đã được đưa lên npm và JSR. Crate lõi gukhanmun-core cũng hỗ trợ môi trường no_std + alloc, nên có thể dùng cả trong hệ thống nhúng.
- Tài liệu và website: https://gukhanmun.org/ko-KR/
- Playground: https://gukhanmun.org/ko-KR/playground
- Kho GitHub: https://github.com/dahlia/gukhanmun
Chưa có bình luận nào.