コンテンツ抽出(本文抽出) Perl モジュール ExtractUniqueBlock の配布ページです。追加した方がよい機能、修正した方がよい機能などがありましたら、お気軽にご連絡ください。最終的には CPAN での配布を予定しております。

ダウンロード

ExtractUniqueBlock_beta_0.01.zip に含まれるファイルは以下の通りです。

更新履歴

ドキュメント目次

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 インスタンスを生成します。以下のオプションを指定することができます。

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階層の配列(最上位以外はリファレンス配列)を出力します。

出力されたデータを利用するサンプルプログラムを以下に示します。

# 各ページ
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 (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

研究で利用し、学術論文等で引用していただける場合は、下記の文献を引用していただけると幸いです(日本データベース学会論文誌の方のみで十分です)。