Saturday,September 10
よみがな自動処理()への道()【8】1日()にして成()らず (3 photos)
いくつものヤマを越()え、全()自動()よみがな処理()まであともう少()し。
いよいよ最後()のヤマです。
最後()のヤマ「1日()にして成()らず」
「漢字()によみがなをうつ【後編()】」 でも取()りあげましたが、横書()き特有()の読()み方()をするユニークな文字()列()がいくつかあります。「1日()」=「ついたち」「2日()」=「ふつか」・・・といった日付()の読()み方()は、MeCabの形態素()解析()は対応()していないのです。
デフォルトの状態()でMeCabの辞書()には「1日()」の2文字()で「ついたち」とする読()み方()は登録()されていません。「1日()」を形態素()解析()すると、「1」と「日()」に分詞()を分()けてしまいます。これはプログラム処理()において大変()具合()が悪()いんです。
したがって、MeCabの辞書()に「1日()」といった日付()名詞()を追加()することにします。
Windows7環境()でMeCabの辞書()に単語()登録()をする方法()
Windows7環境()において、MeCabの辞書()はデフォルトインストールでは「C:\Program Files (x86)\MeCab\dic\ipadic」以下()にあるcsvファイル群()が相当()します。
新規()に単語()登録()する場合()は、このディレクトリに適当()に名前()をつけたcsvファイルをつくって、登録()したい単語()を記述()したうえで辞書()のリコンパイルを通()せば単語()登録()できます。
気()をつけておきたいことは、Windows用()のMeCabのcsv辞書()の文字()コードはShift-JISで書()かれていることです。
作成()したcsvファイルを保存()するときは文字()コードShift-JISで保存()することをお忘()れなく。
スタジオムーンリーフでは「MeCab_Dictionary.csv」というファイルを作成()して、そのファイルに以下()のような内容()を記述()しました。
このファイルを文字()コードShift-JISで保存()します。
これで終()わりかと思()いきや、ひとつの罠()が。
MeCabにおいて単語()登録()しただけでは形態素()解析()の結果()に反映()されるとは限()らないのです。
MeCabは単語()の登場()頻度()を数値()化()していて、それを文脈()からスコア化()することで分詞()を判定()していきます。「1日()」といった特殊()な文字()列()の場合()、このままでは「1月()1日()」あるいは「1月()1日()になりました」といった、前後()の分詞()のちがいで判定()結果()が変()わってしまうんです。
判定()結果()が変()わってしまう原因()は、デフォルトで辞書()登録()されている数詞()「1」~「0」の登場()頻度()の数値()の設定()に差()があり、それが解析()結果()に影響()しているためです。
数詞()については、「C:\Program Files (x86)\MeCab\dic\ipadic\Noun.number.csv」に記述()されています。登場()頻度()の数値()設定()は4カラム目()。数値()が低()いほど登場()頻度()が高()く、数値()が高()いほど登場()頻度()が低()いことになります。
数詞()「1」~「0」の登場()頻度()は3000台()~4000台()と千()近()くの差()があり、これがちょうど「1日()」とのボーダー上()にあるようで、解析()結果()にバラつきがでてしまうようです。スタジオムーンリーフでは、手作業()で数詞()「1」~「0」の登場()頻度()を5000台()にまであげました。千()の位()を5にしただけです。
Noun.number.csvの中身()。数詞()「1」~「0」の登場()頻度()を微()調整()しました
Noun.number.csvも文字()コードShift-JISで保存()することをお忘()れなく。
さて。
最後()に辞書()のリコンパイルをしてバイナリ辞書()にまとめあげれば終了()となります。
配布()サイトによるとコマンドによるリコンパイルを通()す方法()もあるようですが、「よみがな自動()処理()への道()【3】Shift-JIS→UTF8へ」で書()いたように、好()きな文字()コードへ辞書()のリコンパイルを通()したほうが楽()でした。
好()きな文字()コードへ辞書()をリコンパイル
コマンドプロンプトで解析()結果()を確認()したいときはShift-JIS。
Perlプログラムで確認()したいときはUTF8で辞書()をリコンパイルします。
以上()で最後()のヤマをのぼりきりました。
これでプログラム処理()を考()えるのが格段()にラクになります。
≫ NEXT_LOG よみがな自動()処理()への道()【最終()回()】まとめ
≪ PREV_LOG よみがな自動()処理()への道()【7】ヤマにも負()ケズ