手軽に関連語を取得するモジュール

1つ前のエントリで「特徴語を抽出するモジュール」のことを書いたらそこそこ好評だったみたいなので、調子に乗ってもう1本モジュールを紹介しておきます。

Lingua::JA::Expand - word expander by associatives
http://search.cpan.org/~miki/Lingua-JA-Expand/

Expandってあたり、命名センスないのがバレバレですが、、
これは何をするものかと言うと、任意のキーワードを適当な数の関連語セットに膨らませてくれるモジュールです。

使い方と結果サンプル

使い方はこうです。

use strict;
use Lingua::JA::Expand;

my $str = 'ラーメン';

my $exp    = Lingua::JA::Expand->new;
my $result = $exp->expand($str);

# 見やすくするために降順に並び替える
for ( sort { $result->{$b} <=> $result->{$a} } keys %$result ) {
    print $_, "\t", $result->{$_}, "\n";
}

結果はこう

ラーメン        746.735117407316
めん    115.19820346382976.792604182765
店舗    74.5232237741862
札幌    54.7705028974057
天下一品        53.971373954155449.7426027111503
筑豊    42.3325003855036
全国    40.148273010642638.6415286797271
オープン        38.0900544262694
データベース     35.7654588692479
紹介    35.735338543092
日高    34.9774709664507
花月    34.3162743805373
限定    34.2043346762571
五丈原  30.5623297297413
神座    30.5243144375348
熊本    28.6771414387972
彩華    28.1398294690871
山頭火  28.1256450454992
メニュー        26.6536409307273
旭川    25.8935153095182
展開    25.4431624344011
時計    24.3197045747273
北海道  23.605611686252823.5412174051184
新横浜  23.2691620871474
新潟    22.849015210754
フランチャイズ  22.7082113774481

もう何個かためしてみます。

# 「熱帯魚」を膨らましてみた結果

熱帯魚  1202.0858222201
熱帯    303.082807371661
飼育    297.419295248393
水槽    269.284908413559
水草    256.95669515642
海水    99.8552331801887
エンゼルフィッシュ      74.0433170908222
繁殖    68.3167768486792
グッピー        64.4723826038333
コケ    64.4478245456286
販売    63.2121383348845
通販    61.0477063593257
ショップ        54.9072956941908
病気    50.2676467602614
図鑑    49.4959434511137
カス    47.3153469170471
コリドラス      44.7125500032891
ディス  41.077298716634739.3595157022637
サンゴ  38.7354248486008
紹介    38.484210738714536.9379421377789
メンテナンス    31.600912196932
メダカ  31.177948834459
生体    28.6454321511242
対策    27.6991425995122
種類    27.5255799892197
方法    27.4578682627338
入荷    25.6470941504311
用品    25.1194389605787
# 「初音ミク」を膨らましてみた結果

ミク    1076.31006764748
初音    1073.42470723792
動画    84.0841268015579
VOCALOID        59.6976690896689
つねみ  50.2418579338174
粉雪    45.4850584333459
クリプトン      45.1735390166651
ネギ    41.6416708241262
キャラクター    39.469394023681
ボーカル        37.0754457275094
音楽    35.2540098512146
ソング  29.3268033515613
オリジナル      29.1593803495894
イラスト        28.3980213449879
YouTube 27.8589122418455
バーチャル      26.1172753730476
ハツ    26.0675053684681
作品    24.3593801419581
楽曲    24.0238769332435
ポップ  23.8897861650889
発売    22.6231406589267
画像    22.5742572803563
リン    21.815209077553720.6883484348024
Wiki    19.899223029889619.8992230298896
ブログパーツ    19.8992230298896
決定    19.640761936790119.506870512621919.3544053104849

どうでしょうか?やや「なんちゃって感」も漂っていますが、なんとなく関連語というか連想語というか、そのようなものに膨らんだように見えませんか?

ちなみに単語の横の数値はLingua::JA::TFIDFで計算したTF/IDFの結果スコアです。

どんな仕組みで膨らませているの?

タネアカシをします。とっても簡単です!

渡された単語をYahoo Search APIになげて検索結果のスニペット部分をすべて連結して1つのテキストにします。そのテキストからLingua::JA::TFIDFを使って特徴語を抽出しています。で結果をハッシュリファレンスにして返しておしまい!それだけです。

で、何に使うの?

もともとはベイジアンフィルタによるテキスト分類器を作ろうと思ってこのモジュールを書きました。結果、これを使って「驚くほど簡単」に「そこそこの精度」の分類器を作ることができました。テキスト分類器の具体的な作り方は、また今度別のエントリにでも書きます。

Lingua::JA::Expandの使い道ですが、ベイジアンフィルタ以外にもアイデア次第で色々な使い方というか、可能性がありそうな予感がしています。

どなたか面白い使い方思いついたら教えてください。

よろしくです!