このブログを検索

2016年9月21日水曜日

ハングル用の辞書を作る

最近、妻と一緒に韓国ドラマを毎日のように見ている。

以前、韓国語の勉強をした事があって 語学の勉強の積りで付き合って見るか、という態度だったけど、韓国と日本の文化の違いや同じ点を発見したり 言葉だけでなく、色々と興味が湧く。

確かに、取り箸を使わずに銘々が自分の箸を鍋に突っ込んだり、女性が立て膝だったりして あれっと思う事もあるが、家の中でも靴を脱がないような欧米のドラマとは違って、殆どの場面で文化面でも心情面でも日本人には全く違和感なく受け入れられる。単に喋っている言葉が異なるだけである。

それで、また韓国語の勉強をやってみたくなった。字幕に頼らずに聞いて分かる部分がちょっとでも増えれば楽しいから。

ハングル入力

私は地道に単語を覚えたりする事は苦手だが、色々と仕掛けを考えるのは大好きだ。韓国語を勉強するとなると、ハングルをパソコンで書けるようにして置きたい、と思って色々と調べた。

日本語の入力には日本語入力メソッドがあるように、韓国語の入力には韓国語入力メソッドがある。これには Windows に元々備わっているものも使えるし、Google Korean Input というものもあるらしい。

しかし、韓国語では もはや漢字は殆ど用いられないから、事実上 ハングルさえ入力出来れば良い。日本語入力のままでハングルが入力出来れば 日本語との混在も楽なのだ。そうすると、日本語の辞書にハングルとその読みを追加する、という方法がある。

読みは最初の文字が半角アルファベットの大文字、残りが半角アルファベットの小文字、という形をとり、アルファベットとハングルの対応は「文化観光部2000年式」に基づく。

「文化観光部2000年式」は、ハングルの読みをアルファベットで表す韓国政府の公式の方法で、韓国中の案内板に書かれているので 覚えておいて損は無い。但し、これは読みを表す方法なので、入力に使うとなると全く同じには出来ない。

それは、ハングルには母音の後にパッチムと呼ばれる子音が付随する場合があるが、そのパッチムの読みには「異なる子音の字母でも同じ読み」となる場合があるからだ。そこで、パッチムの入力コードも母音の前の子音と同じ入力コードを使うように変更する。

ハングルには、最初の子音が18種類、母音が21種類、パッチムが27種類存在する。そして、その組み合わせでハングルの文字の形が定まるので、理屈では(子音とパッチムは無しの場合も含め)全部で (18+1)*21*(27+1)=11,172種類 のハングル文字が存在する事になる。その中で実際には使われていない文字もあるけど、ユニコードではその全てが定義されている。

実は、11,172文字揃った Google日本語入力の辞書用のハングル入力辞書データがネット上に存在していて、有難くダウンロードさせて貰った。しかし、これには著作権は存在しないので、私が自由に改変して公表することも出来る。

辞書を改変する

まず、ᄎ という子音のコード ch について、c も使えるようにデータを追加する。この ᄎ 以外に c は使われていないから h を入力するのは余計な事だとの判断である。今使っているGoogle日本語入力のローマ字変換でも c が ch と同様に使えるようにしているのと合わせたいという気もある。

この改変で 検索と置換 機能で ch を c に変えるだけなら簡単だが、そうすると ch は使えなくなるのでちょっと困る。だから、c 又は C を含んだ行を抜き出してコピーした上でコピーした行の ch を c に、Ch を C に置換しなければならない。

ダウンロードした辞書はGoogleスプレッドシートに入力して加工。コードの先頭にある Ch はソーティングで集まるからコピーは簡単に出来るが、パッチムの ch はコードの先頭には無いから検索で見つけ、その行をコピーし、コピーした行の ch を c に置換する、という作業は手作業になる。それで、幾つかやってみて これでは駄目だと悟った。

それで、簡単に出来るように考えた。要は、c と C を含む行に何か印を付けてそれでソーティングすれば全部が集まるから、コピーして置換するのは一回の操作で済む。

それで、列を一つ増やして、=regexmatch(A1,"[cC]") という関数を一行目に書いた。これを列の最後までコピーすれば、2行目は =regexmatch(A2,"[cC]") というように自動的に数字が置き換えられている。

