ページ

2014/02/19

MeCabを使って棒読みちゃんを物知りにさせる

メモ書き。

今回は、はてなキーワードとニコニコ大百科を利用して、
棒読みちゃんの読み上げ可能な単語を増やす。

MeCabや棒読みちゃんについては、ここ→棒読みちゃんかしこさup計画




まず、MeCabとRubyをインストールしておく。
コマンドプロンプトで「ruby -v」と打ってバージョン情報が表示されればOK。
(私の環境では「ruby 1.9.3p429 (2013-05-15) [i386-mingw32]」と出た。)

次に、はてなキーワード一覧ファイルをダウンロードしておく。
上記リンク先にある、keywordlist_furigana.csvを保存しておく。
改行コードをCR/LFに変換し、文字コードもShift-JISに変換して保存する。(重要)

さらに、ニコニコ大百科IME辞書もダウンロードしておく。
ここからnicoime.zipをダウンロードし、解凍しておく。
解凍したnicoime_msime.txtを開き、冒頭の!で始まっている行を削除する。
次に「(タブ記号)固有名詞」を全て削除する。
「(単語の読み)(タブ記号)(単語)」の行だけが存在するようになる。
このファイルを、Shift-JISで保存する。(重要)


はてなキーワード一覧ファイルからMeCabの辞書を作成する場合、
記事冒頭のリンク先の記事内のRubyスクリプトのままだとRubyのバージョンによっては
エラーが発生する。
以下のように改変した。

#! ruby -E shift_jis:shift_jis
# -*- coding: shift_jis -*-
#require "jcode" # String クラスの tr メソッドで日本語を使用可能にする。
#$KCODE="s" ###csvファイルの文字コードがShift-JISなので"s"に

def translator(from, to)
    lambda {|str| str.tr(from, to) }
end

upto = translator("a-z", "A-Z")
downto = translator("A-Z", "a-z")
hira2kata = translator("ぁ-ん", "ァ-ン")
kata2hira = translator("ァ-ン", "ぁ-ん")

open($*[0]).each do |line|
title_list = line.split("\t")
next if title_list.length < 2
title = title_list[1]
title.strip!
  furigana = title_list[0]
furigana.strip!
  katakana = hira2kata.call(furigana)
  ###ふりがなのない単語を新規登録すると
  ###その単語を棒読みちゃんに読ませた時にエラーが出る
  next if furigana.length == 0

# 登録したくないものをスキップ
next if title =~ /[\+\-\.\$\(\)\?\*!"'_,]+/
next if title =~ /^[0-9\-]+$/
next if title =~ /^h?ttp/
  next if title =~ /[0-9]{4}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/
  next if title =~ /[0-9]{4}年/
  next if title =~ /[0-9]{1,2}月[0-9]{1,2}日/

  # 制御文字、HTML特殊文字が入ったものは外す
  next if title =~ /[[:cntrl:]]/
  next if title =~ /\&\#/

# タイトルの長さ
len = title.length ###辞書ファイルがShift-JISなので(略
# スコアのロジックはネットで見つけたものそのまま使用
#score = [-36000.0 ,-400 *(len**1.5)].max.to_i
  score = [-32768.0, (6000 - 200 *(len**1.3))].max.to_i
# 3文字より大きい場合だけ
if len > 3
print "#{title},0,0,#{score},名詞,固有名詞,*,*,*,*,#{title},#{katakana},#{furigana},はてなキーワード,\n"
end
end

以上のスクリプトを、Shift-JISで保存する。
最後の方の「はてなキーワード」は適宜「ニコニコ大百科」に書き換える。
スコアのロジックは、
はてなキーワードを使ってigo-ruby(MeCab)用の辞書をナウい感じにする を参考にした。

最後に、上記のRubyのスクリプトを実行する前に、
コマンドプロンプトで「set LANG=ja_JP.SJIS」と入力しておく。

あとは、

  1. ruby makedic-hatena.rb nicoime_msime.txt > nico.csv
  2. ruby makedic-hatena.rb keywordlist_furigana.csv > hatena.csv
  3. "c:\Program Files (x86)\MeCab\bin\mecab-dict-index.exe" -f SHIFT-JIS -t SHIFT-JIS -d "c:\Program Files (x86)\MeCab\dic\ipadic" -u hatena.dic hatena.csv
  4. "c:\Program Files (x86)\MeCab\bin\mecab-dict-index.exe" -f SHIFT-JIS -t SHIFT-JIS -d "c:\Program Files (x86)\MeCab\dic\ipadic" -u nico.dic nico.csv
と実行すれば無事にMeCabの辞書が作成できる・・はず。

出来上がったnico.dicとhatena.dicを、C:\Program Files (x86)\MeCab\dic\user に放り込む。

C:\Program Files (x86)\MeCab\etc\mecabrcをテキストエディタで開き、
userdic = "C:\Program Files (x86)\MeCab\dic\user\hatena.dic","C:\Program Files (x86)\MeCab\dic\user\nico.dic"
を追加しておく。
このページによると、ユーザ辞書はカンマ区切りで複数追加が可能ということだった。)


あとは、棒読みちゃんの設定画面で、
システム→「漢字→かな変換」と進み、漢字→かな変換モードを「MeCab」に設定し、
棒読みちゃんを再起動させる。

以下のように単語が分解されなくなれば成功。

(「不正は無かった」はニコニコ大百科のみに登録された単語、
「エリス・クリスティ」ははてなキーワードのみに登録された単語。)

0 件のコメント:

コメントを投稿