====== 変換用辞書の構築について ======
ここでは,[[https://porocise.sakura.ne.jp/korean/hira2han/index.html|MeCabによるひらがなのハングル転写]]で構築した変換用辞書を例として,辞書構築のケーススタディを紹介します.
===== はじめに =====
[[https://taku910.github.io/mecab/dic-detail.html|MeCabの辞書構造と汎用テキスト変換ツールとしての利用]]を参考に作成しました.「ケーススタディ」の「ひらがな to カタカナ変換ツール」が近いものですが,ひらがなの1文字をカタカナの1文字に対応させているのに対し,ハングル転写の場合には以下のような点を考慮に入れる必要があります:
* 「きゃっ」が「걋」,「ひょん」が「횬」になるなど,ひらがなの数文字がハングル1文字に該当することがある
* 同じ「か」でも,語頭(文節頭)では「가」,語中(文節中)では「카」と転写される
* ただし「が」など語頭でも語中でも「가」と表記されるものがある
これらの問題を解決するために,以下のような方法でMeCab用の辞書を作成,構築しました.
===== 辞書の準備 =====
変換用の辞書を作成します.ここではエントリを大きく3種類に分けました:
- 語頭・語中で表記が異なるもののうち,語頭の清音:「か」=「가」,「かん」=「간」など
- 語頭・語中で表記が異なるもののうち,語中の清音:「か」=「카」,「かん」=「칸」など
- 語頭・語中の別なく表記が同じもの:「あ」=「아」,「げっ」=「겟」など
以上のカテゴリごとに,それぞれ左文脈IDと右文脈IDを「1」「2」「3」とします.このようにカテゴリを分けて異なる文脈IDを与えることで,入力のどの位置に現われたのか,即ち語頭か語中かを判断することができます.
また,生起コストを全て同じにした場合,「ぎゃん」という入力が与えられると,もっとも短かい「ぎ」だけが変換されてしまいます.そのため,字数の多いエントリの生起コストを低くし,優先的に解析されるようにしました.具体的な例を挙げれば,以下の通りです:
# 語頭の清音(文脈ID:1)
き,1,1,2,기
きゃ,1,1,1,갸
きゃっ,1,1,0,걋
きゃん,1,1,0,갼
# 語中の清音(文脈ID:2)
き,2,2,2,키
きゃ,2,2,1,캬
きゃっ,2,2,0,캿
きゃん,2,2,0,캰
# 語頭・語中で表記が同じもの(文脈ID:3)
ひ,3,3,2,히
ひゃ,3,3,1,햐
ひゃっ,3,3,0,햣
ひゃん,3,3,0,햔
ここでは1文字〜3文字の間で,それぞれ2〜0の生起コストを割り当てました.差がありさえすれば,具体的な数値は大きく問題にならないと思います.これらのエントリを記述したファイルを,UTF-8エンコーディングで保存します.ファイル名は何でもかまいませんが,コンマ区切り(CSV)ファイルとして保存してください.
なお,長音表記の棒引き「ー」についてもエントリを登録しておきます:
ー,3,3,0,*
素性に「''*''」を記述した理由は後述します.
===== 設定ファイルの準備 =====
最低限必要なファイルを準備します.ここで必要なのは''char.def'',''matrix.def'',''dicrc'',''unk.def''です.
==== char.def ====
最低限の設定です.
DEFAULT 1 0 0
SPACE 0 1 0
0x0020 SPACE
==== matrix.def ====
連接の状態がBOSも含めて4通りx4通り=16通りとなります.語頭,語中で差をつけるため,連接コストに差をつけます.ここでは1000の差をつけることにしました.こちらも差がつきさえすれば,具体的な数値は何でもかまいません.
4 4
0 0 0
0 1 -1000
0 2 1000
0 3 0
1 0 0
1 1 1000
1 2 -1000
1 3 0
2 0 0
2 1 1000
2 2 -1000
2 3 0
3 0 0
3 1 1000
3 2 -1000
3 3 0
上のリストの中で,文脈ID「0」はBOS,「1」は語頭の清音,「2」は語中の清音,「3」は語頭・語中で区別のないもの,となっています.例えば,語頭に語中の清音を表す文字が来ては困るため,「0 」(BOS)と「2」の連接を1000としました.また語頭で「1」=「語頭の清音」が優先されるよう,「0 1」の連接コストを-1000としてあります.語中については逆に,「語頭の清音」より「語中の清音」が優先されるように,連接コストを設定しました.
==== dicrc ====
基本的には[[https://taku910.github.io/mecab/dic-detail.html|MeCabの辞書構造と汎用テキスト変換ツールとしての利用]]からの借用ですが,長音表記を考慮してデフォルトの出力形式を''%pS%F-[0]''としてあります:
dictionary-charset = utf8
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=hangul
node-format-hangul = %pS%F-[0]
unk-format-hangul = %M
eos-format-hangul = \n
==== 長音表記の処理について ====
ひらがなのハングル転写について,「외래어표기법」では日本語表記の細則第2項で,「長母音は別に表記しない」としており,「とうきょう」を「도쿄」,「にいがた」を「니가타」とする例を挙げています.この処理を行うには例えば「とう」を「도」と出力し,「にい」を「니」と出力するよう,辞書エントリを作成すればよいのですが,そうすると「ともだちとうたう」「いえにいる」といった「とう」「にい」まで長音の表記と見なされてしまい,望ましい結果を得ることができません.
こうした処理の誤りを回避するため,ユーザーが入力する時点で,長音については「ー」を入力してもらうことにしました.発音通りに入力してもらう,ということです.デフォルトの出力形式を''%pS%F-[0]''としてあり,「ー」のエントリは素性を「''*''」,即ち空要素としてあるため,「ー」が入力されると空文字を出力します.''%FC[N1,N2,N3,...]''は「N1,N2,N3番目の素性を,''C''をデリミタとして表示.ただし,要素が空の場合は以降表示が省略される」([[https://taku910.github.io/mecab/format.html|出力フォーマット]]より引用)ためです.素性はひとつしかないため,その素性が空だとデリミタも出力されません.
==== unk.def ====
未知語処理の設定です.こちらも最低限の設定です:
DEFAULT,0,0,0,*
SPACE,0,0,0,*
===== 辞書の構築 =====
以上のファイルをひとつのディレクトリに入れ,''mecab-dict-index''を用いて,辞書を構築します.出力の文字コードにUTF-8を指定します(''-f''オプション,''-t''オプションについては[[https://taku910.github.io/mecab/index.html#charset|文字コード変更]]を参照).
% /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8
===== 実行 =====
辞書を作成したディレクトリで辞書を指定し,MeCabを実行します.
% mecab -d .
きょうはいいてんきです.
교우하이이텐키데스.
きょーわいーてんきです.
교와이텐키데스.
とうきょう
도우쿄우
とーきょー
도쿄
===== おわりに =====
以上,MeCabを使ってひらがな→ハングル転写を行うための辞書作成について説明してきました.MeCabの辞書を構築する際,参考になれば幸いです.
{{indexmenu_n>201}}