読者です 読者をやめる 読者になる 読者になる

Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

mecabにWikipediaのタイトル一覧とはてなキーワード一覧をユーザ辞書として追加し、PHPとRubyで使ってみる

こんばんは。最近mecabをいじっています。
今回はmecabWikipediaのタイトルとはてなキーワード一覧をユーザ辞書として追加してみたいと思います。そしてプログラム上で使ってみます。
といっても、結構他の人がやっていてやり方を分かりやすくまとめてくださっているので改めて書く必要はそんなにないんですが自分のメモとして残しておきます。

なお、私の場合はmecabをHomebrewでインストールしており、システム辞書にはnaist-jdicを用いていますのでそれに合わせます。

各ファイルのダウンロード

まずは最新版のWikipediaのタイトル一覧とはてなキーワード一覧を取得します。

$ curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0

$ curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | iconv -f euc-jp -t utf-8 > keywordlist_furigana.csv

CSVファイルの作成

mecabにユーザ辞書として追加する場合、指定のフォーマットのCSVファイルを作成する必要があります。
これはこちらの記事スクリプト(make_dict.rb)を使わせてもらいました。rubyで書かれているのでrubyが実行出来る環境が必要です。
ただし、こちらのスクリプトでは3文字以下のものは省くようにしているのですが(27行目)、自分は1文字以下のものを省くように変更しました。
一応若干改変したものを下記に示します。簡単ですが説明も加えました。

gista52a31be8604d7ba7725

このスクリプトを実行すればCSVファイルが作成されます!

$ ruby make_dict.rb

なお、コード内でスコア計算していますが、スコアについてはmecab公式ページケーススタディのところや、こちらの記事が参考になります。
用はこのスコアで長い単語を優先するようにしています。

辞書の作成(コンパイル

さて、CSVを作り終えたらいよいよ辞書の作成です。
辞書は以下のコマンドで作成出来ます。

$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/naist-jdic/ -u wiki_hatena.dic -f utf-8 -t utf-8 wiki_hatena.csv 

オプションが表すのはそれぞれ以下の通りです。

これを実行すると、wiki_hatena.dic が作成されます。これが辞書ファイルとなります。

作成したユーザ辞書の使い方

早速作成した辞書を試してみましょう。
mecabでは -u オプションで辞書を指定することでその辞書を使えるようになります。

$ mecab
クラウド
クラ  名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ,,
ウド  名詞,一般,*,*,*,*,ウド,ウド,ウド,,
EOS

$ mecab -u wiki_hatena.dic
クラウド
クラウド    名詞,一般,*,*,*,*,クラウド,*,*,wikipedia
EOS

上記はシステム辞書を使った場合と作成した辞書を使った場合の比較です。
これで使えるようになりました!
ただ、いちいちユーザ辞書を指定するのが面倒くさい場合は、設定ファイルにユーザ辞書を読み込ませることで -u を使わずともユーザ辞書を使うことが出来ます。

$ vim /usr/local/etc/mecabrc

# 以下の行を追加
userdic = /foo/bar/wiki_hatena.dic

なお、システム辞書とユーザ辞書両方に同じ単語があった場合はユーザ辞書が優先されるようです。
なのでユーザ辞書が優先されてほしくない場合は -u オプションを使うのが良さそうです。
また、ユーザ辞書はカンマ区切りで複数登録出来ます。

これでユーザ辞書を使えるように出来ましたね!

プログラム上から実行

最後にプログラム上からユーザ辞書を使ってみたいと思います。
mecabrcにユーザ辞書の設定を記述している場合は、普通に Mecab_Tagger を new すれば使えます。
しかし、ユーザ辞書を優先させないで個別に使いたい場合はプログラム上で指定する必要があります。
rubyの場合は以下のようにやると良いみたいです。

userdic_path = "/foo/bar/user.dic"
q = MeCab::Tagger.new("-u #{userdic_path}")
print q.parse("テスト用文字列")

PHPの場合は、php.iniの mecab.default_userdic で設定する必要があるみたいです(こちら参照)。
よって php.ini を直接編集するか、ini_set を使って以下のようにします。

<?php
ini_set('mecab.default_userdic', 'foo/bar/user.dic');
$this->mecab = new MeCab_Tagger();
$nodes = $mecab->parseToNode("テスト用文字列");
?>

以上で終わりです。
今回はほとんど参考記事の通りやれば出来たので簡単でした。先人の方達に感謝です。
それでは。

参考にさせていただいたサイト

mecabにwikipediaとhatenaキーワードのユーザ辞書を適用する(ついでに、辞書にない場合はそれもわかるようにするオプション付き) - すがブロ
MeCab の辞書構造と汎用テキスト変換ツールとしての利用
MeCabの辞書にはてなキーワードを追加しよう - 不可視点
MeCab: 単語の追加方法
mecab - 形態素解析のために Wikipedia とはてなキーワードからユーザー辞書を生成し利用する - Qiita
【なぜ!】php_mecabでユーザー辞書って有効にならない? - For Want Of A Better Word