🖍️

ハングル入力を調査してみた

2022/05/01に公開約2,300字

普段は日本語IMEを自作しているのですが、最近韓国語(朝鮮語)の勉強を始めたので韓国語キーボードのハングル入力を調査しました。

韓国語とハングル

韓国語は基本的にハングル(한글)と呼ばれる表音文字を使って記述します。ハングルの特徴は構成的であることで、子音/p/を表す「ㅍ」に母音/a/を表す「ㅏ」がついて/pa/を表す「파」が生じるようになっています。これらの構成素を字母と呼びます。
この組み合わせは数百にのぼるため、Qwertyのキーボードのように1文字を直接入力する形にするのは現実的ではありません。このため、韓国語のキーボードでは構成素を入力し、自動的に組み合わされる方法が採られています。つまり、「ㅍㅏ」と入力すると勝手に「파」に置き換えられる仕組みです。またパッチム(받침)と呼ばれる子音字母をさらにつなげることもありますが、この場合は「ㅍㅏ」と打った段階で「파」に置き換えられ、さらに「파ㄹ」と打つことで「팔」に結合されます。
ではこの置換は具体的にどのように行われるのか、もう少し詳しくみてみます。

入力の曖昧性

勉強した限り、ハングル1文字の構成は、次のパターンで全てです。ただしCを子音、Vを母音に対応する構成素であると考えます。カッコ内は例です。構成素単独の出現が起こらないことを意識してください。

  • CV (피)
  • CCV (따)
  • CVC (알)
  • CCVC (뽈)
  • CVCC (덞)
  • CCVCC (쪎)
  • CVV (뫄)
  • CVVC (궝)
  • CVVCC (긞)

そこで気になるのが、曖昧性の有無です。構成上、1文字分を完全に入力するという条件があればそのような曖昧性は生じません。しかし文字は次々と入力されます。例えば「CVCCV」のような入力を想定すると、「CVC/CV」か「CV/CCV」かという曖昧性が生じることになりそうです。

このような構成の例として「ㄱㅏㄱㄱㅏ」が挙げられます。「ㄱ」は/k/、「ㅏ」は/a/に対応する構成素で、「각가」または「가까」と解釈できます。これを実際に入力してみると、「CVC/CV」の前者が選択されました。

ナイーブな実装を仮定すれば前者を選ぶ挙動の理由はシンプルに説明できます。つまり、できる限り1文字を長く編集し続け、確定したタイミングで次の文字の入力に移る、という形です。もっとシンプルにいえば「最長一致」ということです。

しかし、このような実装の説明は誤りと言えます。「ㄱㅏㄲㅏ」という入力では、当初「갂」が入力されますが、「ㅏ」を入力すると「갂ㅏ」ではなく「가까」に再解釈されるのです。構成素が単体では文字として使えないという制約から「갂ㅏ」が排除されるためこれは妥当な動作ですが、当初想定した最長一致による変換よりは多少高度なことをしています。

制約解決の賢さ

一般的に考えると、ここでの処理は次のようなものです。

問題となるのは「制約を考慮したランク付け」がどのくらい賢いかです。ランク付けが賢い場合、「CVC/CV解釈を選好する文脈ではCVC/CVで、CV/CCV解釈を選好する文脈ではCV/CCVで解釈する」のような挙動を示す可能性が十分にあります。このような挙動の実装は厄介なので、うっすら実装を視野に入れていた私にとってはちょっとチャレンジングな話になります。賢さは少し落ちますが「CVC/CVの単語が辞書にあればCVC/CVで、CV/CCVの単語が辞書にあればCV/CCVで解釈する」のような可能性もあります。一方非常に単純なシステムであれば「前方から確定させて行って、絶対に許容されない文字列が生じた場合のみ別解釈を試みる」といった説明が可能で、これはずいぶん楽な話になってきます。いずれにしても調査が必要です。

ではどのように挙動を調査すればよいでしょうか。ひとまず「CVC/CVの単語が辞書にあればCVC/CVで、CV/CCVの単語が辞書にあればCV/CCVで解釈する」を検証してみましょう。「CVC/CV」型では単語を成さないが「CV/CCV」型なら単語を成せるような語彙を探します。韓国語初心者には難しいタスクなので、ツールの力を借りました。

https://www.ezglot.com/words-ending-with.php?w=끼&l=kor&l2=&length=&submit=Search

「ㅁㅣㄱㄱㅣ」という文字列が「믹기」と「미끼」の両方に解釈可能で、単語を成すのは後者(CV/CCV)だけであることがわかりました。これはまさに求めていた単語です。

実際に入力してみると「믹기」です。やりました!「CVC/CV」です!制約解決が大して賢くないことが明らかになりましたね。

まとめ

韓国語IMEにおける構成素列の解釈曖昧性と、その制約解決の賢さについて調査しました。「CVCCV」を「CVCC/V」と解釈しないことから最長一致ほど単純ではないことが明らかになりました。ついで語彙的制約により「CV/CCV」が優先されるべき条件でも「CVC/CV」が選択されることがわかりました。「CVCC/V」における母音字母の単独出現のような明らかな制約違反が生じない限りは最長一致による変換が行われるものと推測できます。これならずいぶんシンプルな実装で済みそうです。

Discussion

ログインするとコメントできます