開發小狼毫韓語羅馬字輸入法

開發小狼毫韓語羅馬字輸入法

目前最主流的韓語輸入法佈局是兩區式(두벌식/두벌式, 2 Beolsik),韓國標準的實體鍵盤也是採用這個佈局。可以說兩區式佈局之於韓語輸入法,就如大千式佈局之於注音輸入法。兩區式佈局左側是子音,右側是母音,如此排列設計是很合理的。不過由於中國生產的鍵盤絕大多數都是美式鍵盤,所以鍵帽上沒有諺文鍵位的印刷,導致初學者在輸入韓文的時候不方便。針對此問題,有人會選擇去淘寶上購買鍵盤貼紙或鍵盤膜,不過看價格真的是成本低利潤高;有人可能會轉為尋找羅馬字輸入法。面對輸入法,有不少人有這麼一個情節,就是輸入法要用主流的,這樣去到哪裡都能用。例如說如果你打中文只會五筆而不會拼音,或者只會嘸蝦米而不會注音,那麼在使用別人的電腦或者是公共電腦時,可能會遇到輸入上的麻煩。我一開始也有這種想法,這種想法確實是非常合理的。但是我又轉念一想,首先我目前使用的中文輸入法已經足夠特立獨行了,在大家都在使用拼音的環境下使用了注音輸入法,又在大家都使用微軟新注音的環境下使用了小狼毫注音輸入法,又在大家使用小狼毫注音輸入法的環境下把裡面的配置一頓魔改,所以如此前提下我使用一個非主流的韓語輸入法也說得過去了。其次就是我認為輸入法只是一個工具,只要能輸入、使用起來趁手即可。最後有一個最重要的就是我使用韓語輸入法純粹是為了興趣,並不需要從事相關的工作,所以就算是我不會用韓國人主流的輸入法也無大礙。

兩區式佈局<small>(圖源:<a href="https://www.apple.com/hk/shop/product/MK2A3KX/A/magic-keyboard-korean">蘋果</a>)</small>
於是,我開始在網路上搜尋關於韓語羅馬字輸入法的相關資訊,最終找到了Nalgaeset諺文輸入法(Nalgaeset Hangul Input System, 날개셋 한글 입력기/날개셋 韓㐎 入力機)。這個輸入法非常好用,可以使用羅馬字輸入韓文。其所使用的羅馬字方案大致上與韓國文化觀光部2000年式(국어의 로마자 표기법/國語의 로마字 表記法)相同,當然收音的輸入方式是按照其書寫的諺文輸入而非按照實際讀音輸入。其中與文觀部羅馬字不同的是,文觀部羅馬字為ui但此輸入法為eui,即eu(ㅡ)i(ㅣ)之合;還有的文觀部羅馬字是oe,取自老派漢城音,但此輸入法則為oi,即o(ㅗ)i(ㅣ)之合。羅馬字輸入法有一個難以規避的弊端就是容易出現重碼混淆,例如經常出現一個諺文字母既可以作為前一個音節的終聲,也可以作為後一個音節的初聲。而Nalgaeset輸入法對此的處理是:當有需要強行區分時,則以大寫字母為初聲。例如singil默認輸出了신길,想要輸出싱일,則打singIl

而在客製化上,它的鍵位也是可以自由設定的。如此好用的輸入法,為何我最後沒有使用呢而是改用小狼毫(中州韻輸入法引擎/鼠鬚管/Rime)去費心費力開發呢?有三個原因,第一是因為雖然理論上這個輸入法的鍵位有極高的自由度,但是我不懂具體如何去設定,相對來說我對小狼毫的正規表示式比較熟悉一點,設定起來相對比較得心應手。第二個原因就是我目前使用的小狼毫輸入法0.14.3版本可以在VRChat中正常輸入,而Nalgaeset輸入法無法在VRChat中使用。第三個原因是Windows上的語言還是越少越好,太多了切換起來不方便,如果把韓語輸入法併合到小狼毫輸入法裡面,那就免去了添加朝鮮語語言這一操作。其實我還打算把日語輸入法也整合進去的,但是日語輸入法的輸入邏輯與小狼毫等主流簡體中文輸入法的輸入邏輯有天壤之別,更重要的是日語的詞庫太大導致我無法部署成功,直接程式未響應卡死,故不得不放棄。而韓語輸入法的輸入邏輯雖然跟中文輸入法不同,但是並非水火不容,採用中文輸入法的輸入邏輯去輸入韓語雖有點奇怪,但總體上是可行的。

