プログラマでありたい

おっさんになっても、プログラマでありつづけたい

MeCabで、キーワード抽出

 形態素解析器として圧倒的な性能を誇るMeCabですが、出来る事は形態素解析にとどまりません。公式ページにも載っているように、辞書さえカスタマイズすればひらがな⇔カタカナ変換やAutoLinkの作成といったことまで出来ます。
 WikipediaのデータとMeCabを使えば、高速なキーワード抽出が出来ないかなと思い試してみました。辞書の定義にコストを書けば、長いキーワードを優先して抽出する最長一致法が出来そうです。それが出来れば、辞書にキーワードを登録すればおっけいかなと思い実験です。


準備
・Mecabのインストール
  省略
・Wikipediaのダウンロード
  wikipediaからコーパスの作成を参照
・辞書生成用のCSV作成
  xml2sqlで作ったpage.txtを変換します。
  この際、(曖昧さ回避)は除いておきます。
  併せて、カンマが入っている見出し文は、別のものに置き換えておくこと

cat page.txt | awk '{print $3}' | grep -v "(曖昧さ回避)" > wiki.txt

アップロードログ_2004年4月
削除記録/過去ログ_2002年12月
アンパサンド
Sandbox
Brion_VIBBER
言語
日本語
地理学
欧州連合


textからMeCabの辞書作成用のCSV作成のスクリプトです。
CSVの項目としては、左から見出し語,左文脈との連結コスト,右文脈との連結コスト,出現コスト,品詞となります。接続コストは、ともに0でおっけいです。出現コストは、長い言葉ほどコストを低くします。ただし、intの範囲内で。最後に品詞はなんでも良いです。URLでも入れればwikipediaへのAutoLinkが作れます。今回は面倒くさいので、見出し語をそのまま入れてあります。

#!/usr/bin/perl

use strict;
use warnings;

my $file = shift @ARGV;
open(IN, $file);

while (<IN>) {
  chomp;
  if (length($_) > 1) {
    #print $_,",0,0,",max(-36000,-400 * (length^1.5)),",$_\n" ;
    print "$_,0,0,",max(-36000,-400 * (length^1.5)),",$_\n" ;
  }
}

sub max {
    my $comp = shift @_;
    my $val  = shift @_;
    my $max  = $comp;
    if ( $comp <= $val ) {
      $max = $val;
    }
    return int($max);
}


・設定ファイルの作成
  以下、4ファイルを作成
matrix.def

1 1
0 0 0

unk.def

DEFAULT,0,0,0,*
SPACE,0,0,0,*

char.def

DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE

dicrc

dictionary-charset = utf-8
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=extract

node-format-extract = %H\n
unk-format-extract =
eos-format-extract = \n

最後に改行コードが入るとエラーが出るので、注意しましょう。


・辞書作成

/usr/local/libexec/mecab/mecab-dict-index  -f utf-8 -c utf-8

# /usr/local/libexec/mecab/mecab-dict-index  -f utf-8 -c utf-8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./title.csv ... 1272597
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 1x1

done!


・試してみる

# mecab -d .
経済学の最も古い定義は、アダム・スミスが『諸国民の富の性質と原因の研究』によるものである。
経済
学
の
も
い
定義
は
、
ア
ダム
・
スミ
ス
が
『
諸国民の富の性質と原因の研究
』
に
よる
もの
で
ある
。

うーん。微妙に上手くいかない。
アダム・スミスや経済学で出てきてほしい。また、「に」やら「で」やらは出てきてほしくない。もうちょっと調べてみる必要がありそうです。