mecabのユーザ辞書でwikipediaとhatenaキーワードを利用する

ちょっと興味があったので、mecabで遊んでみました。
普通にインストールして使ってみるところまでは普通にできたのですが、 ネットのニュース記事などを入力に処理させてみると、 やはり解析できない文字がいっぱいでてきて、あんまり精度がよくない。

(インストールの仕方などはほかの人がいっぱい説明してくれているので割愛)

どうやら標準の辞書だけだと限界があるようので、以下の記事などを参考に
「wikipediaとhatenaキーワードをユーザ辞書として利用する」
ということをやってみました。

http://d.hatena.ne.jp/code46/20090531/p1
http://www.mwsoft.jp/programming/munou/mecab_hatena.html
http://deepneko.dyndns.org/kokotech/2009/06/mecabwikipedia.html

作ったのは以下の2つのスクリプト。
  1. webからデータを取ってきて、csv作成コマンド、辞書作成コマンドを呼び出すshell (convWebWordsToDic.sh)
  2. #!/bin/sh
    
    CSV=../data/words.csv
    
    HATENA_FILE=keywordlist_furigana.csv
    HATENA_URL=http://d.hatena.ne.jp/images/keyword/${HATENA_FILE}
    
    WIKIPEDIA_FILE=jawiki-latest-all-titles-in-ns0
    WIKIPEDIA_URL=http://download.wikimedia.org/jawiki/latest/${WIKIPEDIA_FILE}.gz
    
    # hatena
    wget ${HATENA_URL}
    
    echo "makedic.rb: converting to ${CSV}..."
    ./makedic.rb ${HATENA_FILE} > ${CSV}
    echo "makedic.rb: done."
    
    rm -f ${HATENA_FILE}
    
    # wikipedia
    wget ${WIKIPEDIA_URL}
    gunzip -v ${WIKIPEDIA_FILE}
    
    echo "makedic.rb: converting to ${CSV}..."
    ./makedic.rb ${WIKIPEDIA_FILE} >> ${CSV}
    echo "makedic.rb: done."
    
    rm -f ${WIKIPEDIA_FILE}
    
    # convert to dic
    /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/naist-jdic/ -u ../data/words.dic -f euc-jp -t utf-8 ../data/words.csv
    
  3. 辞書生成用csvを作る (makedic.rb)
  4. #!/usr/bin/ruby
    
    require 'kconv'
    
    if $*[0] =~ /wiki/ then
        origin = "wikipedia_keyword"
    elsif $*[0] =~ /furigana/ then
        origin = "hatena_keyword"
    else
        origin = "unknown"
    end
    
    open($*[0]).each do |line|
            if origin == "hatena_keyword" then
                title = line.split("\t")[1].strip.toutf8
            else 
                title = line.strip
            end
    
            next if title =~ /^\./
            next if title =~ /,/
            next if title =~ /[0-9]{4}/
            next if title =~ /^[-.0-9]+$/
    
            score = [-32768.0, (6000 - 200 *(title.size**1.3))].max.to_i
    
            if title.size > 9 then
                    out = "#{title},-1,-1,#{score},名詞,一般,*,*,*,*,#{title},*,*,#{origin},\n"
                    print out.toeuc
            end
    end
    
makedic.rbはkokotechさんのものを流用させていただきました。
ありがとうございます。

この2つのファイルを同じディレクトリにおいて、
> ./convWebWordsToDic.sh
とか実行するとユーザ辞書を作成します。

ユーザ辞書が作成されて、人名、地名、最近の名詞が だいぶん補完されてよくなったのですが、 一個悩んだこととしては、ちょっと長めの言葉を入力すると、 無駄に分割されてしまうという現象が起きていました。

例えば
「アフガニスタン」
だと、こうなってしまいます。
> mecab
アフガニスタン
アフガニ        名詞,一般,*,*,*,*,アフガニ,*,*,wikipedia_keyword,
スタン  名詞,一般,*,*,*,*,*
EOS
そこでいろいろ調整してみたのですが、 scoreの計算方法で、mecabさんの の例に掲載されている計算方法である

score = [-36000.0 ,-400 *(title.size**1.5)].max.to_i

をちょっと変更することで、良い結果が得られました。

naist-jdicの名詞の標準的なスコアはだいたい6000点ぐらいだったので、 そこから16bitの符号付整数の最小値である-32768に向けてもうちょっと分布が広がるように調整してみました。

score = [-32768.0, (6000 - 200 *(title.size**1.3))].max.to_i

この数式だと日本語でだいたい20文字(utf-8で)ぐらいまでの名詞が 分布されるようになります。

これだと、
> mecab
アフガニスタン
アフガニスタン  名詞,一般,*,*,*,*,アフガニスタン,*,*,hatena_keyword,
EOS
ちゃんとできました。もうちょっと長いのでもいけた。
> mecab
スリランカ民主社会主義共和国
スリランカ民主社会主義共和国    名詞,一般,*,*,*,*,スリランカ民主社会主義共和国,*,*,hatena_keyword,
EOS
文脈IDはとりあえず-1に設定。あまり意味が分かってません。

本当はもっと正確なコスト計算の構築が必要なのでしょうが、 アドホックにやるのであれば、これだけでちょっと幸せになれました。
| | PCカテゴリ | コメント(0)

コメントする

Twitter

Ads

Powered by Movable Type 4.261

Photos

Ads