コンテンツ抽出(本文抽出) Perl モジュール ExtractUniqueBlock の配布ページです。追加した方がよい機能、修正した方がよい機能などがありましたら、お気軽にご連絡ください。最終的には CPAN での配布を予定しております。
ダウンロード
- 最新版(0.01)
ExtractUniqueBlock_beta_0.01.zip に含まれるファイルは以下の通りです。
- ExtractUniqueBlock.pm
- コンテンツ抽出(本文抽出) Perl モジュール ExtractUniqueBlock 本体
- asahi_rss.pl
- asahi.com の RSS を取得してコンテンツ抽出(本文抽出)を行うサンプル
- local_directory.pl
- ローカルの HTML 群からコンテンツ抽出(本文抽出)を行うサンプル
更新履歴
- 2009.08.03
- バージョン 0.01 配布開始
ドキュメント目次
NAME
ExtractUniqueBlock - 他のページに出現しない部分(ブロック)を発見することで、コンテンツを抽出する
SYNOPSIS
# 同じディレクトリに ExtractUniqueBlock.pm がある場合 use FindBin; use lib $FindBin::Bin; use ExtractUniqueBlock; use LWP::Simple; my $html_1 = get('http://www.example.com/1.html'); my $html_2 = get('http://www.example.com/2.html'); my $html_3 = get('http://www.example.com/3.html'); my $extractor = ExtractUniqueBlock->new(); $extractor->extract($html_1, $html_2, $html_3); my ($content_1, $content_2, $content_3) = $extractor->text; print $content_1; # $html_1 からコンテンツを抽出した結果 print $content_2; # $html_2 からコンテンツを抽出した結果 print $content_3; # $html_3 からコンテンツを抽出した結果
# 各メソッドをつなげることもできる my ($content_1, $content_2, $content_3) = ExtractUniqueBlock->new()->extract($html_1, $html_2, $html_3)->text;
DESCRIPTION
ExtractUniqueBlock は、他のページに出現しない部分(ブロック)を発見することでコンテンツを抽出するモジュールです。ブロックはブロックレベル要素によく似ていますが、下位ノードにブロックレベル要素が存在しないように分割されたものです。Web上の日本語ニュースサイトを対象にした実験では、約 97% の抽出性能を示しました(SEE ALSO)。メンテナンスフリーで安定した抽出が期待できます。
METHODS
new
$extractor = ExtractUniqueBlock->new('sim_threshold' => 0.85, 'bdf_threshold' => 0, 'utf8_decode' => 1);
ExtractUniqueBlock インスタンスを生成します。以下のオプションを指定することができます。
- sim_threshold (初期値 0.85)
- ブロック一致判断に利用するコサイン類似度の閾値です。閾値は 0 - 1 区間で設定することができ、1に近いほど厳密に一致を判定します。
- コサイン類似度以外の比較関数を検討中のため、このオプションは変更される可能性があります
- bdf_threshold (初期値 0)
- 抽出するブロックが他のページに出現を許す回数です。0の場合は、これまでの説明の通り「他のページに出現しないブロック」を抽出します。2の場合は、他のページに2回までしか出現しないブロックを抽出します。この値を上げることにより、適合率は下がりますが再現率が上がる傾向があります。
- utf8_decode (初期値 1)
- block_id_attribute (初期値 undef)
- デバッグ、実験用。
add_html
$extractor->add_html($html); # 文字コードの指定を行う場合 $extractor->add_html($html, $encoding);
抽出を行う HTML を $html に指定します。$encoding には、与える HTML の文字コードを指定することができます(任意)。ただし、インスタンス生成時に utf8_decode が無効になっている場合は無視されます。また、utf8_decode が有効であるにも関わらず文字コードが指定されていない場合は、内部で HTML の文字コードを自動判定します(html_to_encoding)。
add_file
$extractor->add_file($file); # 文字コードの指定を行う場合 $extractor->add_file($file, $encoding);
add_html によく似ています。add_file では HTML のスカラー変数を指定する替わりに HTML ファイルのパスを指定します。ファイルがオープンできなかった場合は die します。
extract
$extractor->extract(); # HTML を与える場合 $extractor->extract(@htmls);
add_html, add_file で与えられた HTML 群を基にコンテンツ抽出処理を実行します。与えられた HTML 群が大きい場合は、抽出処理に時間がかかる場合があります。HTML の文字コードを指定する必要がない場合 add_html の替わりに extract で HTML を指定することもできます。
例えば、
$extractor->extract($html_1, $html_2, $html_3);
と
$extractor->add_html($html_1); $extractor->add_html($html_2); $extractor->add_html($html_3); $extractor->extract();
と
$extractor->add_html($html_1); $extractor->add_html($html_2); $extractor->extract($html_3);
とでは、いずれも同じ処理が行われます。
text
$extractor->text;
コンテンツ抽出結果のテキスト部分を与えた HTML 順に配列で出力します。各ブロックのテキストを改行で連結するため、ブロックごとのテキストを取得したい場合は list_text を利用してください。 extract が実行されていない場合は undef を返します。
html
$extractor->html;
text によく似ています。コンテンツ部分を HTML で出力したい場合(IMG タグの情報など)は、こちらを利用してください。各ブロックの HTML を改行で連結するため、ブロックごとの HTML を取得したい場合は list_html を利用してください。
list_text, list_html
# ブロックごとのテキストのみを取得 $extractor->list_text; # ブロックごとの HTML を取得 $extractor->list_html;
list_text, list_html は、以下の3階層の配列(最上位以外はリファレンス配列)を出力します。
- 各 HTML のコンテンツ情報
- コンテンツのブロック情報
- ブロックに含まれるノード(HTML, テキスト)
- コンテンツのブロック情報
出力されたデータを利用するサンプルプログラムを以下に示します。
# 各ページ foreach my $content ($extractor->list_text) { # 各ブロック foreach my $block (@{$content}) { # 各ノード foreach my $node (@{$block}) { print $node; # TEXT/HTML が出力される } } }
use Data::Dumper; print Dumper $extractor->list_html;
block_id, list_block_id
デバッグ、実験用。
FUNCTIONS
html_to_encoding
$encoding = ExtractUniqueBlock::html_to_encoding($html);
与えた HTML の文字コードの判定を行います。メタタグの charset, encoding に文字コードが記載されていない場合は、記述内容から Encode::Guess によって判定を行います。判定に失敗した場合は undef を返します。
AUTHOR
Mitsuo Yoshida < ceekz at mibel.cs. > (mibel.cs. 以降は URL を参考にしてください。スパム対策です。)
COPYRIGHT and LICENCE
Copyright (C) 2009 Mitsuo Yoshida. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
SEE ALSO
研究で利用し、学術論文等で引用していただける場合は、下記の文献を引用していただけると幸いです(日本データベース学会論文誌の方のみで十分です)。
- 吉田光男, 山本幹雄. “教師情報を必要としないニュースページ群からのコンテンツ自動抽出”. 日本データベース学会論文誌. June 2009, vol.8, no.1, pp.29-34.
- 吉田光男, 山本幹雄. “教師情報を必要としないWebページ群の主要コンテンツ自動抽出”. 第23回人工知能学会全国大会. 香川, June 17-19, 2009. (ブログに対する抽出実験の結果)