羅馬字

如果有現成的輸入方案來用是最好的,所以我在awesome-rime這個倉庫上查找,發現韓語輸入法不止一個。逐一觀察試用之後,我選擇了LiGhauNgyan/rime-korean,因為此方案詞庫中的羅馬字方案甚合我意。關於詞庫所使用的羅馬字方案,對我來說是非常重要的。對於懂得使用程式的人來說,完全可以利用萬國碼中諺文音節按固定順序排列的規律來自動生成想要的羅馬字方案對應表,但是我並不懂這些,所以在前期選擇一個合適的羅馬字方案顯得尤為重要。非常幸運的是這個輸入方案所用的羅馬字方案簡直是為我量身定製的。首先它與Nalgaeset所用的方案高度相似,所以我無需更改之前的使用習慣。其次它的使用了z而非如今世界上更常用的j,而我當初學習使用的教材是北京大學出版社的《標準韓國語》,裡面對於此諺文的國際音標標記為[ts]而不是[t͡ɕ],所以我更偏向於使用z而不是j。還有就是在初聲以r輸入,在終聲以l輸入,如此設計既符合我的習慣,又可以一定程度避免先前提到的重碼。還有諸如oe輸入的設定也可以減少重碼。這樣的處理方式讓我最滿意的一個點就是:它與萬國碼對於諺文音節的命名幾乎是一致的,除了萬國碼中命名為yi而不同之外。

碼表的羅馬字方案非常完美,更完美的是它還附帶了漢字的碼表。而方案本身則做了很多輸入碼的派生與顯示的修改,這絕大部分是我不需要的,所以通通刪除。我只用下面這幾個派生。

algebra:
- derive/wo/weo/ #워依其發音及書寫派生為weo
- derive/ui/yi/ #으依其萬國碼名稱派生為yi
- derive/c/ch/ #ㅊ依文觀部羅馬字派生為ch

漢字

說到漢字的碼表,它收錄漢字的數量非常多,有25400多字,這麼多字我是用不到的,而且韓語漢字同音字更多,造成的重碼也更多。所以正如我之前對小狼毫注音輸入法刪減生僻字以精簡字庫那般,我要把罕用字刪除,只留下常用字。我一開始想到的字表是《漢文教育用基礎漢字(한문 교육용 기초 한자/漢文 敎育用 基礎 漢字),但只有1800字,感覺有點少。後來又找到了全國漢字能力檢定試驗(전국한자능력검정시험/全國漢字能力檢定試驗)分級配定漢字表。此檢定考試8級最低,特級最高,期間還設有一些半級,稱為「準某級」或「某級Ⅱ」。其中8級到4級是民間資格級數(민간 자격 급수),準3級及以上的是公認資格級數(공인 자격 급수)。具體區別我不清楚,我估計是含金量的區別,或許低級的地位跟日本语能力测试JLPT N5差不多,基本上沒人去考,考了也沒什麼實際作用的地位吧。具體每級累計字數如下:

 8級:  50字
準7級: 100字
 7級: 150字
準6級: 225字
 6級: 300字
準5級: 400字
 5級: 500字
準4級: 750字
 4級:1000字
準3級:1500字
 3級:1817字
 2級:2355字
 1級:3500字
準特級:4650字
 特級:5978字

最初我以為到3級的1817字已經夠用了,這個量基本就是跟漢文教育用基礎漢字是一樣的,而2級漢字裡面確實很多我不認識的罕用字,這個數量的漢字對於中文來說遠遠不夠,但對於韓語來說或許已經足夠了。但是我仔細一看,馬上就發現了一個問題,2級漢字裡面雖然很多都是罕用字,但是也有不少常用字。例如作為地名的「邱、釜」,作為姓名的「姜、槿、劉、碩、錫、宋、允」等,都在2級漢字裡面。這就是如我之前對於《通用漢字規範表》的評價一般,把一些現實中少用,但是電腦裡常用的字,如「亍、彳、氕、仝、吒、吖、闫、冏」等列為三級字表。而韓國漢字的使用中,最常用的場景應該是輸入漢字姓名。所以這些2級漢字在韓語或者漢文中或許罕用,但是實際應用上並非如此。

