HTML::Feature 3.00 リリースしました
前回のエントリで案内した通り、perlの本文抽出モジュール「HTML::Feature」を全面的に作り直し、リリースしました。すでにCPANにも反映されています。今回の改修で、抽出精度が向上し、且つ全体的にも高速化がなされました。ヤタ!
HTML::Feature - Extract Feature Sentences From HTML Documents
http://search.cpan.org/~miki/HTML-Feature/
以下、簡単に新機能をご紹介します。
エンジンモジュールを直列に並べる
従来からコアとなるエンジンモジュールについては、任意のものに置き換えることができるようになっていました。デザパタでいうと「Strategyパターン」です。
version 3.00 からは、任意の個数のエンジンを好きな順番で直列に並べられるようになりました。
例えば全く異なる抽出方法のエンジンA〜Cを直列に並べることで、「Aで抽出できなければBで、それでもダメならCで」と言った具合に、次々とfallbackされて行くイメージです。もちろん今までと同様に自分でエンジンモジュールを自作して、それをセットすることもできます。
3つのエンジンモジュール
エンジンモジュールは以下の3つを用意しました。
- HTML::Feature::Engine::LDRFullFeed
- wedataのLDRFullFeedを利用してXPathで本文を抽出します。
- 有名どころのブログ網羅されているので、抽出精度は格段に向上します。
- HTML::Feature::Engine::GoogleADSection
- HTML::Feature::Engine::TagStructure
- 今までのどおり、タグの構造から重要部分を推測するアルゴリズです。
- とくに指定しない限り、デフォルトとして動作します。
デフォルトでは今まで通りTagStructureが動作します。
上記のようにLDRFullFeed→GoogleADSection→TagStructureの順番で並べるのが今の時点ではオススメです。
高速化
上記のLDRFullFeedやGoogleADSectionであれば、単純なマッチングによる探索だけなのでとても高速です。
TagStructureはどうしても再起的に推測を繰り返すため、計算コストは多少かかります。
なので「LDRFullFeed,GoogleADSectionを優先で、だめなら最後にTagStructureで」と指定することで、多くの場合は高速化されるはずです。
また内部で使っていた HTML::TreeBuilder を HTML::TreeBuilder::LibXML に置き換えるようにしましたので、その部分でも高速化が期待できます。(一部 HTML::TreeBuilder::XPathも使いますが)
ただし文字コードの判定、デコード部分にData::Decodeの最新版(0.00007_01 developer release)を使っているのですが、これがMooseベースとなっているので、起動コストだけはどうしてもかかってしまいます。
なお「文字コードの判定は自分でやるからその機能はいらないよ」という方はコンストラクタに{ not_decode => 1 }と渡して下さい。
使い方
こんなカンジです。
use strict; use HTML::Feature; use Data::Dumper; my $feature = HTML::Feature->new( engines => [ 'HTML::Feature::Engine::LDRFullFeed', 'HTML::Feature::Engine::GoogleADSection', 'HTML::Feature::Engine::TagStructure', ] ); my $result = $feature->parse($url); print Dumper $result;
なお従来通りparseに渡すのはurl、HTTP::Responseオブジェクト、HTML文字列(のリファレンス)のどれでも構いません。内部でヨキに計らってくれます。
どのエンジンで抽出したのかは$result->{matched_engine}でわかります。
HTML::Featureは意外と使ってくれているユーザが多かったようなので、できるだけ今までのAPIにあわせて作り直したつもりです。が、何か不具合とか挙動的にまずい点などあったら、コメントでもブクマコメントでもメールでもいいので、連絡ください。頑張って直します。
enjoy!!