2016年6月26日日曜日

ニコニコ大百科IME辞書とMeCabと棒読みちゃん

※このエントリに出て来る「IME」は大体MS-IMEを指しています。


「ニコニコ大百科IME辞書」という、ニコニコ大百科に登録されている単語が
IMEで変換できるようになる素晴らしい辞書がある。

一方、棒読みちゃんはIMEを使って漢字→かな変換をしているので
この辞書をIMEに登録すると自然と棒読みちゃんも賢くなる。

ぜひ棒読みちゃんを賢くしたいけど、
IMEにニコニコ大百科の言葉を登録すると変換誤爆が怖いです><;という場合、
棒読みちゃんの漢字→かな変換処理にMecabを使用すると住み分けが出来る。

・Mecabって何さ
日本語の文を以下のような感じで解析するツール。

-------------------------------------------
C: >mecab
私の名前は山田太郎です。
私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
名前    名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
山田    名詞,固有名詞,人名,姓,*,*,山田,ヤマダ,ヤマダ
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
EOS
-------------------------------------------

英語みたいに間にスペースが入っている訳ではないから、
コンピュータにとって日本語は単語ごとに分割するのが難しい言語。
Mecabはそれをいい感じに分割してくれるスゴいヤツ。Twitterのbotにもよく使われている。

Mecabが持っている辞書にニコニコ大百科の単語を登録すれば
棒読みちゃんはその通りに読み上げてくれるはず。
という訳でニコニコ大百科IME辞書の内容をMeCabの辞書に変換してみる。

1. MeCabのインストール

以下のページからMeCabをDLしてインストールする。
http://taku910.github.io/mecab/
※「Binary package for MS-Windows」と書かれているところ。
  棒読みちゃん側で動作確認しているのは0.98だけどそれ以降のverでも動くっぽい

インストール中に辞書の文字コードを聞かれるので、Shift-JISを指定する。
それ以外の文字コードにすると棒読みちゃん側で文字化けしてしまう。


このことからも分かる通り、ユニコード特殊文字バリバリな単語は
残念ながら今回棒読みちゃんに読ませることはできない。

インストールが終わったらMeCabのbinフォルダにパスを通す。
マイ コンピュータのプロパティ→システムの詳細設定→環境変数→ユーザー環境変数のpathの
先頭に以下の文字列を追加。
「<MeCabインストールフォルダ>\bin;」

こんな感じ



2. ActivePerlのインストール

Perlスクリプトでニコニコ大百科IME辞書→MeCab辞書用CSVファイルの変換を行うため、
以下からActivePerlをDLしてインストールする。
http://www.activestate.com/activeperl/downloads
※「DOWNLOAD PERL: OTHER PLATFORMS AND VERSIONS」と書かれているところ

自分の環境はActivePerl v5.16.3だから古いけど
多分最新版のActivePerlでもスクリプトは動く…はず…

3. スクリプトの準備

以下のスクリプトを「make_dic_csv.pl」として保存する。
文字コードはUTF-8。

スクリプト(要ActivePerl) -

色々凝っていたら長くなった…。


4. ニコニコ大百科IME辞書のDL

以下のページからニコニコ大百科IME辞書をDLする。
http://tkido.com/blog/1019.html

nicoime.zip を展開すると「nicoime_msime.txt」が出て来るので、
nicoime_msime.txtを3.で準備したmake_dic_csv.plと同じ階層に配置する。


5. スクリプトの実行

エクスプローラをひらき、make_dic_csv.plとnicoime_msime.txtがある階層で
Shiftキーを押しながら右クリック→「コマンドウィンドウをここで開く」を選択する。

Shiftキーを押しながらじゃないと表示されない

コマンドプロンプトの画面が表示されるので、以下を入力してEnterキーを押す。

-------------------------------------------
perl make_dic_csv.pl
-------------------------------------------

こんな感じになる

この時点で、make_dic_csv.plとnicoime_msime.txtがある階層に
「nico_dic.csv」が出来ている。


6. CSVファイルをMeCab辞書に変換

5. のコマンドプロンプトの画面で続けて以下を入力してEnterキーを押す。

------------------------------------------------
mecab-dict-index -f SHIFT-JIS -t SHIFT-JIS -d "C:\Program Files (x86)\MeCab\dic\ipadic" -u nico.dic nico_dic.csv
------------------------------------------------
※C:\Program Files (x86)\MeCab の部分はMeCabのインストールパスに応じて変更する


