TermExtract::Calc_Imp -- 専門用語重要語計算モジュール
use TermExtract::Calc_Imp;
TermExtract はテキストデータから、専門用語を取り出すためのPerlモジュ
ールである。
「茶筅」、「和布蕪」などの形態素解析ソフトや"Brill's Tagger"などの英
文の品詞タグ付けソフトの処理結果、もしくは文章そのものを入力とし、複合
語(もしくは単語)の生成と、その重要度の計算と重要度順の並び替えを行う。
「茶筅」などからの複合語の生成は、このCalc_Impの子クラスで定義される
メソッド get_imp_word で処理し、Calc_Imp本体は用語の重要度の計算と重要
度順のリストの生成のみを行う。これにより、子クラスを新規に用意すること
で、多種の形態素解析ソフト等への対応を可能にしている。また、このこのモ
ジュールは入力となる文字コードによらず動作する。
重要度計算は、次のとおり行う。
このモジュールでの専門用語は、単語そのものか、複数の単語を組み合わせ
て作られる。この複合語を構成する最小単位の名詞を特に「単名詞」と呼ぶ。
この単名詞が他の単名詞と連結して複合語をなすことが多いほど、重要な概念
を表すと考える。
簡単な例で、「情報科学技術」を考えてみる。この語は、次のとおり3つの
単名詞に分割できる。この際、それぞれの単名詞が他の単名詞とどれだけ結び
つくか統計的にわかっているとする。
単名詞 前の語に連結した回数 後の語に連結した回数
--------------------------------------------------------
「情報」 1 2
「科学」 2 3
「技術」 1 1
複合語全体の重要度はこれらの6つ(単名詞数x2)の数値の平均から求め
る。このモジュールでは平均を相乗平均でとるようにした。
(正確には相乗平均をとる際、0回の単名詞を扱う関係から1を加算した値の
相乗平均を用いる)
前述のとおり、Calc_Impは子クラスでメソッド get_noun_frq をオーバーラ
イドすることで動作する。
そのメソッド get_noun_frq の入出力仕様は次のとおり。
引数
第1引数 ---- オブジェクト
第2引数以下は任意に定義可能
戻り値
次のキーと値からなるハッシュリファレンスを返すこと
キー ---- 単名詞を半角スペースで区切り表示した複合語
(例 "航空 工業 デザイン")
値 ---- 文中のキー(複合語)の出現回数
なお、キーの上限サイズは1Kバイトとし、それ以上の場合は異常とみ
なし、無視するようにした。
また、日本語や中国語のように単名詞が1字空けで表記されない言語
(膠着言語や孤立語)の場合には、get_noun_frq内で次のメソッドを実行
すること。これにより、アルファベット以外の単名詞は1字空けなしで結
果出力される。
(Calc_Imp.pm ver.2.00 から膠着言語の明示的な設定が必要になった)
$obj->IsAgglutinativeLang; ($objはオブジェクト)
また、次のメソッドを使い重要度計算を行わない語("of"のように他の語と
多数の組み合わせができてしまう語)を登録することもできる。
$obj->IgnoreWords('単語A', '単語B' ...); ($objはオブジェクト)
(Calc_Imp.pm の ver.1.xx では配列 @TermExtract::Calc_Imp::IgnoreWords
で指定していたが、ver.2.00 から上記の方式に変更)
1バイトの数値は重要度計算の対象から外した(単位を示す語の重要度が高
くなりすぎることを防ぐため)。
1バイト数値と、$obj->IgnoreWords の語が単語で現れた場合は、連接統計
情報を常に1とするが、用語の抽出は行う。
このモジュールを「学習機能」とDF(Document Frequency)を用いた重要度
計算をサポートしている。その学習用には学習用のDBファイルが必要である。
DBファイルは、Perlの DB_File モジュール(バークレーDB)の使用を推奨
している。もし、DB_Fileが使えない場合は、SDBM_File を使うよう設定
($obj->use_SDBM) できるが、単名詞の連接統計DB(学習機能用DB)の文字コ
ード順表示、前方一致検索の機能は使えない。
バージョン 5 のPerl(JPerlを含む)で動作する。
以下のメソッドが使用可能である
コンストラクタ・メソッド。
新たに ExTerm::Calc_Imp (か、その派生クラス)のオブジェクトを作成し
、そのオブジェクトを返す。
usage :
$obj = TermExtract::AnyClass->new;
※ TermExtract::AnyClassは派生クラス
専門用語の重要度を計算し、専門用語と重要度(数値)の2要素からなる
配列を重要度の高い順に返す。
(パラメータ省略時は、前回の入力を使う、重要度の計算モードはそのつど
セット可能)
usage :
@result = $obj->get_imp_word(Parameter_1, Parameter_2, ... Parameter_N);
foreach (@result) {
print $_->[0], "\t"; # 専門用語
print $_->[1], "\n": # 専門用語の重要度
}
重要度計算において、連接語の重みを、連接した単語の延べ数で計算する。
例えば、統計データで、「情報」という語が「科学」の前に2回、「技術」
の前に3回連接したとすると。連接語の重みは次のとおり計算される。
5回 (「科学」2回 + 「技術」3回)
*正確には相乗平均をとる際、0回の単名詞を扱う関係から1を加算した
値を用いる
usage :
$obj->use_total;
重要度計算において、複合語の重みを、単語の種類数でとるモードにする。
例えば、統計データで、「情報」という語が「科学」の前に2回、「技術」
の前に3回連接したとすると。複合語の重みは次のとおり計算される。
2回 (「科学」 + 「技術」の2種)
*正確には相乗平均をとる際、0回の単名詞を扱う関係から1を加算した
値を用いる
usage :
$obj->use_uniq;
重要度計算において、複合語の重みを、パープレキシティでとるモードにする。
なお、現在の仕様では、「学習機能」と組み合わせて使うことはできない。現在
パープレキシティによる重要度計算は、「学習機能」をサポートしていない。その
ため、自動的に「学習機能」を使わない重要度計算が行われる。
パープレキシティは情報理論で使われる指標で、このシステムの場合は各単名詞
に「情報理論的に見ていくつの単名詞が連接可能か」を示している。これは、以下
のようにして求まる単名詞のエントロピーを元に、2のべき乗することで求められ
る。
連接する語のそれぞれの出現確率をP1~Pnとおくと、エントロピーの計算は次の
ように示せる。なお対数の底は2である。
(-1 * P1 * log(P1)) + (-1 * P2 * log(P2)) ....... + (-1 * Pn * log(Pn))
例えば、統計データで、「情報」という語が「科学」の前に2回、「技術」の
前に3回連接(あわせると計5回連接)したとすると。単名詞のエントロピーは
次のとおりになる。出現確率は「科学」が 2/5, 「技術」が 3/5 である。
(-2/5 * log(2/5)) + (-3/5 * log(3/5))
パープレキシティそのもの計算は計算機に負荷がかかるため、重要度の比較に支
障がないレベルで計算を抑える。これは、パープレキシティの値ではなく、2を底
にしたパープレキシティの対数を出すことで実現できる(対数でも重要度の順序に
は影響しない)。
重要度を2を底にした対数で出すことにより、「相乗平均」と「出現頻度の掛け
合わせ」は次の計算になる。
複合語内の相乗平均 --- 各単名詞のエントロピーの合計 / (単名詞数 x 2)
出現頻度 ------------ 出現頻度の対数(底は2)を加算
なお、対数の計算では 0log(0) → 0 とした。この際に log(1) → 0 と差が出なく
なるため、log(n) の計算を log(n+1) とすることでスムージングを行った。
usage :
$obj->use_Perplexity;
重要度計算において、複合語の重みを使わないモードにする。頻度の情報
(Frequency, TF)やIDF(Inverted Ducoment Frequency) のみ有効になる。
usage :
$obj->no_LR;
重要度を用語の出現頻度でとるモードにする。Frequency による重要度計算モード。
重要度を用語の出現頻度でとるモードにする。ただし、用語が他の用語の一部と
して現れた場合もカウントする。Term Frequency (TF)による重要度計算モード。
usage :
$obj->use_TF;
他の重要度計算結果に対し、IDF (Inverted Document Frequency) にて補正する。
事前に $obj->use_storage_df; にて、対象ドキュメントのDF(Document Frequency)
の統計をとっておく必要がある。
IDFの計算は、log (総文献数 / 該当の用語を含む文献数)+1 にて行う。
usage :
$obj->with_idf;
重要度計算において、ドキュメント中の専門用語の出現頻度を掛けるモード
にする。
デフォルトはこのモード。
usage :
$obj->use_frq;
重要度計算において、複合語の連接情報のみで計算する(ドキュメント中の
専門用度の出現頻度を考慮しない)モードにする。
usage :
$obj->no_frq;
重要度計算において、学習機能(単名詞ごとの連接統計DBの情報)を使うモ
ードにする。
重要度計算において、単名詞の連接情報は、元となるデータが多いほど正確
な統計データが得られると推測される。この学習機能は、いままでに処理対象
としたテキストから単名詞の連接情報を蓄積し、重要度計算で用いるものであ
る。
ただし、PerlのDBMが使えない環境では、自動的に学習機能がOFFになる。
$obj->use_storage (新規ドキュメントの単名詞の連接情報DBへの追加)と
合わせて使用する。
usage :
$obj->use_stat;
sample :
$obj->use_stat;
$bbj->use_storage;
$obj->get_imp_word();
重要度計算において、ドキュメント中の情報のみ使用(学習機能を使わない
)モードにする。use_stat メソッドの項を参照。学習機能用データベースの
蓄積をとめる場合は、$obj->no_storage; を使用する。
デフォルトはこのモード(ver 4.02 より)。
usage :
$obj->no_stat;
sample :
$obj->no_stat;
$bbj->no_storage;
$obj->get_imp_word();
重要度計算で、「ドキュメント中の用語の頻度」と「単名詞の連接回数の相
乗平均」のバランスを調整するためのメソッド。
重要度計算でドキュメントの中の頻度を使用するモード(デフォルト)にし
たときのみ、動作する。
デフォルトの値は1。数値以外と 0 は受け付けない。
値を大きくとる → ドキュメント中の用語の頻度の比重が高まる
値を小さくとる → 単名詞の連接回数の重要度の比重が高まる
usage :
$obj->average_rate($Any_numeric_value);
"get_imp_word"メッソッドは、引数なしの場合、データの再読み込みを行わ
ない。
このメソッドはそれを強制的に再読み込みをさせるための機能である。派生
クラスでメソッド get_noun_word が引数をとらずとも動くよう設計されてい
る場合のみ意味を持つ。
usage :
$obj->reset_get_word;
sample :
@result1 = $obj->get_imp_word();
# 再度、get_imp_word の実装にそって、データを取り込む
$obj->reset_get_word;
@result2 = $obj->get_imp_word();
"get_imp_word"の戻り値(配列)同士の掛け合わせを行う。
戻り値は get_imp_word の戻り値と同じ形式の配列になる。
メッソッドのパラメータ指定法は次のとおり。
第1引数 ----- 専門用語リストA
第2引数 ----- 専門用語リストB
第3引数 ----- 専門用語リストA の上位何件まで使用するか指定
第4引数 ----- 専門用語リストB の上位何件まで使用するか指定
※ 第3引数と第4引数は省略可。省略した場合は、それぞれ
"100000"(実質無制限)がセットされる。
usage :
@list = $obj->result_filter(\@list_a, \@list_b, $limit_a, $limit_b);
sample :
$obj->use_total;
@result1 = $obj->get_imp_word();
$obj->no_LR;
@result2 = $obj->get_imp_word();
@result3 = $self->result_filter(\@result1, \@result2, 30, 30);
単名詞ごとの連接情報を蓄積するDBファイル名を指定する。
デフォルトは stat.db
引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。
usage :
$obj->stat_db("AnyFileName");
2語の単名詞の組とその出現頻度(延べ数と異なり数)を蓄積するDBファイ
ル名を指定する。
デフォルトは comb.db
引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。
usage :
$obj->comb_db("AnyFileName");
2語の単名詞の組とその頻度を蓄積したDBファイルから、2語の単名詞の組
の前後を逆にしたDBを作成する際の、ファイル名を指定する。
単名詞の統計情報を解析するためだけに使用するので、必須の設定ではない
。このDBはメソッド make_comb_rev を使うことで初めて作成される。
デフォルトは comb_r.db
引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。
usege :
$obj->comb_r_db("AnyFileName");
DF(Document Frequency)用のDBファイル名を指定する。
デフォルトはdf.db
引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。
usage :
$obj->df_db("AnyFileName");
単名詞の連接情報DBへデータ蓄積を行うモードにする。
usage :
$obj->use_storage;
sample :
$obj->use_stat;
$bbj->use_storage;
$obj->get_imp_word();
単名詞の連接統計DBへのデータ蓄積を行わないモードにする。デフォルト
はこのモード。
重要度計算で、学習機能を使うときは、このモードにしないほうが無難。
処理対象にDBに登録されていない語が含まれていると正しく動作しない。
usage :
$obj->no_storage;
sample :
$obj->no_stat;
$bbj->no_storage;
$obj->get_imp_word();
DF(Document Frequency)用のDBへデータ蓄積を行うモードにする。この
モードの間は、データの蓄積のみで重要度計算は行わない。
usage :
$obj->use_df_storage_df;
単名詞の連接統計DBへのデータ蓄積を行わないモードにする。デフォルト
はこのモード。
usage :
$obj->no_df_storage_df;
単名詞の連接統計DBのデフォルトはBerkeley DBだが、これをSDBMに変更
する。
(Berkeley DBは環境によっては使えないが、SDBM は常に使用可能)
usage :
$obj->use_SDBM;
このモジュールでは、統計DBの整合性を保つためのロック用ディレクトリを
使用している。
このメソッドは、そのロック用ディレクトリのディレクトリ名を設定する。
空文字列(Null値)をセットした場合は、ロックしない。
デフォルトでは、空文字列をセット。よってロックは行われない。
引数なしで呼び出した場合は、設定されているディレクトリ名を返す。
プログラムの異常終了時にはロックを開放するようになっているが、プロセ
スの強制停止の際には、最悪ロック用ディレクトリが残ってしまう可能性があ
る。ユーザプログラム側で次のようなコーディングをすることで、プロセスの
強制終了(端末からの 'ctrl'キー + 'C'キー等)にある程度対応できる。
=====================================================
# プロセスの異常終了時処理
$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'sigexit';
Any Code ................
# プロセスの異常終了時にDBのロックを解除
sub sigexit {
$obj->unlock_db;
}
=======================================================
これでもロックが残る可能性がある。その際は、OSからロックディレクトリ
を削除すること。
usage :
$obj->lock_dir("AnyDirName");
統計DBをロックする(ロック用ディレクトリを作成)。
既にDBがロックされている場合は、1システム秒おきに5回までロックを試み
る。それでも、ロックされたままの場合は、戻り値として 0 を返す。
ロックに成功した場合は、戻り値として 1 を返す。
なお、このメソッドはメソッド lock_dir で値がセットされた場合のみ動作
する。
usage :
$obj->lock_db;
統計DBのロックを解除する(ロック用ディレクトリの削除)。
usage :
$obj->unlock_db;
統計DBをロックしたかどうかを返す。
ロックしているなら真(1)を返す
usage :
$obj->db_locked;
単名詞の連接統計DBの内容を標準出力に出す。
1)引数なしの場合、全件出力する
2)第1引数ありの場合、その引数の前方一致データを出力する
3)第2引数が真の場合、第1引数の完全一致データを出力する
なお、出力フォーマットは次のとおり。
単名詞[タブ]数値1[空白]数値2[空白]数値3[空白]数値4
数値1 -- 単名詞の前にいくつの語をとるか(異なり数)
数値2 -- 〃 (延べ数)
数値3 -- 単名詞の後にいくつの語をとるか(異なり数)
数値4 -- 〃 (延べ数)
usage :
$obj->dump_stat_db($Any_key_word);
既出の連接語とその頻度をおさめるDBの内容を表示する。
1)引数なしの場合、全件出力する
2)第1引数ありの場合、その引数の前方一致データを出力する
3)第2引数が真の場合、第1引数の完全一致データを出力する
なお、出力フォーマットは次のとおり。
単名詞1[空白]単名詞2[タブ]単名詞の組み合わせの延べ数
usage :
$obj->dump_comb_db($Any_key_word);
既出の2語の単名詞の組とその出現頻度をおさめるDB(逆順)の内容
を表示する。
1)引数なしの場合、全件出力する
2)第1引数ありの場合、その引数の前方一致データを出力する
3)第2引数が真の場合、第1引数の完全一致データを出力する
なお、出力フォーマットは次のとおり。
単名詞1[空白]単名詞2[タブ]単名詞の組み合わせの延べ数
usage :
$obj->dump_comb_r_db($Any_key_word);
既出の2語の単名詞の組とその出現頻度をおさめるDB(逆順)を作成(もし
くは更新)する。
重要度計算では使用しないが、ある単名詞の前にどの単名詞が結びつきうる
かの統計情報を得ることができる。
usage :
$obj->make_comb_rev;
DF(Document Frequency)用の統計データの内容を表示する。
単名詞1[空白]単名詞2[空白] ....[タブ]用語を含むドキュメント数
[空白]の場合は、いままで読み込んだ総ドキュメント数
usage :
$obj->dump_df_db($Any_key_word);
単名詞の連接統計DBと、既出の2語の単名詞の組とその出現頻度をおさめる
DBの内容をクリアする。
usage :
$obj->clear_db;
DF(Document Frequency)用統計DBの内容をクリアする。
usage :
$obj->clear_df_db;
重要度が低いにもかかわらず、単語の連接で頻出する語(例えば、英語の
ofなど)を重要度の計算対象外にする。
ユーザプログラムではなく、派生クラスでの使用のために用意した。
(BrillsTagger.pm, EnglishPlainText.pm などで使用している)
usage :
$obj->IgnoreWords('単語A', '単語B', ...);
引数を与えないと、現在の設定値(配列)を返す。
言語を膠着言語や孤立語(日本語や中国語などの文字空けで単語区切されない
言語)に設定する。ユーザプログラムではなく、派生クラスでの使用のために用
意した。
Calc_Imp.pm の ver 2.00 以降では、処理対象言語が膠着言語か孤立語の場合、
このメソッドの使用が必要。(Chasen.pm, ICTCLAS.pm などで使用している)
このメソッドを使用しないと、入力を屈折語(デフォルト)として扱い
、単名詞を半角スペースで区切った形での出力になる。
usage :
$obj->IsAgglutinativeLang;
言語を屈折語(英語など文字空けで単語が区切られている言語)に設定
する。ユーザプログラムではなく、派生クラスでの使用のために用意した。
デフォルトは非膠着言語のため、通常は使用する必要はない。
usage :
$obj->NotAgglutinativeLang;
TermExtract::Chasen
TermExtract::MeCab
TermExtract::BrillsTagger
TermExtract::EnglishPlainText
TermExtract::ChainesPlainTextUC
TermExtract::ChainesPlainTextGB
TermExtract::ICTCLAS
TermExtract::JapanesePlainTextEUC
TermExtract::JapanesePlainTextSJIS
このプログラムは、東京大学・中川裕志教授、横浜国立大学・森辰則助教
授が作成した「専門用語自動抽出システム」のExtract.pm を参考に、中川
教授の教示を受け、1からコーディングし直したものである。
この作業は、東京大学・前田朗(maeda@lib.u-tokyo.ac.jp)が行った。
その際のコンセプトは次のとおり。
1.形態素解析データの取り込みも含めてモジュール化し、他のプログラ
ムへの組み込みができること
2.学習機能(連接語統計情報のDBへの蓄積とその活用)を持つこと
3.重要度計算方法の切り替えができること
4.日本語パッチを当てたPerl (Jperl) だけではなく、オリジナルの
Perlで動作すること
5.信頼性の確保のためPerlのstrictモジュール及びperlの-wオプション
に対応すること
6.「窓関数」による、不要語の削除ルーチンをとりはずすこと
7.単名詞の連接回数の相乗平均を正しくとること。Extract.pmは連接回
数の2乗を重要度としていた。
なお、この設定はパタメータにより調整できる。Extract.pmと同じに
するには、$obj->average_rate(0.5) とする
8.数値と任意の語を重要度計算の対象からはずせるようにすること
9.多言語に対応するため、Unicode(UTF-8)で動作すること
10.パープレキシティを元に重要度計算を行えるようにすること。
11.Frequency, TF, TF*IDFなどの重要度計算機能を持つこと
Extract.pm の作者は次のとおり。
Keisuke Uchima
Hirokazu Ohata
Hiroaki Yumoto (Email:hir@forest.dnj.ynu.ac.jp)
なお、本プログラムの使用において生じたいかなる結果に関しても当方
では一切責任を負わない。