TermExtract::Calc_Imp -- 専門用語重要語計算モジュール

- NAME
- SYNOPSIS
- DESCRIPTION
- INSTALL
- METHODS

- new
- get_imp_word
- use_total
- use_uniq
- use_Perplexity
- no_LR
- use_freq
- use_TF
- with_idf
- use_frq
- no_frq
- use_stat
- no_stat
- agverage_rate
- reset_get_word
- result_filter
- stat_db
- comb_db
- comb_r_db
- df_db
- use_storage
- no_storage
- use_storage_df
- no_storage_df
- use_SDBM
- lock_dir
- lock_db
- unlock_db
- db_locked
- dump_stat_db
- dump_comb_db
- dump_comb_r_db
- make_comb_rev
- dump_df_db
- clear_db
- clear_df_db
- IgnoreWords
- IsAgglutinativeLang
- NotAgglutinativeLang

- SEE ALSO
- COPYRIGHT

# NAME

        TermExtract::Calc_Imp -- 専門用語重要語計算モジュール

# SYNOPSIS

        use TermExtract::Calc_Imp;

# DESCRIPTION

        TermExtract はテキストデータから、専門用語を取り出すためのPerlモジュ
      ールである。
        「茶筅」、「和布蕪」などの形態素解析ソフトや"Brill's Tagger"などの英
      文の品詞タグ付けソフトの処理結果、もしくは文章そのものを入力とし、複合
      語（もしくは単語）の生成と、その重要度の計算と重要度順の並び替えを行う。
        「茶筅」などからの複合語の生成は、このCalc_Impの子クラスで定義される
      メソッド get_imp_word で処理し、Calc_Imp本体は用語の重要度の計算と重要
      度順のリストの生成のみを行う。これにより、子クラスを新規に用意すること
      で、多種の形態素解析ソフト等への対応を可能にしている。また、このこのモ
    　ジュールは入力となる文字コードによらず動作する。

        重要度計算は、次のとおり行う。

        このモジュールでの専門用語は、単語そのものか、複数の単語を組み合わせ
      て作られる。この複合語を構成する最小単位の名詞を特に「単名詞」と呼ぶ。
      この単名詞が他の単名詞と連結して複合語をなすことが多いほど、重要な概念
      を表すと考える。
    　  簡単な例で、「情報科学技術」を考えてみる。この語は、次のとおり３つの
      単名詞に分割できる。この際、それぞれの単名詞が他の単名詞とどれだけ結び
      つくか統計的にわかっているとする。

       単名詞　　前の語に連結した回数　　後の語に連結した回数
       --------------------------------------------------------
      「情報」　　　　　１　　　　　　　　　　　　　　　２
      「科学」　　　　　２　　　　　　　　　　　　　　　３
      「技術」　　　　　１　　　　　　　　　　　　　　　１

        複合語全体の重要度はこれらの６つ（単名詞数ｘ２）の数値の平均から求め
      る。このモジュールでは平均を相乗平均でとるようにした。
      （正確には相乗平均をとる際、０回の単名詞を扱う関係から１を加算した値の
        相乗平均を用いる）

        前述のとおり、Calc_Impは子クラスでメソッド get_noun_frq をオーバーラ
      イドすることで動作する。
        そのメソッド get_noun_frq の入出力仕様は次のとおり。

        引数
            第１引数 ----  オブジェクト
            第２引数以下は任意に定義可能

        戻り値
            次のキーと値からなるハッシュリファレンスを返すこと

            キー  ----  単名詞を半角スペースで区切り表示した複合語
                      （例　"航空 工業 デザイン"）

            値    ----  文中のキー（複合語）の出現回数

          なお、キーの上限サイズは１Ｋバイトとし、それ以上の場合は異常とみ
        なし、無視するようにした。

          また、日本語や中国語のように単名詞が１字空けで表記されない言語
        （膠着言語や孤立語）の場合には、get_noun_frq内で次のメソッドを実行
        すること。これにより、アルファベット以外の単名詞は１字空けなしで結
        果出力される。
        (Calc_Imp.pm ver.2.00 から膠着言語の明示的な設定が必要になった）

             $obj->IsAgglutinativeLang;                    ($objはオブジェクト)

          また、次のメソッドを使い重要度計算を行わない語（"of"のように他の語と
        多数の組み合わせができてしまう語）を登録することもできる。
             $obj->IgnoreWords('単語Ａ', '単語Ｂ' ...);  ($objはオブジェクト)

          (Calc_Imp.pm の ver.1.xx では配列 @TermExtract::Calc_Imp::IgnoreWords
           で指定していたが、ver.2.00 から上記の方式に変更）

          １バイトの数値は重要度計算の対象から外した（単位を示す語の重要度が高
        くなりすぎることを防ぐため）。
          １バイト数値と、$obj->IgnoreWords の語が単語で現れた場合は、連接統計
        情報を常に１とするが、用語の抽出は行う。

# INSTALL

        このモジュールを「学習機能」とDF(Document Frequency)を用いた重要度
      計算をサポートしている。その学習用には学習用のDBファイルが必要である。
        DBファイルは、Perlの DB_File モジュール（バークレーDB）の使用を推奨
      している。もし、DB_Fileが使えない場合は、SDBM_File を使うよう設定
      ($obj->use_SDBM) できるが、単名詞の連接統計DB（学習機能用DB）の文字コ
      ード順表示、前方一致検索の機能は使えない。
        バージョン 5 のPerl（JPerlを含む)で動作する。

# METHODS

        以下のメソッドが使用可能である

## new

        コンストラクタ・メソッド。
        新たに ExTerm::Calc_Imp （か、その派生クラス）のオブジェクトを作成し
      、そのオブジェクトを返す。

        usage :

            $obj = TermExtract::AnyClass->new;

                ※ TermExtract::AnyClassは派生クラス

## get_imp_word

        専門用語の重要度を計算し、専門用語と重要度（数値）の２要素からなる
      配列を重要度の高い順に返す。
      （パラメータ省略時は、前回の入力を使う、重要度の計算モードはそのつど
      セット可能）

        usage :

            @result = $obj->get_imp_word(Parameter_1, Parameter_2, ... Parameter_N);
            foreach (@result) {
                print $_->[0], "\t";    # 専門用語
                print $_->[1], "\n":    # 専門用語の重要度
            }

## use_total

        重要度計算において、連接語の重みを、連接した単語の延べ数で計算する。
    　  例えば、統計データで、「情報」という語が「科学」の前に２回、「技術」
      の前に３回連接したとすると。連接語の重みは次のとおり計算される。

        ５回　 （「科学」２回　＋　「技術」３回）

          ＊正確には相乗平均をとる際、０回の単名詞を扱う関係から１を加算した
            値を用いる

        usage :

            $obj->use_total;

## use_uniq

        重要度計算において、複合語の重みを、単語の種類数でとるモードにする。
    　  例えば、統計データで、「情報」という語が「科学」の前に２回、「技術」
      の前に３回連接したとすると。複合語の重みは次のとおり計算される。

        ２回　 （「科学」　＋　「技術」の２種）

          ＊正確には相乗平均をとる際、０回の単名詞を扱う関係から１を加算した
            値を用いる

        usage :

            $obj->use_uniq;

## use_Perplexity

        重要度計算において、複合語の重みを、パープレキシティでとるモードにする。
        なお、現在の仕様では、「学習機能」と組み合わせて使うことはできない。現在
      パープレキシティによる重要度計算は、「学習機能」をサポートしていない。その
      ため、自動的に「学習機能」を使わない重要度計算が行われる。
      　パープレキシティは情報理論で使われる指標で、このシステムの場合は各単名詞
      に「情報理論的に見ていくつの単名詞が連接可能か」を示している。これは、以下
      のようにして求まる単名詞のエントロピーを元に、２のべき乗することで求められ
      る。
        連接する語のそれぞれの出現確率をP1～Pnとおくと、エントロピーの計算は次の
    　ように示せる。なお対数の底は２である。

        (-1 * P1 * log(P1)) + (-1 * P2 * log(P2)) ....... + (-1 * Pn * log(Pn))

        例えば、統計データで、「情報」という語が「科学」の前に２回、「技術」の
      前に３回連接（あわせると計５回連接）したとすると。単名詞のエントロピーは
      次のとおりになる。出現確率は「科学」が 2/5, 「技術」が 3/5 である。

         (-2/5 * log(2/5)) + (-3/5 * log(3/5))

        パープレキシティそのもの計算は計算機に負荷がかかるため、重要度の比較に支
      障がないレベルで計算を抑える。これは、パープレキシティの値ではなく、２を底
      にしたパープレキシティの対数を出すことで実現できる（対数でも重要度の順序に
      は影響しない）。
        重要度を２を底にした対数で出すことにより、「相乗平均」と「出現頻度の掛け
      合わせ」は次の計算になる。
        複合語内の相乗平均 ---  各単名詞のエントロピーの合計 / (単名詞数 x 2）
        出現頻度　------------  出現頻度の対数（底は2)を加算

        なお、対数の計算では 0log(0) → 0 とした。この際に log(1) → 0 と差が出なく
      なるため、log(n) の計算を log(n+1) とすることでスムージングを行った。

        usage :

            $obj->use_Perplexity;

## no_LR

        重要度計算において、複合語の重みを使わないモードにする。頻度の情報
      (Frequency, TF)やIDF(Inverted Ducoment Frequency) のみ有効になる。

        usage :

            $obj->no_LR;

## use_freq

        重要度を用語の出現頻度でとるモードにする。Frequency による重要度計算モード。

## use_TF

        重要度を用語の出現頻度でとるモードにする。ただし、用語が他の用語の一部と
      して現れた場合もカウントする。Term Frequency (TF)による重要度計算モード。

        usage :

            $obj->use_TF;

## with_idf

        他の重要度計算結果に対し、IDF (Inverted Document Frequency) にて補正する。
      事前に $obj->use_storage_df; にて、対象ドキュメントのDF(Document Frequency)
      の統計をとっておく必要がある。
            IDFの計算は、log (総文献数　/ 該当の用語を含む文献数)+1　にて行う。

        usage :

            $obj->with_idf;

## use_frq

        重要度計算において、ドキュメント中の専門用語の出現頻度を掛けるモード
      にする。
        デフォルトはこのモード。

        usage :

            $obj->use_frq;

## no_frq

        重要度計算において、複合語の連接情報のみで計算する（ドキュメント中の
      専門用度の出現頻度を考慮しない）モードにする。

        usage :

            $obj->no_frq;

## use_stat

        重要度計算において、学習機能（単名詞ごとの連接統計DBの情報）を使うモ
      ードにする。
        重要度計算において、単名詞の連接情報は、元となるデータが多いほど正確
      な統計データが得られると推測される。この学習機能は、いままでに処理対象
      としたテキストから単名詞の連接情報を蓄積し、重要度計算で用いるものであ
      る。
         ただし、PerlのDBMが使えない環境では、自動的に学習機能がOFFになる。
        $obj->use_storage （新規ドキュメントの単名詞の連接情報DBへの追加）と
      合わせて使用する。

        usage :

            $obj->use_stat;

        sample :

            $obj->use_stat;
            $bbj->use_storage;
            $obj->get_imp_word();

## no_stat

        重要度計算において、ドキュメント中の情報のみ使用（学習機能を使わない
      ）モードにする。use_stat メソッドの項を参照。学習機能用データベースの
      蓄積をとめる場合は、$obj->no_storage; を使用する。
        デフォルトはこのモード(ver 4.02 より)。

        usage :

            $obj->no_stat;

        sample :

            $obj->no_stat;
            $bbj->no_storage;
            $obj->get_imp_word();

## agverage_rate

        重要度計算で、「ドキュメント中の用語の頻度」と「単名詞の連接回数の相
      乗平均」のバランスを調整するためのメソッド。
        重要度計算でドキュメントの中の頻度を使用するモード（デフォルト）にし
      たときのみ、動作する。
        デフォルトの値は１。数値以外と 0 は受け付けない。

        値を大きくとる　→　ドキュメント中の用語の頻度の比重が高まる
        値を小さくとる  →　単名詞の連接回数の重要度の比重が高まる

        usage :

            $obj->average_rate($Any_numeric_value);

## reset_get_word

        "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();

## result_filter

        "get_imp_word"の戻り値（配列）同士の掛け合わせを行う。
        戻り値は get_imp_word の戻り値と同じ形式の配列になる。
        メッソッドのパラメータ指定法は次のとおり。

          第１引数   -----   専門用語リストＡ
          第２引数   -----   専門用語リストＢ
          第３引数   -----   専門用語リストＡ の上位何件まで使用するか指定
          第４引数   -----   専門用語リストＢ の上位何件まで使用するか指定

            ※　第３引数と第４引数は省略可。省略した場合は、それぞれ
              "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);

## stat_db

        単名詞ごとの連接情報を蓄積するDBファイル名を指定する。
        デフォルトは stat.db
        引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。

        usage :

            $obj->stat_db("AnyFileName");

## comb_db

        ２語の単名詞の組とその出現頻度（延べ数と異なり数）を蓄積するDBファイ
      ル名を指定する。
        デフォルトは comb.db
        引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。

        usage :

            $obj->comb_db("AnyFileName");

## comb_r_db

        ２語の単名詞の組とその頻度を蓄積したDBファイルから、２語の単名詞の組
      の前後を逆にしたDBを作成する際の、ファイル名を指定する。
        単名詞の統計情報を解析するためだけに使用するので、必須の設定ではない
      。このDBはメソッド make_comb_rev を使うことで初めて作成される。
        デフォルトは comb_r.db
        引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。

        usege :

            $obj->comb_r_db("AnyFileName");

## df_db

        DF(Document Frequency)用のDBファイル名を指定する。
        デフォルトはdf.db
        引数なしで呼び出した場合は、現在設定されているDBファイル名を返す。

        usage :

            $obj->df_db("AnyFileName");

## use_storage

        単名詞の連接情報DBへデータ蓄積を行うモードにする。

        usage :

            $obj->use_storage;

        sample :

            $obj->use_stat;
            $bbj->use_storage;
            $obj->get_imp_word();

## no_storage

        単名詞の連接統計DBへのデータ蓄積を行わないモードにする。デフォルト
      はこのモード。
        重要度計算で、学習機能を使うときは、このモードにしないほうが無難。
        処理対象にDBに登録されていない語が含まれていると正しく動作しない。

        usage :

            $obj->no_storage;

        sample :

            $obj->no_stat;
            $bbj->no_storage;
            $obj->get_imp_word();

## use_storage_df

        DF(Document Frequency)用のDBへデータ蓄積を行うモードにする。この
      モードの間は、データの蓄積のみで重要度計算は行わない。

        usage :

            $obj->use_df_storage_df;

## no_storage_df

        単名詞の連接統計DBへのデータ蓄積を行わないモードにする。デフォルト
      はこのモード。
        usage :

            $obj->no_df_storage_df;

## use_SDBM

        単名詞の連接統計DBのデフォルトはBerkeley DBだが、これをSDBMに変更
      する。
        (Berkeley DBは環境によっては使えないが、SDBM は常に使用可能)

        usage :

            $obj->use_SDBM;

## lock_dir

        このモジュールでは、統計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");

## lock_db

        統計DBをロックする（ロック用ディレクトリを作成）。
        既にDBがロックされている場合は、1システム秒おきに5回までロックを試み
      る。それでも、ロックされたままの場合は、戻り値として 0 を返す。
    　　ロックに成功した場合は、戻り値として 1 を返す。
        なお、このメソッドはメソッド lock_dir で値がセットされた場合のみ動作
      する。

        usage :

            $obj->lock_db;

## unlock_db

        統計DBのロックを解除する（ロック用ディレクトリの削除）。

        usage :

            $obj->unlock_db;

## db_locked

        統計DBをロックしたかどうかを返す。
        ロックしているなら真(1)を返す

        usage :

            $obj->db_locked;

## dump_stat_db

        単名詞の連接統計DBの内容を標準出力に出す。
          １）引数なしの場合、全件出力する
          ２）第１引数ありの場合、その引数の前方一致データを出力する
          ３）第２引数が真の場合、第１引数の完全一致データを出力する
        なお、出力フォーマットは次のとおり。

            単名詞[タブ]数値１[空白]数値２[空白]数値３[空白]数値４

              数値１ -- 単名詞の前にいくつの語をとるか（異なり数）
              数値２ -- 　　　　　　〃　　　　　　　　（延べ数）
              数値３ -- 単名詞の後にいくつの語をとるか（異なり数）
              数値４ -- 　　　　　　〃　　　　　　　　（延べ数）

        usage :

            $obj->dump_stat_db($Any_key_word);

## dump_comb_db

        既出の連接語とその頻度をおさめるDBの内容を表示する。
          １）引数なしの場合、全件出力する
          ２）第１引数ありの場合、その引数の前方一致データを出力する
          ３）第２引数が真の場合、第１引数の完全一致データを出力する
        なお、出力フォーマットは次のとおり。

            単名詞１[空白]単名詞２[タブ]単名詞の組み合わせの延べ数

        usage :

            $obj->dump_comb_db($Any_key_word);

## dump_comb_r_db

        既出の２語の単名詞の組とその出現頻度をおさめるDB（逆順）の内容
      を表示する。
          １）引数なしの場合、全件出力する
          ２）第１引数ありの場合、その引数の前方一致データを出力する
          ３）第２引数が真の場合、第１引数の完全一致データを出力する
        なお、出力フォーマットは次のとおり。

            単名詞１[空白]単名詞２[タブ]単名詞の組み合わせの延べ数

        usage :

            $obj->dump_comb_r_db($Any_key_word);

## make_comb_rev

        既出の２語の単名詞の組とその出現頻度をおさめるDB（逆順）を作成（もし
      くは更新）する。
        重要度計算では使用しないが、ある単名詞の前にどの単名詞が結びつきうる
      かの統計情報を得ることができる。

        usage :

            $obj->make_comb_rev;

## dump_df_db

        DF(Document Frequency)用の統計データの内容を表示する。

            単名詞１[空白]単名詞２[空白] ....[タブ]用語を含むドキュメント数

            [空白]の場合は、いままで読み込んだ総ドキュメント数

        usage :

            $obj->dump_df_db($Any_key_word);

## clear_db

        単名詞の連接統計DBと、既出の２語の単名詞の組とその出現頻度をおさめる
      DBの内容をクリアする。

        usage :

            $obj->clear_db;

## clear_df_db

        DF(Document Frequency)用統計DBの内容をクリアする。

        usage :

            $obj->clear_df_db;

## IgnoreWords

          重要度が低いにもかかわらず、単語の連接で頻出する語（例えば、英語の
       ofなど）を重要度の計算対象外にする。
         ユーザプログラムではなく、派生クラスでの使用のために用意した。
         (BrillsTagger.pm, EnglishPlainText.pm などで使用している）

        usage :

            $obj->IgnoreWords('単語A', '単語B', ...);

          引数を与えないと、現在の設定値（配列）を返す。

## IsAgglutinativeLang

        言語を膠着言語や孤立語（日本語や中国語などの文字空けで単語区切されない
      言語）に設定する。ユーザプログラムではなく、派生クラスでの使用のために用
      意した。
        Calc_Imp.pm の ver 2.00 以降では、処理対象言語が膠着言語か孤立語の場合、
      このメソッドの使用が必要。(Chasen.pm, ICTCLAS.pm などで使用している）
        このメソッドを使用しないと、入力を屈折語（デフォルト）として扱い
      、単名詞を半角スペースで区切った形での出力になる。

        usage :

            $obj->IsAgglutinativeLang;

## NotAgglutinativeLang

        言語を屈折語（英語など文字空けで単語が区切られている言語）に設定
      する。ユーザプログラムではなく、派生クラスでの使用のために用意した。
        デフォルトは非膠着言語のため、通常は使用する必要はない。

        usage :

            $obj->NotAgglutinativeLang;

# SEE ALSO

        TermExtract::Chasen
        TermExtract::MeCab
        TermExtract::BrillsTagger
        TermExtract::EnglishPlainText
        TermExtract::ChainesPlainTextUC
        TermExtract::ChainesPlainTextGB
        TermExtract::ICTCLAS
        TermExtract::JapanesePlainTextEUC
        TermExtract::JapanesePlainTextSJIS

# COPYRIGHT

          このプログラムは、東京大学・中川裕志教授、横浜国立大学・森辰則助教
        授が作成した「専門用語自動抽出システム」のExtract.pm  を参考に、中川
        教授の教示を受け、１からコーディングし直したものである。
          この作業は、東京大学・前田朗(maeda@lib.u-tokyo.ac.jp)が行った。
          その際のコンセプトは次のとおり。

          １．形態素解析データの取り込みも含めてモジュール化し、他のプログラ
            ムへの組み込みができること

          ２．学習機能（連接語統計情報のDBへの蓄積とその活用）を持つこと

          ３．重要度計算方法の切り替えができること

          ４．日本語パッチを当てたPerl (Jperl) だけではなく、オリジナルの
            Perlで動作すること

          ５．信頼性の確保のためPerlのstrictモジュール及びperlの-wオプション
            に対応すること

          ６．「窓関数」による、不要語の削除ルーチンをとりはずすこと

          ７．単名詞の連接回数の相乗平均を正しくとること。Extract.pmは連接回
            数の２乗を重要度としていた。
              なお、この設定はパタメータにより調整できる。Extract.pmと同じに
            するには、$obj->average_rate(0.5) とする

          ８．数値と任意の語を重要度計算の対象からはずせるようにすること

          ９．多言語に対応するため、Unicode(UTF-8)で動作すること

          １０．パープレキシティを元に重要度計算を行えるようにすること。

          １１．Frequency, TF, TF*IDFなどの重要度計算機能を持つこと

          Extract.pm の作者は次のとおり。

            Keisuke Uchima
            Hirokazu Ohata
            Hiroaki  Yumoto (Email:hir@forest.dnj.ynu.ac.jp)

            なお、本プログラムの使用において生じたいかなる結果に関しても当方
          では一切責任を負わない。