« IIS のログを tail -f | メイン | Lingua::JA::Summarize 0.02 »

2006年04月26日

キーワード抽出モジュールを作ってみた

 一昨日、同僚の竹迫さんに、文書内からのキーワード抽出技術について教えてもらっていた時、わざわざ TF-IDF注1 用に別のコーパスを用意しなくても、MeCab だったら生起コストを辞書内に持っているんだから、それを使えばいいのではないか、という話になりました。

 竹迫さんがその日のうちに作ってくれたプロトタイプで、アルゴリズムの改善とパラメータのチューニングを行ったところ、十分な品質が出そうなので、書き直して公開することにしました。

Lingua-JA-Summarize-0.01.tar.gz
(4/27 15:55 追記: 0.02 をリリースしました)
(5/2 追記: 0.04 をリリースしました)

 普通の Perl モジュールなので、 perl Makefile.PL && make && make install すれば使うことができます (15:50追記: すみません。 MeCab がインストールされている必要があります)。呼び出し方は↓のような感じ。

use Lingua::JA::Summarize;

my $s = Lingua::JA::Summarize->new;
$s->analyze("この文章を解析します。");
my @keywords = $s->keywords(threshold => 1);注5
print join(" ", @keywords) . "\n";

 売り文句としては、
 ・初期データベースの準備が不要
 ・ライブラリなので、公開できない情報の解析にも使用可能
 ・メンテナンスフリー
といったあたりになるでしょうか。

 実装にあたっては、連続する名詞を自動的に結合評価するようにした点がポイントだったと思います。
 たとえば、インタヴュー形式のニュース記事を解析すると、会社名 (emcジャパン) や、その副社長の名前 (ハワード・エライアス氏) が、ちゃんとキーワードとして抽出されます注2
 したがって、サービス型のキーワード抽出システム注3と比べて弱点になる可能性がある、時事問題や、専門性の高い文書についても、適切なキーワード抽出を期待することができます (たぶん)。

 英語 や URL と取り扱い等、まだまだ改善の余地がある (要約機能は未実装だし) ものですが、はてなブックマークとも十分比較できるレベルにはなったかな注4、と思います。

 ウェブブラウザから操作できるサンプルを http://kazuho.31tools.com/summarize/example/keyword.cgi に用意しましたので、あわせてお楽しみください。

 身近に先生がいると、いいものですね。竹迫さん、ありがとうございました。

17:25 追記: MeCab は 0.9 ではなく 0.81 を使うべきだ、ということです。詳しくはコメントをごらんください。 taku さん、ありがとうございます。


注1: 形態素解析と検索APIとTF-IDFでキーワード抽出 (たつをの ChangeLog ) が詳しいと思います
注2: キーワード数 20, 閾値 5 の場合 (4/27 11:53 追記: むー、計算アルゴリズムが間違っている気がする...)
注3: bulkfeeds の Similarity API
注4: (16:13 追記) 英語のコーパスを持っていないので、英単語がいっぱいあるデータには弱いですが...
注5: (4/27 11:53 追記) threshold (閾値) の初期値は 5 です

投稿者 kazuho : 2006年04月26日 15:19 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/565

このリストは、次のエントリーを参照しています: キーワード抽出モジュールを作ってみた:

» Win32でLingua::JA::Summarizeを使う from Charsbar::Note
サイボウズラボのOkuさんがLingua::JA::Summarizeというモジュールを公開されていたのでさっそくテスト。mecabが入っていない場合はh... [続きを読む]

トラックバック時刻: 2006年04月26日 17:43

» [を] キーワード抽出モジュール Lingua-JA-Summarize[Programming][NLP] from たつをのChangeLog
...形態素辞書にある単語コスト(解析に使用するやつ)を TF-IDF っぽく使ってキーワード抽出する手法。手軽にさくっと使えて非常に良い感じです!これを... [続きを読む]

トラックバック時刻: 2006年04月27日 10:22

» 研究室-Kikkerの改善- from Ryoの開発日記
とりあえず、サイトの解析をもっと効率よく精度を上げてやるにはどうすればいいか考えたり調べてみた。 すると 汎用連想計算エンジン GETA http://g... [続きを読む]

トラックバック時刻: 2006年04月30日 02:48

» Link/Perl from [ abs+ ] (PukiWiki/TrackBack 0.3)
Perl・CGIに関するリンク集。 Contents Contents Link/Perl 公式 リファレンス モジュール ... [続きを読む]

トラックバック時刻: 2009年05月01日 20:21

コメント

mecab 0.90 から CRF という方法を使っていて、単語正規コスト=~ idf と近時できるわけではありません。
mecab 0.81 や chasen が採用しているコストはそうやっても実用上は問題ないと思います。

投稿者 taku : 2006年04月26日 17:08

> mecab 0.90 から CRF という方法を使っていて、単語正規コスト=~ idf と近時できるわけではありません。

がーん。そうなんですか。
0.81 と 0.9 の両方を使って開発していたんですが、結果がちょっとずつ違うなぁ、と思いながら、あまり気にしていませんでした。

ありがとうございます。

投稿者 kazuho : 2006年04月26日 17:19

すばらしい!単語コストを使ってしまうなんて、なかなか手軽で良いですね!

あと、ブログには「動く」サンプルを載せた方が良いと思いました。
threshold がデフォルトだと、"この文章を解析します。" だと何も出ないみたいです。

#!/usr/bin/perl
use strict;
use warnings;
use Lingua::JA::Summarize;

my $s = Lingua::JA::Summarize->new;
$s->analyze("この文章を解析します。");
my @keywords = $s->keywords({threshold => 1});

print join(" ", @keywords),"\n";

投稿者 たつを : 2006年04月26日 17:53

文区切りのところでバグ発見。以下で化けます。

~法31により~
~点検ABC~
~◆2003:今年は~
~お粥3杯~
~教諭Aが~

詳しくはこちらを→
簡単な日本語文区切りプログラムの雛型
http://nais.to/~yto/tools/jbuncut/

あと、MeCabモジュールを使うと良いんじゃないかな~、と言ってみます。
→[を] MeCabをPerlから使う
http://nais.to/~yto/clog/2006-02-25-4.html

投稿者 たつを : 2006年04月26日 18:09

リンクの尻が
tar.gz%20z
となってしまっています。修正あれ。
Dan the Reader of Yours

投稿者 : 2006年04月27日 10:31

たつをさん:
 なるほど、おっしゃるとおりですね。修正しました。

弾さん:
 ご指摘ありがとうございます。修正いたしました。

投稿者 kazuho : 2006年04月27日 11:57

半角の大英字(例えばGETIMAGE)がモジュールを使うとgetimageと表示され、すべて小文字となってしまいます。これはバグなのでしょうか?できれば直していただきたいと思いコメントしました。

投稿者 yamadatarou : 2009年03月21日 14:28