mecabにwikipediaのタイトルリストを追加する

mecabの辞書にwikipediaのタイトルリストを追加したときの備忘録

ずっと前にmecabを使ってみる。でmecabを動かしてみたんだけど、それから結構放置してしまっていたのでもう一度弄ってみる。
とりあえず、今入れている辞書の語集を増やすために、wikipediaの情報も追加してみた。

1. wikipediaのタイトルリストをダウンロードして解凍

最新のタイトルリストがここから取得できる

$ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
$ gunzip jawiki-latest-all-titles-in-ns0.gz

2. wikipediaのタイトルリストをCSVに変換

ダウンロードした辞書を、mecabに取り組む前にCSV形式に変換。ここはググると色々なやり方を調べる事ができる。
今回はPHPで作ってみた。

<?php
class Csv {

    /**
     * Target Csv file name
     *
     * @var string
     */
    public $fileName = null;



    /**
     * Set csv file name.
     *
     * @access public
     * @param  string $fileName Csv file name
     */
    public function __construct($fileName) {
        $this->fileName = $fileName;
    }

    /**
     * Make Csv file.
     *
     * @access public
     */
    public function make($wikipediaFile) {
        $fp = fopen($wikipediaFile, "r");
        while (!feof($fp)) {
            $title = fgets($fp);
            $title = trim($title);
            $title = mb_convert_encoding($title, 'utf-8');

            if (preg_match('/^\./',$title)) {
                continue;
            }
            elseif (preg_match('/^[0-9]{1,100}$/',$title)) {
                continue;
            }
            elseif (preg_match('/[0-9]{4}./',$title)) {
                continue;
            }
            if (strlen($title) > 3) {
                $line   = array();
                $line[] = $title;
                $line[] = 0;
                $line[] = 0;
                $line[] = $this->__cost(-36000,-400 * (strlen($title)^1.5));
                $line[] = '名詞' ;
                $line[] = '固有名詞';
                $line[] = '*';
                $line[] = '*';
                $line[] = '*';
                $line[] = '*';
                $line[] = $title;
                $line[] = '*';
                $line[] = '*';
                $line[] = 'wikipedia_word';
                file_put_contents($this->fileName,$this->__makeCsvString($line) . "\n",FILE_APPEND);
            }
        }
        fclose($fp);
    }

    private function __cost($comp, $val) {
        $max  = $comp;
        if ( $comp <= $val ) {
            $max = $val;
        }
        return (int)$max;
    }

    private function __makeCsvString($data) {
        foreach ($data as $k => $v) {
            if (preg_match("/[\",\n]/", $v)) {
                $data[$k] = '"' . str_replace('"', '""', $v) . '"';
            }
        }
        $line = implode(',', $data);
        return $line;
    }
}
$csv = new Csv('/*csvファイル名*/');
$csv->make('jawiki-latest-all-titles-in-ns0');

※コストを決める__cost()の部分は、http://mecab.googlecode.com/svn/trunk/mecab/doc/dic-detail.htmlのケーススタディの部分を参考にしました。
元ファイル自体が結構なサイズなので、CSVファイルを生成するまでにそこそこ時間がかかる。。

3. 作成したCSVファイルを、辞書ファイルに変換

作成したCSVファイルが設置されているフォルダまで移動し、以下のコマンドを実行

/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic/ -u '辞書ファイル.dic' . ' -f utf8 -t utf8 ' . 'CSVファイル.csv'

成功すれば指定した場所に’辞書ファイル.dic’が作成される。

4. 作成した辞書ファイルを、ユーザー辞書の部分に設定

/usr/local/etc/mecabrcを開いて、作成した辞書のパスを登録

userdic = /path/to/辞書ファイル.dic

複数の辞書を登録する場合は、間をカンマ「,」で区切る。

userdic = /path/to/辞書ファイル1.dic,/path/to/辞書ファイル2.dic,/path/to/辞書ファイル3.dic

これで辞書の設定は完了。

5. 使ってみる

「Androidアプリケーション開発」とかで解析をかけてみる

$ echo Androidアプリケーション開発 | mecab
Android 名詞,固有名詞,*,*,*,*,Android,*,*,wikipedia_word
アプリケーション        名詞,一般,*,*,*,*,アプリケーション,アプリケーション,アプリケーション
開発    名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
EOS

「Android」の部分が今回追加した辞書から持ってきていることがわかった。

上記の作り方とは違うけど、ここまでの流れで元データの取得から辞書ファイルの作成までをある程度汎用的に作ってみた。
php.mod-mecab-dic – github
次回は、別のキーワードっぽいデータを、これを使って取込んでみる。