所以我就想那要麼就把2級字也加進去吧,轉眼又看了一下1級字,發現裡面也是有一些比較常用的字的。不過由於我對韓語不了解,所以我說的常用主要是在漢文中比較常用,如「嘉、艱、匣」等,不過至少紙匣(지갑)這個詞很常用。所以我又簡單挑選了一些1級字添加了進去。然後我打算根據級數的不同給這些字分配不同的字頻。不過這一系列操作其實在最後都是徒勞,因為我後面導入了一個較大的漢字詞詞庫,而詞庫的詞挑能生效的前提是字庫裡面包含這些漢字,所以後面經過我的操作之後,我發現原來的選字缺了非常多的字,全部添加進去之後發現多達5000多字。但據我觀察準特級與特級漢字中有很多是異體字和略字,或許有一些可能還是簡體字。如果是罕用字我還可以理解,但是出現了那麼多的異體字和略字確實就不太好全部加進去了。所以我一開始選的字表其實就是方向錯了。

直到這時,我才想起了GB2312之於《通用漢字規範表》,我現在需要的就是一個類似於GB2312的東西,也就是平時主流韓語輸入法能夠輸出的那些漢字。而它正是KS X 1001,貌似也可以稱呼為EUC-KR。這個字符集裡面包含了4888個漢字,選字也比較合理,不過裡面有一些因為多音字而產生的中日韓相容表意文字區的漢字,後續需要轉正或剔除,可以用Sublime Text的UnicodeNormalizer插件的NFC功能進行正常化。

詞庫與詞頻

如此字庫的精簡便已經大功告成,接下來要做的事情就是詞庫。因為之前說過,羅馬字輸入法有一個明顯的弊端,就是容易造成音節的分割錯誤,所以如果有一份足夠完善的詞庫,便可以避免這個弊端。當然剛剛的漢字字庫也有一件事情要補做,就是給漢字加上字頻,優先輸出常用字。同理,萬國碼裡面的諺文音節是通過窮舉排列組合得到的,裡面有一些乃至很多在韓語中根本不存在,所以給諺文加上字頻也有很大的用處。總結一下,就是我們要解決字頻與詞彙詞庫的問題。而接下來我們的語料是從不同的地方獲取的,不同地方的字頻的計算基準不一樣,所以其數字不能直接進行比較,要進行加權。這裡我先介紹一下在哪裡可以找到這一系列的語料資源。

首先是諺文詞庫,可以在國立國語院找到《現代國語使用頻率調查結果檔案 文本檔案(현대 국어 사용 빈도 조사 결과 파일 텍스트 파일/現代 國語 使用 頻度 調査 結果 파일 텍스트 파일)。此檔案或許由於年代過於久遠,是2003年的,所以其中的檔案字元編碼使用的是韓國當地的EUC-KR編碼,所以解壓壓縮包以及用Sublime Text打開時會亂碼。這也是我一直批評Sublime Text的一個點,作為一個如此出名如此成熟的編輯器,至今已到第4版,然而在字元編碼的基礎上卻非常弱。對於東亞編碼根本不支援,雖說到了第4版已經可以支援中國大陸的GBK編碼,但是港台的大五碼、韓國的EUC-KR以及日本的JIS依然無法支援。所幸已有熱心中國程式員開發了一個外掛程式ConvertToUTF8,可以支援東亞那些舊時代的字元編碼,實乃勞苦功高。檔案的內文節選如下,為tsv格式:

