HTMLからの本文抽出
伊奈 林太郎 (id:tarao)
京都大学 大学院情報学研究科
2009-03-22@Kansai.pm
伊奈 林太郎 (id:tarao) HTML からの本文抽出
自己紹介 — 専門とか
専門 プログラミング言語 (の設計?)
• λ 計算
• 型理論
• 証明支援システム / 定理自動証明
研究 Java に動的型を入れて LLっぽくする
(でも Java 嫌い)
言語 普段よく使うもの
C++ かれこれ 10 年ほど
OCaml 研究室での公用語
Ruby シェルスクリプト代わりに
Perl まだ半年くらい
JavaScript 定理自動証明器を書いたり
TEX このスライドも
伊奈 林太郎 (id:tarao) HTML からの本文抽出
自己紹介 — Perlとの出会い
2001 年 掲示板 CGI を改造するために Perl に触れる
Perl 嫌い病を発症
Perl から逃げまわる日々が続く
伊奈 林太郎 (id:tarao) HTML からの本文抽出
自己紹介 — Perlとの出会い
2001 年 掲示板 CGI を改造するために Perl に触れる
Perl 嫌い病を発症
Perl から逃げまわる日々が続く
2008 年 はてなインターンに参加
Perl オブジェクト指向の正しい作法を学ぶ
Perl 嫌い病が治った勢いで CPAN Author に
伊奈 林太郎 (id:tarao) HTML からの本文抽出
自己紹介 — Perlとの出会い
2001 年 掲示板 CGI を改造するために Perl に触れる
Perl 嫌い病を発症
Perl から逃げまわる日々が続く
2008 年 はてなインターンに参加
Perl オブジェクト指向の正しい作法を学ぶ
Perl 嫌い病が治った勢いで CPAN Author に
2009 年 なぜか Kansai.pm で発表
Perl に詳しい人たちにフルボッコにされる (?)
伊奈 林太郎 (id:tarao) HTML からの本文抽出
トピック
• 背景
• 実演
• アルゴリズム解説
• 発展
伊奈 林太郎 (id:tarao) HTML からの本文抽出
References
Lintaro Ina.
HTML::ExtractContent.
http://search.cpan.org/dist/HTML-ExtractContent/.
Shuyo Nakatani.
ExtractContent.
http://rubyforge.org/projects/extractcontent/.
伊奈 林太郎 (id:tarao) HTML からの本文抽出
トピック
• 背景
• 実演
• アルゴリズム解説
• 発展
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景
どうして本文抽出?
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景 — エントリーページ
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景 — 検索対象
本文を抽出している場合 (Google ブログ検索)
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景 — 検索対象
本文を抽出していない場合 (Technorati ブログ検索)
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景
既存の方法ではダメ?
伊奈 林太郎 (id:tarao) HTML からの本文抽出
背景 — 既存のアプローチ
• HTML::ContentExtractor
• HTML::TreeBuilder を使っているので遅い
• ゴミが多く残る
• HTML::Content::ContentExtractor
• トークンに分解しないといけない
⇒ 日本語には不向き
• Webstemmer
• ニュースサイトに強い
• レイアウトが似た系統でないと抽出できない
⇒ 一般のサイトで十分な性能が出るわけではない
伊奈 林太郎 (id:tarao) HTML からの本文抽出
今回の手法
• 正規表現だけで高速に
• “本文らしさ” をヒューリスティックに判定
伊奈 林太郎 (id:tarao) HTML からの本文抽出
今回の手法
• 正規表現だけで高速に
• “本文らしさ” をヒューリスティックに判定
むずかしい話はあとで
伊奈 林太郎 (id:tarao) HTML からの本文抽出
トピック
• 背景
• 実演
• アルゴリズム解説
• 発展
伊奈 林太郎 (id:tarao) HTML からの本文抽出
実演
使い方
use HTML::ExtractContent;
my $extractor = HTML::ExtractContent->new;
my $content = $extractor->extract($html)->as_text;
# or ->as_html;
デモ
伊奈 林太郎 (id:tarao) HTML からの本文抽出
トピック
• 背景
• 実演
• アルゴリズム解説
• 発展
伊奈 林太郎 (id:tarao) HTML からの本文抽出
アルゴリズム — 基本アイディア
1 明らかに要らないタグは削ぎ落とす
2 HTML を適当なブロック要素ごとに分割
3 分割された各ブロックにスコアをつける
• 本文っぽさでスコア増
• 本文っぽくなさでスコア減
4 つながっているブロックをまとめてクラスタにする
• ブロックのスコアの合計がクラスタのスコア
5 スコアの一番高いクラスタが本文
伊奈 林太郎 (id:tarao) HTML からの本文抽出
アルゴリズム — 本文っぽさ
本文っぽさ
• 句読点がいっぱいあると本文っぽい
• テキストノードの文字列が長いと本文っぽい
本文っぽくなさ
• リンクばっかり並んでるところは本文っぽくない
伊奈 林太郎 (id:tarao) HTML からの本文抽出
アルゴリズム — ブロックのつながり判定
本文が 1 ブロックとは限らないので適度につなげる
• 高スコアのブロックが連続したらクラスタっぽい
• スコアの低いブロックがきたらクラスタの切れ目っぽい
(ただし直前のブロックのスコアの高さにも配慮)
例:
低 A
高 B
高 C
低 D
低 E
高 F
低 G ← 低いけれど F が超高スコアなので切れ目にしない
高 I
⇒ クラスタは {B, C}, {F, G, I}
伊奈 林太郎 (id:tarao) HTML からの本文抽出
アルゴリズム — 傾斜配点
ブログなどで, コメントは本文より低い点にしたい
• 上にある方が本文っぽいということにする
• スコアは下にいくほど減衰
⇒ 下にいくほどクラスタの切れ目と見なされやすい
例:
低 A
高 B
高 C
低 D
低 E
低 F ← 減衰して低スコアに
低 G
低 I ← 減衰して低スコアに
⇒ クラスタは {B, C}
伊奈 林太郎 (id:tarao) HTML からの本文抽出
トピック
• 背景
• 実演
• アルゴリズム解説
• 発展
伊奈 林太郎 (id:tarao) HTML からの本文抽出
発展 — 業務レベルで使うために
• ヒューリスティクスではうまくいかない場合がある
• 他のもっと確実な方法と組み合わせるとよい
• 複数の抽出エンジンを用意する
• Chain of Responsibility
抽出エンジンを順に試して成功したものの結果を返す
ヒューリスティクスに頼るのは最後
• エンジンの追加を簡単にできるようにする
フレームワーク++
伊奈 林太郎 (id:tarao) HTML からの本文抽出
発展 — あると便利な抽出エンジン
• API を使って説明部分を取得
(e.g. ニコニコ動画, YouTube, Amazon)
• 特定サイトに特化してルールベースで抽出
• GoogleAdsense の情報を使う
• フィードを使う
• 複数試して一番良い結果を選択するメタエンジン
伊奈 林太郎 (id:tarao) HTML からの本文抽出
おわり

HTMLからの本文抽出