ちょっと興味があったので、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つのスクリプト。
ありがとうございます。
この2つのファイルを同じディレクトリにおいて、
ユーザ辞書が作成されて、人名、地名、最近の名詞が だいぶん補完されてよくなったのですが、 一個悩んだこととしては、ちょっと長めの言葉を入力すると、 無駄に分割されてしまうという現象が起きていました。
例えば
「アフガニスタン」
だと、こうなってしまいます。
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で)ぐらいまでの名詞が 分布されるようになります。
これだと、
本当はもっと正確なコスト計算の構築が必要なのでしょうが、 アドホックにやるのであれば、これだけでちょっと幸せになれました。
(インストールの仕方などはほかの人がいっぱい説明してくれているので割愛)
どうやら標準の辞書だけだと限界があるようので、以下の記事などを参考に
「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つのスクリプト。
- webからデータを取ってきて、csv作成コマンド、辞書作成コマンドを呼び出すshell (convWebWordsToDic.sh)
- 辞書生成用csvを作る (makedic.rb)
#!/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
#!/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
ありがとうございます。
この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に設定。あまり意味が分かってません。
本当はもっと正確なコスト計算の構築が必要なのでしょうが、 アドホックにやるのであれば、これだけでちょっと幸せになれました。

コメントする