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

## ダウンロード

最新版（0.01）

ExtractUniqueBlock_beta_0.01.zip

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
SYNOPSIS
DESCRIPTION
METHODS

- new
add_html
add_file
extract
text
html
list_text, list_html
block_id, list_block_id
- FUNCTIONS
- html_to_encoding

AUTHOR
COPYRIGHT and LICENCE
SEE ALSO

## 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）
- 抽出したブロックをフラグ付き UTF-8 で出力するかどうかを指定します。0（無効）の場合は与えられた HTML の文字コードを変更せずに抽出を行います。1（有効）の場合は文字コードをフラグ付き UTF-8 に統一して出力します（入力の文字コードは add_html, add_file で指定できます）。
フラグ無し UTF-8 で出力するオプションを検討中のため、このオプションは変更される可能性があります
- 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. （ブログに対する抽出実験の結果）