はじめに
テキストデータから、専門用語を取り出すためのPerlモジュール"TermExtract"を解説します。
日本語の文章中から単語を切り出す定番のソフトとして、「茶筅」や「案山子」がありますが、そのまま専門用語の抽出に使うには次の2つの問題があります。
ひとつは、複合語に対応していないことです。専門用語の多くは単語を組み合わせて、複雑な概念を表すことが多くなります。特に「茶筅」の場合は単語を品詞単位で細かく分割するため、そのまま使うには難があります。
もうひとつは、どの用語が重要であるか判断する仕組みを持たないことです。
その問題点を解決したソフトに東京大学・中川裕志教授、横浜国立大学・森辰則助教授が作成した「専門用語自動抽出システム」があります。
それは、1)「茶筅」の形態素解析結果を複合語に組み立て、2)その複合語(単語の場合もある)を重要度の高い順に返すものです。
TermExtractは、この「専門用語自動抽出システム」を東京大学情報基盤センター・中川裕志教授の教示を受け、東京大学経済学部・前田朗が全面的に組みなおしたものです。
また、形態素解析によらない、英文及び中文の専門用語自動抽出機能なども追加されています。
実行環境
- Perl
-
TermExtract は バージョン5のPerlで動作します。
- Perl DB_Fileモジュール
-
TermExtract で学習機能を使うには、PerlのDB_File
モジュールの使用を推奨しています。これは標準のPerlモジュールには含まれていません。マシンの環境によっては、別途インストールする必要があります。
もし、DB_Fileが使えない場合は、SDBM_File を使うよう設定できます。専門用語の抽出機能自体は変わりませんが、学習用DBの内容確認で、いくつか使えなくなる機能があります。
- 形態素解析ソフト
-
TermExtractは形態素解析ソフトの処理結果を入力とします。なお、英文に関しては、version 1.35 からストップワード方式も使えるようになっており(EnglishPlainText.pm)
、これを使う場合は形態素解析ソフトは不要です。
組み合わせられる形態素解析ソフトは、現在のところ次のとおりです。
和文
「茶筅」(ver 2.3.3 では英単語が区切りなしで処理されます。 「和布蕪」かver.2.1以前の「茶筅」がお勧めです) 「和布蕪」
英文
"Brill's Tagger
"Monty Tagger"
中文
"ICTCLAS" 他の形態素解析ソフトにもTermExtractの仕様に沿った派生クラスを自作することで対応が容易です。
形態素解析ソフトの入手やインストール手順は上記のリンクからお願いします。
- ファイル及びディレクトリの新規作成権限(「学習機能」使用時)
-
TermExtract はPerlのDB_File
モジュールが使える環境にあれば、学習機能を実
現するためバークレーDB用のファイル(2種)を作成します。バークレーDBの代わりに、SDBMを使う設定もできます。
もし、指定したDBファイルが存在しなければ新規に作成を試みます。デフォルトはプログラムの実行ディレクトリの"stat.db"と"comb.db"です。(SDBMの場合は、"stat.db.dir", "stat.db.pag", "comb.db.dir","comb.db.pag")
ただし、学習機能をまったく使わないのであれば、DBファイルを作成しないこともできます。
また、このモジュールは上記DBの排他制御のための機能を持ちます。ただし、この機能のためマシン上にディレクトリの作成・削除ができる場所を用意する必要が
あります。
オプションでこの排他制御を行わないこともできます。データの保障はされませんが、マシン上に一時ディレクトリを作らずにすみます。
モジュールのインストール
GitHubからモジュールを入手し、解凍・展開します。OSに応じて次のとおりインストールします。
TermExtract (GitHub)
Unix
次のコマンドを順次実行することでインストールします。
perl Makefile.PL
make
su
make install
もし、上記の方法でうまく動作しない場合は、解凍した"TermExtract"フォルダを、Perlのライブラリのパスが通っているディレクトリにフォルダごとコピーしてください。Perlのライブラリの位置は、perl -Vコマンドで確認できます。
Windows (ActivePerl)
展開したフォルダのWindowsサブフォルダにあるアイコン"win_install.pl"をダブルクリックし、実行します。自動的にActivePerlの"site\lib"ディレクトリに必要なファイルが展開されます。
もし、上記の方法でうまく動作しない場合は、Windowsのコマンドプロンプトから"win_install.pl"を実行します。cdコマンドで、win_install.plのあるディレクトリ(フォルダ)まで移動し、perl win_install.plとコマンド入力してください。
使いかた
入力となる形態素解析ソフトによってモジュールを選びます。また、その際の使用法のサンプルを示します。
- 「茶筅」の場合は、TermExtract::Chasen サンプルスクリプト
- 「和布蕪」の場合は、TermExtract::MeCab サンプルスクリプト
- 和文 (EUC) そのものの場合は、TermExtract::JapanesePlainTextEUC サンプルスクリプト
- 和文 (SJIS) そのものの場合は、TermExtract::JapanesePlainTextSJIS サンプルスクリプト
- 英文そのものの場合は、TermExtract::EnglishPlainText サンプルスクリプト
- "Brill's Tagger"、"Monty Tagger" の場合は、TermExtract::BrillsTagger サンプルスクリプト
- 中文 (GBコード) そのものの場合は、TermExtract::ChainesPlainTextGB サンプルスクリプト (GBコード)
- 中文 (UTF-8) そのものの場合は、TermExtract::ChainesPlainTextUC サンプルスクリプト
- ICTCLASの場合は、TermExtract::ICTCLAS サンプルスクリプト (GBコード)
サンプルスクリプトを見ればわかりますが、専門用語の重要度の計算方式で、いくつものオプション指定ができます。
オプションの設定方法は、以下に示す各モジュールのドキュメントをご覧ください。
また、専門用語の重要度の指定をデフォルトによらず、任意に設定するには専門用語重要度計算の理解が必要です。専門用語(キーワード)自動抽出システム”関連文献リストに詳しい説明がありますので、ここでは理論の概要と、補足情報を示します。
なお、以下は日本語の文章の例で示していますが、英文でも同じです。
- 専門用語の生成
- 和文の場合は「茶筅」や「和布蕪」といった形態素解析ソフトを使い、文章を単語に分割します。その際に、分割した単語の品詞情報も合わせて情報として出てきます。
複合語は、語の並びと品詞情報を元に組み立てます。
基本的には名詞が連続で出現した場合、それらを統合し複合語とします。 - 英文については、Bill's POD Tagger やMonty Tagger
といった品詞タグ付けソフトを使い和文と同様の処理を行う方法と、指定したストップワードで文章を複合語に分割する方法の2つを用意しています。ストップワードは、次の文献に書かれていたものを基本としています。
B. Frakes, Ricardo Baeza-Yates. 1992. Information retrieval : data structures & algorithms. Upper. Saddle River, N.J. : Prentice Hall PTR(ISBN 0-13-463837-9) - 重要度計算の仕組み
-
このモジュールでの専門用語は、単語そのものか複数の単語を組み合わせて作られます。この複合語を構成する最小単位の名詞を特に「単名詞」と呼びます。この単名詞が他の単名詞と連結して複合語をなすことが多いほど、重要な概念を示す
と考えます。
簡単な例で、「情報科学技術」を考えます。この語は次のとおり3つの単名詞に分割できます。この際、それぞれの単名詞が他の単名詞とどれだけ結びつくか統計
的に分かっているとします。
単名詞 前の語に連結した回数 後の語に連結した回数
=========================================================
「情報」 1 2
「科学」 2 3
「技術」 1 1
複合語全体の重要度はこれらの6つ(単名詞数x2)の数値の平均から求めます。
「日本語マニュアル文における名詞間の連接情報を用いたハイパーテキストのための索引の抽出」(『情報処理学会論文 第38巻 第10号』 平成9年10月)により、相乗平均がもっともよい結果になることがわかっていますので、平均は相乗平均でとるようにしています。
また、相乗平均をとる際に、連結した回数が0回の単名詞に対応するため、各回数に1を加算した値を用いています。
- ドキュメント中の用語の出現頻度
- 前述した重要度に、ドキュメント中の専門用語の出現頻度を掛けることもできます。これはオプションにより選択できます。デフォルトは、出現頻度を用います。
この計算方式は、異なる2つの要素の掛け合わせとなりますので、重要度中に占める、それぞれの比率が問題となります。デフォルトは、連接回数の相乗平均に、ドキュメント中の用語の頻度を掛けたものです。これを、連接回数の相乗平均のx乗にすることができます(xは任意)。
- 連接の「延べ数」、「異なり数」、「パープレキシティ」
- 単名詞の連接情報は、連接した単語の種類をカウントする方法(異なり数)と、種類にかかわらず出現しただけカウントする方法(延べ数)、そして情報理論的に見た連接回数(パープレキシティ)の3つの方法があります。
例えば、統計データで、「情報」という語が「科学」の前に2回、「技術」の前に3回連接したことが分かっているとします。
この場合連接語の異なり数と延べ数は次のようになります。
異なり数 2回 (「科学」 + 「技術」」で2種)
延べ数 5回 (「科学」2回 + 「技術」3回)
* パープレキシティは、「情報理論的に見ていくつの単名詞が連接可能か」を示します。詳しくは、パープレキシティの仕様の詳細をご参照ください。
これはオプションによって選択できます。デフォルトは「延べ数」を用います。
- 学習機能 (オプション機能)
- 単名詞の連接情報は、元となるデータが多ければ多いほど正確な統計データが得られると推定されます。この学習機能は、いままでに処理対象としたテキストから単名詞の連接情報を蓄積し、重要度計算で用いるものです。ただし、雑多な文献を扱うと、結果として一般すぎる語が上位にきます。分野を特定した上でお使
い下さい。 デフォルトは現在処理対象となっているテキストのみから連接情報を得ます。
これはオプションによって選択できます。デフォルトは学習機能がOFFになっています。次のメソッドを実行することで「学習機能」が有効になります。
$obj->use_storage;
$obj->use_stat;
- その他の重要度計算モード (Frequency, TF, TF*IDF)
- バージョン 4.02 より、連接情報以外の重要度計算手法も実行できるようになりました。
専門用語抽出システムでは用語の文章中の出現頻度をいままでも使ってきました。この用語の出現頻度のカウント方法には、Frequency と TF(Term Frequency) の2つがあります。いままでは、Frequency のみ使ってきました。今回のバージョンから、TF もオプション指定できるようになります。また、用語の連接情報をカットすることで、Frequency, TF のみで重要度計算することも可能です。Frequency と TF の違いは次のとおりです。
- Frequency ------------ 用語が他の用語の一部として使われていた場合にカウントしません
- TF(Term Frequency) --- 用語が他の用語の一部として使われていた場合もカウントします
たとえば、「情報システムと情報」という例でみてみます。この場合、"TermExtract"において、FrequencyとTFは次のようにカウントされます。
- Frequency の場合 --------- 「情報」が1回、「情報システム」が1回
- TF の場合 ---------------- 「情報」が2回、「情報システム」が1回
また、IDF(Inverted Document Frequency) の値も掛け合わせることができます。これには重要度計算の前に、処理対象とする文献群をプログラムに読ませ、DF(Document Frequency) のデータベース作成しておく必要があります。
TFとIDFの組み合わせにより、オーソドックスなTF-IDF法の重要度計算も行えます。その他、(1)連接のカウント法、(2)用語頻度、(3)IDF のそれぞれのパラメータを自在に組み合わせることができます。詳しくは以下をご覧下さい。
(1)連接のカウント法
*1)連接の「延べ数」 ($obj->use_total;)
2)連接の「異なり数」 ($obj->use_uniq;)
3)連接の「パープレキシティ」 ($obj->use_Perplexity;)
4)連接情報を使わない → 用語頻度か用語頻度*IDFのみ ($obj->no_LR;)
(2)用語頻度
*1)Frequency ($obj->use_frq;)
2)TF(Term Frequency) ($obj->use_TF;)
3)頻度情報を使わない ($obj->no_frq;)
(3)IDFの有無(重要度計算前に処理対象文献群のDF(Document Frequency)情報をとる必要あり)
1)IDFを使う ($obj->use_idf;)
*2)IDFを使わない$obj->no_idf;)
# 上記でアスタリスク(*) を付与した項番はデフォルト値です。
TF*IDF はオーソドックスな手法ですが使用法が難しいのでお気をつけください。
まず、TF*IDFの計算式をしめします。
TF*IDF =
用語の出現頻度 * log (総文献数 / 該当の用語を含む文献数)+1
処理は次のステップで行う必要があります。なお、termmi 中に含まれるmi_chasen.pl などのスクリプトも参考になると思います。
(1)処理対象文献ごとに次の処理を実行。DF用のデータベースを作成。
$obj->use_storage_df;
$obj->get_imp_word("File Name");
(2)IDFを有効にして、用語抽出と重要度計算を行う。また用語出現頻度をTF(Term Frequency)でとる。
$obj->use_TF;(3)不要になったDF用のデータベースの内容をクリア
$obj->with_idf;
$obj->get_imp_word("File Name");
$obj->clear_df_db(); - Frequency ------------ 用語が他の用語の一部として使われていた場合にカウントしません
- 結果の掛け合わせ
- 異なる重要度計算方式で求めた結果を掛け合わせる(フィルタリングする)ことができます。例えば、学習機能を使った場合と、そうではない場合の結果を掛け合わせることもできます。
- 単名詞の連接情報の統計
- ある単名詞が、どの単名詞と結びついて複合語をなすことが多いかという情報が、学習機能用データベースには蓄積されます。
それらの情報をデータベースから抽出することもできます。これにより語学研究といった目的での使用もできます。
その際のサンプルスクリプトを次に示します。
- 連接情報統計抽出 サンプルスクリプト
TermExtractの各モジュールの説明(PODをHTML化したもの)
- Calc_Imp.pm の説明(重要度計算のベースモジュール)
- Chasen.pm の説明(「茶筅」用モジュール)
- MeCab.pmの説明(「和布蕪」用モジュール)
- JapanesePlainTextEUC.pm の説明(和文[EUC]用プレーンテキスト用モジュール)
- JapanesePlainTextSJIS.pm の説明(和文[SJIS]用プレーンテキスト用モジュール)
- EnglishPlainText.pm の説明(英文プレーンテキスト用モジュール)
- BrillsTagger.pm の説明("Birll's POS Tagger", "Monty Tagger"用モジュール)
- ChainesPlainTextGB.pm の説明(中文プレーンテキスト、GBコード用モジュール)
- ChainesPlainTextUC.pm の説明(中文プレーンテキスト、UTF-8用モジュール)
- ICTCLAS.pm の説明(ICTCLAS用モジュール)