Perl を利用したコーパス処理の自動化


2004.3.28 電子辞書研究会 第1回大会
清水伸一(安城学園高等学校)
Download Scripts



1. Perl モジュールについて
 Perl には、スクリプトから呼び出して使えるモジュールがあります。CPAN(Comprehensive Perl Archive Network:http://www.perl.com/CPAN/)とそのミラーサイトに、無償で使える多くのモジュールがリストされています。これらのモジュールは、CPANサイトからダウンロードできます。また、使用法や例などもここで調べることができます。
 Perl モジュールのインストール方法は、CPANのサイトに書いてありますが、例がWindows 95 や古い Mac OS になっているなど、現状に合わないようです。現在、 Windows 用 ActivePerl には、ppmというDOSベースで動くモジュールインストール用のプログラムがありますので、通常はそれを使用します。インターネットに接続できる環境でDOS窓(コマンドプロンプト)を開き、以下のように打ち込めばOKです。
ppm install モジュール名

LWPをインストールする場合は、以下のようになります。
ppm install LWP

MacOS X では、ターミナルを呼び出し、以下のコマンドを打ちます。
sudo perl -MCPAN -e 'install モジュール名'

LWPをインストールする場合は、以下のようになります。
sudo perl -MCPAN -e 'install LWP'

また、続けていくつかのモジュールをインストールするには、以下のコマンドを使用します。
sudo perl -MCPAN shell
install モジュール名
...

ただし、MacOSX.2までは、Developer Tools をあらかじめインストールしておく必要があります。MacOSX.3では、Xcodeを事前に組み込む必要があります。どちらも Apple社の Developer Connection (https://connect.apple.com/) で登録後、ダウンロードできます。(無償)



2. CNN Transcripts 自動ダウンロードツール(LWPモジュール使用)
インストール ファイルを所定のフォルダへコピー/保存します。
使用方法 Windows では DOS窓(コマンドプロンプト)を開き、ファイルのあるフォルダへcdで移動後、「perl ツール名」というコマンドを打ちます。または、ファイルをダブルクリックします。MacOS X では、DOS窓の代わりにTerminalを立ち上げ、所定のディレクトリへ移動後、「perl ツール名」というコマンドを打ちます。
使用条件 コンピュータがインターネットに接続されていること、perl がインストールしてあること、LWPモジュールがインストールしてあること

 ここでは、perl モジュール「LWP」を用いた、CNN Transcripts(http://www.cnn.com/TRANSCRIPTS/)自動ダウンロードツールを紹介します。LWP::Simple を使うと、perl スクリプトからHTMLファイルへアクセスできます。基本的なスクリプトは以下の通りです。
use LWP::Simple;

$sc=get 'http://www.cnn.com/TRANSCRIPTS/index.html';

print "$sc\n";

上記スクリプトを実行すると、ターゲットのHTMLファイルの内容を画面に表示します。LWPを使うと、ここまで簡単にHTMLファイルの内容を得ることができます。
 CNNでは、http://www.cnn.com/TRANSCRIPTS/index.html というファイルに、Breaking NewsやLarry King Liveなど、36のサブカテゴリーのリスト一覧のURLが記述されています。そして、それぞれのサブカテゴリーの一覧には、各データの放送日、タイトル、URLが記述されています。ダウンロードツールは、これらの情報をたどって最終目的のファイルを取得し、必要な情報だけをテキストファイルで保存後、次のファイルの取得を行います。この作業を、指定されたファイル分だけ自動で繰り返しますので、ツールを起動後に一定時間経過すれば、全てのファイルをダウンロードできます。

CNN tree
TRANSCRIPTS index
Breaking News index Larry King Live index Insight index ...
bn01 bn02 ... lkl01 lkl02 ... i_ins01 i_ins02 ... ...

 ツールの具体的な機能は以下の通りです。
・TRANSCRIPTS index に記述されているサブカテゴリー一覧へのURL情報を配列に格納
・各サブカテゴリーファイル一覧に記述されている目的ファイルのURL情報を配列に格納
・各サブカテゴリーごとに自動でフォルダを生成し、その中にHTMLデータを整形してテキストファイルで保存
・ファイル情報は<head>タグ内に、テキスト本体は<text>タグ内に記述される。
 ツールのオプションは以下の通りです。
・放送日を指定できる
・サブカテゴリーを選択できる
日付指定オプション機能により、全データをダウンロードしたあとは、その後に更新されたファイルのみを取得できるので、更新する時間が短縮できます。また、サブカテゴリー指定オプションにより、ディベートだけのデータを取得するなど、テーマを絞ってデータ収集することができます。
 注意事項として、ネットワークエラーへの対応がほとんどできていないことがあげられます。ネットワーク上や相手サーバのトラブル等への対策がされていませんので、ご注意下さい。
 オプションの指定方法は、ツールをエディタで開き、「###編集(1)」「###編集(2)」と書いてある行の下のデータを直接書き換えます。ツールそのものを書き換える作業なので、念のため複製で作業して下さい。
 このツールは、CNNに特化した形で書かれていますので、他のサイトへ簡単に流用することはできませんが、プログラム本体を別のサイトに適合させることで、ニュースサイトなどの情報を得ることもできます。また、ターゲットがPDFファイルの場合、「PDF」モジュールを利用することで同様の作業が可能です。
 以下の表は、2/20現在のファイル数と語数です。
category files words
acd 109 906704
asb 629 4975794
bn 4412 5912409
bt 12 36128
cct 187 1420206
cf 1022 5306082
cg 224 1514878
cp 93 607447
cst 3469 2683388
en 157 572619
gc 15 46169
I_c 61 224018
i_dl 121 477067
i_if 94 348850
i_ins 569 2187704
i_qaa 608 1827508
ip 982 7582532
lad 8171 5022007
ldt 175 1455618
le 216 3936693
lkl 1146 9496288
lklw 277 2250152
lol 3777 3333170
lt 8026 6214453
ltm 9810 8238098
nac 125 832571
nfcnn 1132 1200122
pitn 147 778003
pzn 112 919116
rs 233 1013126
sdi 486 618917
se 7029 17456486
sm 3666 3158024
smn 3324 2984543
sun 2205 1586506
tt 128 804776
wbr 939 6147668
total 63888 114075840



3. Lingua::EN::Tagger
 このモジュールは、英語テキストにPenn Treebank Project (http://www.cis.upenn.edu/~treebank/)の品詞タグに基づいて、品詞タグを自動で付けます。Taggerの基本的な使い方は以下の通りです。
use Lingua::EN::Tagger;

$p = new Lingua::EN::Tagger;
$text="
I have to confess right off of the top, I'm not really much of a car enthusiast.";

$tagged_text = $p->add_tags($text);
print "$tagged_text\n";

この結果は、以下のようになります。
<prp>I</prp> <vbp>have</vbp> <to>to</to> <nns>confess</nns> <nn>right</nn> <in>off</in> <in>of</in> <det>the</det> <jj>top</jj> <ppc>,</ppc> <prp>I</prp> <vbp>'m</vbp> <rb>not</rb> <rb>really</rb> <jj>much</jj> <in>of</in> <det>a</det> <nn>car</nn> <nn>enthusiast</nn> <pp>.</pp>

 Taggerは他に、NPや固有名詞を抽出し、リストする機能等があります。



4. Lingua::EN::Fathom
 Fathom は、テキストファイルを語単位で解析し、頻度リストを作成したりリーダビリティを計測するためのモジュールです。ここで用いられるリーダビリティ尺度は、Flesch Reading Ease (flesch)、Gunning's Fog Index (fog)、Flesch-Kincaid Reading Grade Level (kincaid)の3種類です。analyse_file機能を使うと、テキスト情報が簡単に得られます。
use Lingua::EN::Fathom;

$text = new Lingua::EN::Fathom;
$text->analyse_file("
テキスト名");

print($text->report);

この結果は、以下のようになります。

File name: テキスト名
Number of characters: 17148
Number of words: 2842
Percent of complex words: 15.13
Average syllables per word: 1.6288
Number of sentences: 203
Average words per sentence: 14.0000
Number of text lines: 125
Number of blank lines: 0
Number of paragraphs: 1
   
READABILITY INDICES  
   
Fog: 11.6521
Flesch: 54.8300
Flesch-Kincaid: 9.0896

また、以下はFathomを利用して頻度リストを出力する方法です。
use Lingua::EN::Fathom;

$text = new Lingua::EN::Fathom;
$text->analyse_file("
テキスト名");

%words = $text->unique_words;
print "Corpus has ", $text->num_words, " tokens, ", scalar keys(%words), " types.\n";
print "Frequency of each type:\n";
print "\t$_: $words{$_}\n" foreach keys %words;



5. 電子辞書とperl
 Perlに限らず、スクリプトを介して電子辞書との間でデータを受け渡す機能は実現しないでしょう。もしこれが実現すれば、その電子辞書のデータをすべて吸い出すことが可能となるからです。
 ただし、Mac::Glueのようなモジュールを使うことで、スクリプト実行中に電子辞書をスクリプトから呼び出すことは可能です。しかし、このような機能は機種固有で、汎用性には欠けます。
 また、Web上の辞書を使った場合は、スクリプトからデータを取得し、それを加工したり保存することが可能となります。この場合、「LWP::UserAgent」と「HTTP::Request::Common」を用いて、フォームのqueryを記述し、送信するという手順をとります。