これで、A列にあるハングル文字コードに c 又は C が含まれている場合は TRUE、含まれてなければ FALSE、という値となり、これでソーティングして、行をコピーし、966行が増えた。因みに、ch を c にしたのが399箇所、Ch を C にしたのが588箇所になる。作業後に関数の列は削除した。

字母も追加

ハングル文字だけならこれでOKだけど、その子音だけ、母音だけ、パッチムだけ、の文字ユニコードで定義されていて、これも欲しい。さっき書いた ᄎ も子音だけの文字なのである。ハングル文字だと 츠 のように必ず母音を含むから、説明上都合の悪い事もあるのだ。

それで、子音、母音、パッチム の字母用のデータを作った。

Gᄀ独立語1100
Kkᄁ独立語1101
Nᄂ独立語1102
Dᄃ独立語1103
Ttᄄ独立語1104
Rᄅ独立語1105
Mᄆ独立語1106
Bᄇ独立語1107
Ppᄈ独立語1108
Sᄉ独立語1109
Ssᄊ独立語110A
Xᄋ独立語110B
Jᄌ独立語110C
Jjᄍ独立語110D
Ch | Cᄎ独立語110E
Kᄏ独立語110F
Tᄐ独立語1110
Pᄑ独立語1111
Hᄒ独立語1112

Xaᅡ独立語1161
Xaeᅢ独立語1162
Xyaᅣ独立語1163
Xyaeᅤ独立語1164
Xeoᅥ独立語1165
Xeᅦ独立語1166
Xyeoᅧ独立語1167
Xyeᅨ独立語1168
Xoᅩ独立語1169
Xwaᅪ独立語116A
Xwaeᅫ独立語116B
Xoeᅬ独立語116C
Xyoᅭ独立語116D
Xuᅮ独立語116E
Xwoᅯ独立語116F
Xweᅰ独立語1170
Xwiᅱ独立語1171
Xyuᅲ独立語1172
Xeuᅳ独立語1173
Xuiᅴ独立語1174
Xiᅵ独立語1175

Xgᆨ独立語11A8
Xggᆩ独立語11A9
Xgsᆪ独立語11AA
Xnᆫ独立語11AB
Xnjᆬ独立語11AC
Xnhᆭ独立語11AD
Xdᆮ独立語11AE
Xlᆯ独立語11AF
Xlgᆰ独立語11B0
Xlmᆱ独立語11B1
Xlbᆲ独立語11B2
Xlsᆳ独立語11B3
Xltᆴ独立語11B4
Xlpᆵ独立語11B5
Xlhᆶ独立語11B6
Xmᆷ独立語11B7
Xbᆸ独立語11B8
Xbsᆹ独立語11B9
Xsᆺ独立語11BA
Xssᆻ独立語11BB
Xngᆼ独立語11BC
Xjᆽ独立語11BD
Xch | Xcᆾ独立語11BE
Xkᆿ独立語11BF
Xtᇀ独立語11C0
Xpᇁ独立語11C1
Xhᇂ独立語11C2

表はGoogle日本語入力の辞書に合わせて、一列目は文字コード、二列目は文字、三列目は品詞、四列目はコメント、になっている。品詞は 全部「独立語」とし、コメントには ユニコードの番号を16進数で書いた。

子音のコードはハングル文字のコード(から母音を除いたもの)と同様だが、子音無しを示す ᄋ (「이응」 イウング という名があるけど) をどうするか悩んだ結果、X にした。

母音のコードはハングル文字と同じに出来ない( ᄋ 抜き)ので、頭にXを加えた。

パッチムのコードも子音のコードと区別する必要があり、頭にXを加えた。

これでOKと思いきや、実際にGoogle日本語入力の辞書にインポートしてみると、何故か最後の行が入力されていない。バグなのか仕様なのか不明だが、辞書の最後にダミーの行を追加する事で回避する。因みに、ダミー行として 「こぶり ハングル 辞書」 として置いた。

この改変したGoogle日本語入力用の[ハングル文字辞書ファイル]を公開する。(但し、コメント欄は空白にしてある。)