TermExtract

2012.03.08

TermExtractの導入

■ インストール

>> 入手先(TermExtract)

perl Makefile.PL
make
su
make install

インストール方法としては上記のものが提示されている。find で確認してみると man 関連ファイル(?)のみがインストールされたようで本体はインストールされていなかった(←一旦インストールされたのに消してしまった可能性もかなりある:汗)。失敗した場合には TermExtract フォルダを「Perlのライブラリのパスが通っているディレクトリ」にコピーしろという指示があったのでそれに従ってみた。

■ ライブラリのパスの追加

自作モジュール群などは cgi-bin 下の Modules フォルダに入れて管理しているので TermExtract もとりあえずはそこに収めた。ここに置いたモジュールを利用するにはスクリプト冒頭部分の use 宣言以前に下記のように書く必要がある。

BEGIN{
push (@INC, '/Users/自分のアカウント/Sites/cgi-bin/Modules');
}

@INC は use などの実行時に Perl スクリプトが探すディレクトリを収めた特殊配列である。

とりあえず使ってみる

■ 概観

計算自体は Calc_Imp.pm が行なっているようだが、分析対象となるテキストの様態によって必要な前処理が異なる為か複数のモジュールが用意されている。このうち日本語用は4種類、英語用は2種類ある。

まだざっと眺めただけなので「重要度計算」で具体的にどのようなことをしているのかはよくわからない。しかしながら「専門用語の生成」「重要度計算の仕組み」という解説項目やソースに目を通してみると、「専門用語(キーワード)」の対象を名詞に絞っているのではないか、とは推察できる。

計算の基本単位は「単名詞」と呼ばれていて、これらの連接の状態や出現頻度によって重要度を算出しているらしいので、名詞以外は考慮されていないと考えられる。また実際のソースに関しても英語の処理では名詞に関する部分でだけ(複数形を単数形に直す処理と大文字小文字に関する処理など)に注意を払っている点、日本語で分かち書きされていないテキストを処理するのに漢字やカタカナが連続する部分を抜き出してくるという方法で対処している点などからも、そう結論づけられる。レンマ化などは特に気にしていない模様である。

■ TermExtract::MeCab

MeCab の処理結果を利用するには TermExtract::MeCab を使う。サンプルスクリプトもあるのですぐに試すことができる。

用意する分析対象ファイルの形式は「デフォルトのフォーマット指定を前提としている」そうなのだが、サンプルスクリプトのソースには以下のようにしか書いていなかったので若干混乱した。「形態素解析済みのデータ」が何を意味するのかよくわからなかったのである。

ファイルから「和布蕪」の形態素解析済みのデータを読み取り標準出力に専門用語とその重要度を返すプログラム

デフォルトのフォーマット指定とは、surface を左端におき、タブで区切った右側に9つのカンマで区切られた feature をすべて並べるやり方で、一行一語に書き表したもののことをいっているらしい。これを Text::MeCab モジュールで出力するには use 宣言した上で以下のように書く必要がある。

$out = "./mecab_out.txt";
open (OUT, ">$out");
$mecab = Text::MeCab->new();
$node = $mecab->parse($lines);
while ($node){
printf OUT ("%s\t%s\n", $node->surface, $node->feature);
$node = $node->next;
}
close(OUT);

Text::MeCab は MeCab.pm と書式が若干異なっている(参照)。MeCab.pm の方だと何をやっているのかよくわからない部分があったが、こちらではそういうことはない。

上のサンプルで出力先が mecab_out.txt となっているのは TermExtract の作者が用意してくれた ex_mecab.pl が読み込むファイル名と等しくしたためである。該当部分は次の通り。

use TermExtract::MeCab;
#use strict;
my $data = new TermExtract::MeCab;
my $InputFile = "mecab_out.txt"; # 入力ファイル

$InputFile で指定されたファイルはその後 get_imp_word というメソッドで処理されているようである。ex_mecab.pl をはじめ付録スクリプトでは皆以下のように処理している。

my @noun_list = $data->get_imp_word($InputFile); # 入力がファイル

ただ、その先でどういうことをやっているのかは一見しただけでは今ひとつ追いきれずよくわからなかった。そこで時間的余裕もなく手間もかけておられないこともあり「Text::MeCabを使って処理した結果を mecab_out.txt ファイルとして出力し、それを TermExtract::MeCab がまた読み込んで利用する」という形式で CGI スクリプトを作成してみる。

CGI での使用

■ 付録スクリプトの利用

付録スクリプトに書かれた内容の前に上述したような Text::MeCab による処理部分を挿入すれば問題はない。一旦書き出してまた読み込むというのはスマートなやり方ではないが別段問題もない。

とりあえず動かすだけであれば(上で引用した部分を除くと) html として出力するのに使う以下の内容程度を付け加えればよい。

print '<table>',"\n";
foreach (@noun_list) {
next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/;
next if $_->[0] =~ /^\d+$/;
printf "<tr><td>%-60s</td><td align=right> %16.2f</td></tr>\n", $_->[0], $_->[1];
}
print '</table>',"\n";

3行目と4行目は日時や数字を取り除くためのものである。一行が専門用語と重要度数を並べたものとなるテーブルを表示する。

■ POSタグなし英文版 CGI

以前公開したtptbサンプル版の分析対象ファイルを共用してTermExtract を試すことができる CGI を作成してみた。

>> TermExtract CGI trial版

POSタグがついていない状態のテキストを対象にするので単数/複数をはじめ一切レンマ化されていないし名詞中心ということにも特になっていない。またテキストが長くなるとリストも長大になるため重要度数50以下は表示しないようにしてある。

▼研究関連メモ目次へ戻る

Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.