차례	항목	풀이	품사	빈도	개수	교재	교과	교양	문학	신문	잡지	대본	구어	기타
70 먹다02 밥을 ~ 동 1,874 138 177 127 348 353 96 338 137 55 243
71 오다01 보 1,854 145 58 90 469 340 533 268 15 20 61
72 자신01 自身 명 1,799 125 37 119 603 412 234 314 11 22 47
73 문화01 文化 명 1,790 93 43 163 1,238 25 108 90 0 120 3
74 원01 화폐 단위 의 1,776 100 98 92 78 100 904 397 7 32 68
75 생각01 명 1,750 138 141 85 372 450 123 255 61 144 119
76 어떻다 형 1,748 159 182 313 318 344 136 152 74 137 92
77 명03 名. 한 ~ 의 1,743 131 42 42 125 161 937 306 14 68 48
78 통하다 通- 동 1,674 136 37 104 774 132 416 186 2 6 17
79 그러다 동 1,662 134 128 51 191 536 64 153 109 269 161
80 소리01 명 1,660 127 87 68 175 815 58 181 125 33 118
81 다시01 부 1,659 160 62 85 360 521 216 229 78 19 89
82 다른 관 1,653 162 86 158 487 290 233 217 38 68 76
83 이런01 관 1,653 142 91 33 401 232 332 217 28 125 194
84 여자02 女子 명 1,645 108 110 52 611 427 71 152 78 91 53
85 개10 個 의 1,622 140 36 78 328 128 692 282 11 27 40
86 정도11 程度 명 1,619 147 38 121 397 206 305 402 13 67 70
87 뒤01 명 1,608 153 43 125 200 415 370 319 44 13 79
88 듣다01 소리를 ~ 동 1,593 146 142 128 185 450 86 199 66 180 157
89 다03 부 1,564 137 166 33 207 378 53 144 162 235 186
90 좀02 부 1,555 135 282 40 167 283 50 95 178 390 70

有詞彙,有詞源,有詞性,有詞頻,還有後面一堆各領域的細分詞頻。詞彙有不少是同型異義詞,用後接數字01、02、03等區分,處理數據的時候要刪除。詞源部分則有不少漢字詞,可以拿來當漢字詞詞庫,不過也應該對裡面一些不符合格式的,有省略符號的數據作處理。

除了這個語料庫之外,我還想找一些其他的語料庫來給詞庫作補充。我從GitHub上找到這麼兩個倉庫,其一是acidsound/korean_wordlist,似乎是從國立國語院的詞典抓取的,其二是libhangul,雖名為諺文資料庫,但是我在裡面似乎找不到諺文詞彙表,反而是找到了漢字字頻表與漢字語詞庫。最後就是我想找諺文音節的頻率表,因為我不懂韓語,所以難以找到純粹的頻率表,只能找到一些研究論文,而這些論文也是分析了諺文字母頻率而非音節頻率。後來我在Discord中一個名為Let’s Learn Korean的韓語學習伺服器中提問,得熱心韓國網友KS指路,找到了한국어 음절의 빈도와 분포(韓國語 音節의 頻度化 分布)

以上便是我用到的所有資料。期間對於數據的格式化過程繁瑣,這裡就略去不表。主要說一下前文提到的頻率加權。首先對於詞庫文件,這裡我分為4個,分別是:

  • romaza.dict.yaml 母表,內含諺文音節及其頻率
  • romaza.phrase.dict.yaml 諺文詞彙表
  • romaza.hanja.dict.yaml 漢字表及其頻率
  • romaza.hanjaphrase.dict.yaml 漢字詞彙表

對於權重的高低排序為:諺文音節>諺文詞彙>漢字單字>漢字詞彙,具體的操作方法就是在最高為補數字,例如諺文音節原的字頻為756831,則改為9756831;諺文詞彙原하다的詞頻為22064,則改為8022064。依此類推。

此外,我還給輸入法增加了一些額外功能,例如偶爾要輸入諺文相容字母,如ㅋㅅㅇ等,我便設計為以j鍵調出。然後偶爾要輸入古諺文,即萬國碼中的諺文字母,我便定義大寫UIO三鍵分別為初聲中聲終聲。

以上便是我開發小狼毫韓語羅馬字輸入法的大致過程,其中一些較為繁瑣的細節我便沒有提及。或許有打算將其放在GitHub公開,但是我又懶得寫文檔,特別是英文文檔,再加上這個輸入法有着我濃厚的個人操作習慣,或許不太具備通用性,所以我也在猶豫把它放到GitHub上是否合適。此外如果要較真的話,還有一些版權問題需要處理,因為裡面用到了韓國政府以及網上別人的一些版權歸屬不明的檔案。這裡需要表揚韓國政府自己居然參考創用CC編纂了一套自己的文檔開放協議공공누리(公共누리, Korea Open Government License, KOGL),難能可貴,值得大家學習。鑑於此等情況,將此輸入法原始碼公開的計劃便擱置了。


Comments