TermExtract::Chasen -- 専門用語抽出モジュール(「茶筅」版)
use TermExtract::Chasen;
入力テキストを、「茶筅」(奈良先端大学で作成している日本語形態素解析 プログラム)にかけ、その結果をもとに入力テキストから専門用語を抽出する プログラム。 なお、「茶筅」の出力はデフォルトのフォーマット指定(レコードの第一フ ィールドが「単語、第4フィールドが「品詞」)を前提としている。 使用法については、親クラス(TermExtract::Calc_Imp)か、以下のサンプル スクリプトを参照のこと。
#!/usr/local/bin/perl -w # # ex_chasen.pl # # ファイルから「茶筅」の形態素解析済みのデータを読み取り # 標準出力に専門用語とその重要度を返すプログラム # # version 0.32 # # maeda@lib.u-tokyo.ac.jp use TermExtract::Chasen; #use strict; my $data = new TermExtract::Chasen; my $InputFile = "chasen_out.txt"; # 入力ファイル指定 # プロセスの異常終了時処理 # (ロックディレクトリを使用した場合のみ) $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'sigexit'; # 出力モードを指定 # 1 → 専門用語+重要度、2 → 専門用語のみ # 3 → カンマ区切り my $output_mode = 1; # # 重要度計算で、連接語の"延べ数"、"異なり数"、"パープレキシティ"のい # ずれをとるか選択。パープレキシティは「学習機能」を使えない # また、"連接語の情報を使わない"選択もあり、この場合は用語出現回数 # (と設定されていればIDFの組み合わせ)で重要度計算を行う # (デフォルトは"延べ数"をとる $obj->use_total) # #$data->use_total; # 延べ数をとる #$data->use_uniq; # 異なり数をとる #$data->use_Perplexity; # パープレキシティをとる(TermExtract 3.04 以上) #$data->no_LR; # 隣接情報を使わない (TermExtract 4.02 以上) # # 重要度計算で、連接情報に掛け合わせる用語出現頻度情報を選択する # $data->no_LR; との組み合わせで用語出現頻度のみの重要度も算出可能 # (デフォルトは "Frequency" $data->use_frq) # TFはある用語が他の用語の一部に使われていた場合にもカウント # Frequency は用語が他の用語の一部に使われていた場合にカウントしない # #$data->use_TF; # TF (Term Frequency) (TermExtract 4.02 以上) #$data->use_frq; # Frequencyによる用語頻度 #$data->no_frq; # 頻度情報を使わない # # 重要度計算で、学習機能を使うかどうか選択 # (デフォルトは、使用しない $obj->no_stat) # #$data->use_stat; # 学習機能を使う #$data->no_stat; # 学習機能を使わない # # 重要度計算で、「ドキュメント中の用語の頻度」と「連接語の重要度」 # のどちらに比重をおくかを設定する。 # デフォルト値は1 # 値が大きいほど「ドキュメント中の用語の頻度」の比重が高まる # #$data->average_rate(0.5); # # 学習機能用DBにデータを蓄積するかどうか選択 # 重要度計算で、学習機能を使うときは、セットしておいたほうが # 無難。処理対象に学習機能用DBに登録されていない語が含まれる # と正しく動作しない。 # (デフォルトは、蓄積しない $obj->no_storage) # #$data->use_storage; # 蓄積する #$data->no_storage; # 蓄積しない # # 学習機能用DBに使用するDBMをSDBM_Fileに指定 # (デフォルトは、DB_FileのBTREEモード) # #$data->use_SDBM; # 過去のドキュメントの累積統計を使う場合のデータベースの # ファイル名をセット # (デフォルトは "stat.db"と"comb.db") # #$data->stat_db("stat.db"); #$data->comb_db("comb.db"); # # データベースの排他ロックのための一時ディレクトリを指定 # ディレクトリ名が空文字列(デフォルト)の場合はロックしない # #$data->lock_dir("lock_dir"); # # 形態素解析済みのテキストから、データを読み込み # 専門用語リストを配列に返す # (累積統計DB使用、ドキュメント中の頻度使用にセット) # #my @noun_list = $data->get_imp_word($str, 'var'); # 入力が変数 my @noun_list = $data->get_imp_word($InputFile); # 入力がファイル # # 前回読み込んだ形態素解析済みテキストファイルを元に # モードを変えて、専門用語リストを配列に返す #$data->use_stat->no_frq; #my @noun_list2 = $data->get_imp_word(); # また、その結果を別のモードによる結果と掛け合わせる #@noun_list = $data->result_filter (\@noun_list, \@noun_list2, 30, 1000); # # 専門用語リストと計算した重要度を標準出力に出す # foreach (@noun_list) { # 日付・時刻は表示しない next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/; # 数値のみは表示しない next if $_->[0] =~ /^\d+$/; # 結果表示($output_modeに応じて、出力様式を変更 printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1; printf "%s\n", $_->[0] if $output_mode == 2; printf "%s,", $_->[0] if $output_mode == 3; } # プロセスの異常終了時にDBのロックを解除 # (ロックディレクトリを使用した場合のみ) sub sigexit { $data->unlock_db; }
このモジュールでは、get_imp_word のみ実装し、それ以外のメソッドは親 モジュール TermExtract::Calc_Imp で実装されている。 get_imp_word は形態素解析を行い抽出された単語を、個々の単語の語順と 品詞情報を元に複合語に生成している。それ以外のメソッドについては、 TermExtract::Calc_Imp のPODドキュメントを参照すること。
形態素解析の結果抽出された単語を次のルールにより複合語に生成する。第 1引数は、処理対象のデータ、第2引数は第1引数の種別である。デフォルト では、第1引数は、形態素解析済みのテキストファイルとなる。第2引数に文 字列 'var'がセットされたときには、第一引数を形態素解析済のテキストデー タが入ったスカラー変数と解釈する。
1.次の品詞をもつ単名詞が連続で現れたときは結合する ・名詞 一般 ・名詞 サ変接続 ・名詞 接尾 一般 ・名詞 接尾 サ変接続 ・名詞 固有名詞 ・未知語 ・記号 アルファベット
*「未知語」の場合、「茶筅」のバージョン2.3.3では . (ピリオド )や - (ハイフン)などでも語が分割される。そこで、ASCIIの記号 があらわれたときは、前後の語を結合して処理するようにしている。 ただし、次の記号は除く。 ()[]<>|"';,
*「茶筅」のバージョン2.3.3では、ほとんどの英文が「未知語」では なく「記号-アルファベット」として一字単位で扱われる。そのため、 「記号-アルファベット」は可能な限り連結して1語として扱うよう にした。しかし、複数単語が区切りなしで扱われてしまうので了解い ただきたい。旧バージョンの「茶筅」や「和布蕪」ではこの不具合は 起こらない。
2.次の品詞をもつ単名詞が現れたときは、次に続く語が上記1の名詞かど うか判定し、異なるときは複合語として扱わない
・名詞 形容動詞語幹 ・名詞 ナイ形容詞語幹
3.次の品詞をもつ単名詞が現れたときは、次に続く語が上記1の名詞かど うか判定し、異なるときは複合語として扱わない。また、複合語の先頭に きた場合は廃棄する。
・名詞 接尾 形容動詞語幹
4.品詞が動詞の場合は、複合語を廃棄する
5.次の1文字の「未知語」は語の区切りとする。また、「未知語」が , で終わるときにも語の区切りとする。
!"#$%&'()*+,-./{|}:;<>[]
6.複合語をなす語頭の単名詞が「本」の場合は、「本」のみ削除する。
7.複合語をなす単名詞のうち、末尾が次の語の場合は、その末尾のみ削除 する。また末尾が空白の場合も削除する。
"など", "ら", "上", "内", "型", "間", "中", "毎" ,"等"
TermExtract::Calc_Imp TermExtract::MeCab TermExtract::BrillsTagger TermExtract::EnglishPlainText TermExtract::ChainesPlainTextUC TermExtract::ChainesPlainTextGB TermExtract::ICTCLAS TermExtract::JapanesePlainTextEUC TermExtract::JapanesePlainTextSJIS
このプログラムは、東京大学・中川裕志教授、横浜国立大学・森辰則助教授 が作成した「専門用語自動抽出システム」のtermex.pl を参考にコードを全面 的に書き直したものである。 この作業は、東京大学・前田朗 (maeda@lib.u-tokyo.ac.jp)が行った。
相違点は次のとおり。
1.独立したスクリプトからモジュールへ書き換え、他のプログラムからの 組み込みを可能とした。
2.形態素解析済みのテキストファイルだけではなく、変数からも入力可能 にした。これによりUNIX環境での Text::Chasen モジュール等にも対応が 可能になった。
3.オリジナルPerl対応にした。Shift-JISとEUCによる日本語入力を日本語 対応パッチを当てたPerl(Jperl)を使わずとも処理可能になった。
4.常に固有名詞を候補語とし、1文字語も候補語とするようパラメータを 固定した
5.次の1文字の「未知語」は語の区切りとして認識するようにした。また 、「未知語」が , で終わるときにも語の区切りとした。
!"#$%&'()*+,-./{|}:;<>[]
6.複数の「未知語」から単名詞を生成するロジックを組み込んだ。 (「茶筅」ver 2.3.3等の新しいバージョンへの対応)
7.複数の「記号-アルファベット」から英単語を生成するロジックを組み込んだ。 (「茶筅」ver 2.3.3等の新しいバージョンへの対応)
8.信頼性の確保のため、Perlの"strict"モジュール及びperlの-wオプショ ンへの対応を行った。
なお、本プログラムの使用において生じたいかなる結果に関しても当方では 一切責任を負わない。