9 poin oleh hongminhee 13 jam lalu | Belum ada komentar. | Bagikan ke WhatsApp

Halo. Saya merilis Gukhanmun, sebuah pustaka yang mengubah teks campuran hanja-hangul menjadi khusus Hangul. Semoga ini bermanfaat saat memproses teks seperti literatur lama, materi campuran hanja-hangul, koran lama, atau dokumen resmi.

Sekilas mungkin terlihat cukup dengan mencari tabel korespondensi bacaan untuk tiap karakter, tetapi saat benar-benar diimplementasikan, segera terlihat bahwa pendekatan seperti itu sulit menghasilkan hasil yang benar. Hanja yang sama pun tunduk pada aturan bunyi awal saat berada di awal kata, dan ketika beberapa karakter membentuk satu kata, pengucapannya bisa berbeda dari bacaan per karakter. 「庫間」 bukan “gogan” melainkan “gotgan”, 「標識」 bukan “pyosik” melainkan “pyoji”, dan 「汽車gil」 yang mencampur hanja dan Hangul mendapat sisipan s sehingga menjadi “gichatgil”. Angka hanja juga rumit: 「二〇一六年」 benar dibaca “2016-nyeon”, tetapi 「十一月」 menjadi “11-wol” dan 「一千二百三十四」 menjadi “1234”, jadi bahkan di dalam penulisan angka yang sama pun perlu ditentukan format mana yang digunakan.

Dulu saya pernah membuat pustaka Haskell Seonbi untuk tujuan serupa, tetapi kali ini saya menulis ulang dalam Rust dengan fokus pada konversi hanja. Kamus Standar Bahasa Korea sudah disertakan sehingga bisa digunakan tanpa memasang kamus terpisah, dan pustaka ini memproses teks biasa, HTML, serta Markdown. Hasil keluaran bisa berupa hanya Hangul, bentuk anotasi dalam tanda kurung seperti hanja(漢字), atau diekspor sebagai markup ruby HTML. Saya juga menambahkan preset ejaan Korea Selatan dan Korea Utara, serta opsi untuk menampilkan hanja saat ada homonim.

Bagian yang paling saya perhatikan adalah algoritme segmentasi. Metode yang memilih entri terpanjang dari kiri ke kanan akan memotong 「資本論理」 menjadi 「資本論」+「理」 dan membacanya sebagai “jabonroni”. Gukhanmun menjalankan dynamic programming (algoritme Viterbi) di atas lattice untuk membaginya menjadi 「資本」+「論理」 dan menemukan bacaan “jabonnolli”.

Salah satu alasan saya membuatnya dalam Rust sejak awal adalah agar mudah dipakai dari berbagai bahasa. CLI tersedia di GitHub Releases, crate Rust gukhanmun bisa didapat di crates.io, dan untuk JavaScript saya menyediakan dua varian, yaitu WebAssembly(@gukhanmun/wasm) dan add-on native Node.js(@gukhanmun/napi), yang sudah diunggah ke npm dan JSR. Crate inti gukhanmun-core juga mendukung lingkungan no_std + alloc, sehingga bisa dipakai di sistem embedded.

Belum ada komentar.

Belum ada komentar.