5.の画像の続き


これでMeCab用の辞書が完成する。

 「nico.dic」がMeCab用辞書


7. MeCabのユーザ辞書に登録する

作成したnico.dicをMeCabのdicフォルダの下に移しておく。
<MeCabインストールフォルダ>\dicの下に適当な名前(userとか)でフォルダを作成して
その中にnico.dicを入れる。(例:C:\Program Files (x86)\MeCab\dic\user\nico.dic)

その後、<MeCabインストールフォルダ>\etc\mecabrcをエディタでひらき、
以下の通りnico.dicのパスを指定して保存する。

--------------------------------------------------------
userdic = "C:\Program Files (x86)\MeCab\dic\user\nico.dic"
--------------------------------------------------------

辞書追加作業はこれでおしまい。


8. 棒読みちゃんのテスト

…の前に、忘れずに以下の設定をしておく。
棒読みちゃん設定画面→[システム]→[漢字→かな変換]→[01)漢字→かな変換モード]の欄で
MeCabを指定し、OKボタンを押す。

これを忘れるとMeCabを使ってくれない


以上で準備OK。
試しに「デカライン高架下でRブラスターエリートにやられた!」と入力してみる。
正しい読み方は「でからいんこうかしたでらぴっどぶらすたーえりーとにやられた!」


辞書追加前



辞書追加後



ちゃんと「でからいんこうかした」「らぴっどぶらすたーえりーと」と発音してくれる。
やったぜ。

しかしここで1つ悲しいお知らせが…。

「じゅうよんしきたけづつじゅう」

どうも数字を含む場合は数字の前後で強制的に分割して読んでしまうらしく、
MeCabの辞書に「14式竹筒銃・乙」を登録していても問答無用で分割されてしまう。
理由は分からない。MeCab側ではちゃんと「14式竹筒銃・乙」を1つの単語として認識している。

MeCab「ワイは分かっとるで」

一応nico_dic.csvから数字を含む単語を抽出してみると、その数9,947個…。
これらは多分、棒読みちゃん側で辞書登録しないと正しく読んでくれない。
無邪気に登録するとまず間違いなく重くなる。お手上げ。

じゃあMeCab用辞書を軽くするために数字を含む単語は除外しよう!
と言いたいところだけど、疲れたのでそれは次回の課題に _(┐「ε:)_


色々試して分かったのが、ニコニコ大百科は登録されているフレーズがやんちゃ過ぎて
真正面からMeCabに登録すると大変なカオスになるということ。

IMEは読み→漢字変換が目的なので問題にならないことが、
MeCabだと漢字→読み変換が目的なので問題になることがある。
例えばこの単語(単語:という 読み:タイヘンモーシャケゴゼマセンデスタトイウ)とか。

IMEの用途だと「という」と打って変換しても読みは関係ないから支障ないけど、
棒読みちゃんの場合は「という」を「タイヘンモーシャケゴゼマセンデスタトイウ」と読んでしまう。
つーか何なのこの読み方、何があったのさ。
※上記の手順でnico.dicを作成した場合はちゃんと「という」を「という」と読みます。

あと、棒読みちゃん側の前処理(MeCab実行前に行う処理)が結構強力で、
大百科通りの表記で辞書登録すると前処理後の字面と食い違ってしまうケースが多かった。
スクリプトの if($for_bouyomi){ ~ } の中の処理はその辺の試行錯誤の結果。


参考URL

ニコニコ大百科IME辞書 - 神は細部に宿り給う
http://tkido.com/blog/1019.html

[mecab] mecab辞書にwikipediaのタイトルリストを追加 [wikipedia][はてなキーワード] - fukushimuのメモ帳
http://fukushimu.blog.shinobi.jp/mecab/-mecab-%20mecab%E8%BE...

perl でSTDOUT への出力を一時的に無効にしたい - うまいぼうぶろぐ
http://hogem.hatenablog.com/entry/20110602/1307029127

Perl用、日本語「全角」→「半角」変換ルーチン - adiary開発日誌
http://adiary.blog.abk.nu/0263

文字コードの指定 - PerlPlus
http://www.perlplus.jp/perl/file/index12.html

手抜き固有表現抽出の試行 - ねがとんのねごと
http://d.hatena.ne.jp/negaton/20090405/1238917910