More Related Content Similar to CRF を使った Web 本文抽出 (20) More from Shuyo Nakatani (20) CRF を使った Web 本文抽出2. アジェンダ
• 本文抽出について
– Web ページからの本文抽出
– ルールベースでの本文抽出
• 条件付確率場(CRF)について
– 系列ラベリング
– FOBOS による L1 正則化
• CRF を使った本文抽出
7. Web 本文抽出モジュール
(中谷 2007)
• ExtractContent for Ruby
– html から本文抽出を行う Ruby モジュール
• http://rubyforge.org/projects/extractcontent/
• オープンソース(BSD ライセンス)
– ルールベース
• アルゴリズムの概略は次スライド
– Google の「セクションターゲット」を利用し、
主要サイトの本文抽出を高精度で行う
• 本発表とは関係ないので、詳細は省略
• http://labs.cybozu.co.jp/blog/nakatani/2007/09/web_1.html
8. ExtractContent のアルゴリズム概略
• html をブロックに分割
• ブロックごとにスコアを計算
– 句読点が多い
– 非リンクテキストが長い
– 本文っぽくないフレーズが含まれている
• 連続するブロックを「大ブロック」にまとめる
– スコアの高いものをつなげていく
– スコアが低いとつながる確率は減衰していく
• スコアが最大となる「大ブロック」が本文
17. 参考 : CLEANEVAL (2007)
• Webページcleaning(本文抽出)のコンテスト
– http://cleaneval.sigwac.org.uk/
– 英語と中国語の開発用データセット(約60件ずつ)
– 主に「おとなしいデータ」
• 開発データセット120件中、「本文なし」は1件だけ
• ファイルサイズの最大は150KB
– 現実には 1MB 超える html も珍しくない
– 結果
• 中国語は参加1組。精度 18%……
• 英語は9組。精度の最高値は84%
18. 先行研究
• [Marek+ 2007] Web Page Cleaning with
Conditional Random Fields
– CLEANEVALの優勝チーム
• 評価はCLEANEVALの英語データセットのみ
– 今回紹介するのとほぼ同じ手法
• 実装後に発見
• というわけで、本発表に新規性はありません
20. ExtractContent のアルゴリズム(再掲)
• html をブロックに分割
• ブロックごとにスコアを計算
– 句読点が多い
– 非リンクテキストが長い ←特徴量
– 本文っぽくないフレーズが含まれている
• 連続するブロックを「大ブロック」にまとめる
– スコアの高いものをつなげていく
– スコアが低いとつながる確率は減衰 ←転移確率
• スコアが最大となる「大ブロック」が【本文】
↑ラベル
「系列ラベリング」の問題として定式化できる
21. 系列ラベリング
• 系列に対してラベルを付与する
– 観測変数と潜在変数が1対1に対応
• 様々な問題を解くための定式化の一つ
– 形態素解析
• 品詞推定
隠れ変数
• 分かち書き
– 係り受け 代名詞 動詞 不定冠詞 名詞
– 音声認識 I am a pen
– DNA解析
観測変数
22. 隠れマルコフモデル
(Hidden Markov Model, HMM)
• 系列ラベリング手法のための生成モデル
• ベイジアンネットワーク
– 潜在変数は(1次の)マルコフ連鎖をなす
– 観測変数の分布は対応する潜在変数にのみ依存
• 線形オーダーの推論手法がある
– Baum-Welch / Viterbi
• 教師無し ������1 ������2 ������3 ������������
������1 ������2 ������3 ������������
23. HMMの推論と予測
������ ������
������(������, ������) = ������ ������1 ������ ������������ ������������−1 ������(������������ |������������ )
������=2 ������=1
• をもとに、
– ������ ������ Θ = ������ ������(������, ������|Θ) を最大化する Θ と、
– ������(������|������) ∝ ������(������, ������) を最大化する ������ が
• 動的計画法により求められる
������1 ������2 ������3 ������������
������1 ������2 ������3 ������������
24. HMM の問題点 (1)
• 未知の観測値を扱うことが出来ない
– p(X|Y) が値を持たないと計算できない
• Y:潜在変数(ラベル)、X:観測変数
• 自然言語処理の場合、訓練データが全て
の単語を網羅するのは難しい
– 存在しない単語の確率=0
25. HMM の問題点 (2)
• 潜在変数を止めたとき、観測変数間は独
立になる
• 非独立/同時に起きうる特徴量を扱うこと
が難しい
– 「テキストが長い」と「句読点が多い」は同時
に起きやすい
– 「<ul>タグを含む」と「次のブロックが
<li>タグを含む」は非独立
26. HMM の問題点 (3)
• 大域的な「最適性」を得られない可能性
– 分岐の少ない経路が選ばれやすい
• Label bias と Length bias
– 同じラベルを持つ系列の続く確率が指数的に減衰
するため、「長い本文」が選ばれにくい
• 局所的な条件付き確率の積によって尤度を求めるため
[Kudo+ 2004] より
27. 条件付き乱数場
(Conditional Random Fields, CRF)
[Lafferty+ 2001]
• 系列ラベリングのための識別モデル
– マルコフ確率場 / 対数線型モデル
– 形態素解析器 Mecab(Kudo+ 04)で利用
• 線形オーダーの推論手法がある
– Linear-chain CRF の場合
• HMMより最適な系列を得やすい
• 教師有り
28. CRFのモデル
簡便性のために
こちらのモデルで説明
������0 ������1 ������2 ������3 ������������ ������������+1
linear-chain CRF と言えば
������
現在はこちらが主流
29. モデル
• (バイナリ)特徴量
– ������ ������, ������ = (������ ������������−1 , ������������ , ������ ������������ , ������������ )
• 例:������������ = 1 if ������������ が大文字で始まる & ������������ が”名詞”
• 対数線型モデル
– ������ ������ ������; ������ ∝ exp ������ T ������ ������, ������
• ������(������, ������)を経由せず、������(������|������)を直接モデリング
• 目的関数 : 負の対数尤度
– ������ = − ������,������ ∈������ log ������ ������ ������; ������ where T:訓練データ集合
30. 解き方
• (1) 勾配を使ってなにがしかの最適化
������������
=− {������ ������, ������ − ������������′ [������ ������′, ������ ]}
������������
������,������ ∈������
– 準ニュートン法、勾配法
• ������������′ は動的計画法で求められる
• (2) Gibbs サンプリング
– ������(������������ |������−������ , ������; ������) からのサンプリングを繰り返す
• linear-chain でない CRF の場合
• この研究会的にはこっちでしょうけど(苦笑)
31. HMM と CRF の相違点
Hidden Markov Model Conditional Random Fields
ベイジアンネット /生成モデル マルコフ確率場 /識別モデル
教師無し 教師有り
������(������������ |������������ )で記述できる特徴量 特徴量設計の自由度が高い
������(������, ������)から������(������|������)を計算 ������(������|������)を直接計算
ラベリングの計算量はどちらも O(特徴量数×状態数^2×系列長) だが、
CRFは特徴量数が爆発する傾向あり(bigramの特徴量=状態数^2)
[Sutton+ 06]より
33. Linear-chain CRF の Python 実装
• 簡易な実装
– 下図のモデルを採用
– 長距離の特徴量は扱えない
• 実用と言うより勉強用
– numpy / scipy でできる限り処理しているが、遅い
• Python の行列・科学計算ライブラリ
– CRF 処理部は 200行程度なので読みやすい、かも?
• https://github.com/shuyo/iir/blob/master/sequence/crf.py
34. 推論
• 次の2つをサポート
– (1) 準ニュートン法
• BFGS を用いて目的関数を最大化
• scipy.optimize.fmin_bfgs
– (2) 最急降下法 + L1 正則化
• 学習率は手動で調整……
• FOBOS(Duchi+ 09) による L1 正則化
– SGD では特徴量がつぶれにくい
35. L1 正則化
• 目的関数に「ペナルティ項」を付加
L′ = − log ������ ������ ������; ������ + ������ ������ 1
������,������ ∈������
– 過学習を抑える
– 効果の小さいパラメータを0に落とす
• 推論と同時に特徴選択できる
• 特徴を手当たり次第つぎ込める CRF と相性がよい
• ������ ������ 1 は微分不可なため、一般には扱いにくい
– FOBOS(Duchi+ 09) はオンライン正則化を容易に実現
37. CRFを使ったWeb本文抽出
(中谷 2010, 2011)
• 系列ラベリングの問題に定式化
– htmlを閉じタグ/<br>で分割、ブロックの系列に
– ブロックの系列に12種類のラベル付けを行う
• start, stop, head, header, menu, title, body, comment, linklist, cm,
form, footer
• CRFが本文抽出タスクに有用かどうかの実験
– ヒューリスティックな工夫はしない
• script/style タグの除去のみ例外として行っている
• Google AdSense Section Targetは無視
• http://github.com/shuyo/iir/blob/master/extractcontent/webextract.py
38. 特徴量
• 特徴量設計(1678個)
– bigram(ラベルの組)
– タグ(a/p/div/...)の有無
– キーワードの有無
• Copyright/会社概要/利用規約など
– 句読点、日付、アフィリエイトリンク
– テキスト長、リンクされているテキスト長
39. データ作成方法
• html ファイルに分類タグを打つ
– 手作りなので、データ数がとても少ない……
– アノテーションの揺れも(多分)少なくない
<img src="/images08/common/icn_bookmark_e.gif" alt="このエントリ
をBuzzurlに登録" title="このエントリをBuzzurlに登録" width="16"
height="16" /></a>
<!-- extractcontent_body --> ← ここから下は [body] 部
</p></div><div class="ThmbSet256"><div class="BodyTxt"><p>
トヨタ自動車が、マツダからハイブリッド車(HV)の技術の供与を……
40. 結果
訓練データ テストデータ
件数 20 5
総系列長 4341 709
BFGS 正解数 3505 400
正解率 80.7% 56.4%
FOBOS L1 正解数 3424 397
(λ=1) 正解率 78.9% 56.0%
有効特徴数 1676 / 1678
FOBOS L1 正解数 3520 401
(λ=10) 正解率 81.1% 56.6%
有効特徴数 1630 / 1678
FOBOS L1 正解数 3488 401
(λ=20) 正解率 80.4% 56.6%
有効特徴数 1323 / 1678
41. 実行例(Yahoo! Sports)
[head] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
[header] <body class="yj950-2"> <div id="wrapper"> <!--- header --->
[header] <div class="yjmth"> <div class="yjmthproplogoarea"><a href=htt
[header] <div class="yjmthloginarea"><strong><a href="https://login.yaho
: ( 29 blocks)
[header] <li title="ニュース" class="active_click"><a href="/news">
[header] <li title="コラム" class="end"><a href="/column/">コラム</
[header] <!---/globalnavi---> <div id="contents-header"> <div id="cat-pa
[title] <!--- body ---> <div id="contents-body"> <span class="yj-guid"
[title] <em>サンケイスポーツ - 2009/7/9 7:52</em> </div>
[body] <!----- article -----> <div class="Article clearfix"> <table
[body] <p> (セ・リーグ、巨人3x-2横浜、11
[body] 一塁ベースを回っても、坂本は下を向いたま 関連記事へのリンクを
: ( 5 blocks) linklist として正しく分類
[body] 「チームにとっても彼にとっても大きな本塁
[body] 現役時代に何度もスランプを味わった原監督
[body] 【関連記事】<br />
[linklist] ・<a href="http://www.sanspo.com/baseball/news/090709/bsa09070
[linklist] ・<a href="http://www.sanspo.com/baseball/news/090709/bsa09070
[linklist] ・<a href="http://www.sanspo.com/baseball/news/090709/bsa09070
: ( 3 blocks)
[linklist] <!-- anemos --> <!-- /anemos --> <div class="Kejiban"> <im
42. 実行例(はてなダイアリー)
[head] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
[header] <body> <div id="simple-header"> <a href="http://www.hatena.
: ( 9 paragraphs)
[header] <p class="sectionheader"><span class="sectioncategory"><a hre
[body] <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Py
[body] <p>でも以下のように書くと、<a class="keyword" hr
[body] <pre class="syntax-highlight"> <span class="synComment"># A, B,
コメントを
: ( 2 paragraphs)
正しく判別
[body] <pre class="syntax-highlight"> labels = ["<span class="syn
[body] <p>そのせいで以下のようなハマりパターンも
[body] <pre class="syntax-highlight"> <span class="synStatement">def</
[comment] <p class="sectionfooter"><a href="/n_shuyo/20100629/python">
[comment] <!-- google_ad_section_end --> </div>
[comment] <form id="comment-form" method="post" action="/n_shuyo/comment
: ( 14 paragraphs)
[comment] <div class="refererlist"> <div class="caption">
[comment] <div class="refererlist"> <div class="caption"><a
[linklist] <ul> <li><a href="http://d.ha
[linklist] <div class="refererlist"> <div class="caption
: ( 121 paragraphs)
43. 実行例(Yahoo! Japan トップ)
[head] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
[menu] <body> <div id="wrapper"> <div id="header"> <div id="masthead"
[menu] <ul id="mhicon"> <li id="mhi1st"><a title="Yahoo! BB" href="r/m
記事見出しや抜粋を
[menu] <li id="mhi2nd"><a title="オークション" href="r/mauc">オ
: ( 30 paragraphs)
linklist として正しく分類
[menu] <li id="clr5"><a href="r/header/color/5/*-http://www.yahoo.co.
[menu] <li id="clr6"><a href="r/header/color/6/*-http://www.yahoo.co.
[menu] <p class="help"><a href="r/mht">ヘルプ</a></p></div> </div> <
[linklist] <hr class="separate"> <div id="contents"> <div id="toptxt"> <u
[linklist] <li id="toptxt2"><a href=s/69879>全国約1000件の花火大莨
[linklist] <li id="toptxt3"><a href=s/69950>新機能は?「ポケモン
: ( 150 paragraphs)
[linklist] <li><a title="Yahoo!ノートパッド" class="second" href="r/p
[body]とラベリングされた
[linklist] <li><a title="Yahoo!ブリーフケース" class="third" href="r
ブロック無し
[linklist] <div id="pbindexbg"><div id="pbindex"> <div id="pbcalendar"><di
[footer] </tr> <tr> <td><a href="f/pbox/clndr/06/27/*-http://calendar.ya
[footer] <td><a href="f/pbox/clndr/06/28/*-http://calendar.yahoo.co.jp/?
[footer] <td><a href="f/pbox/clndr/06/29/*-http://calendar.yahoo.co.jp/?
: ( 101 paragraphs)
[footer] <li><a href="r/fdi">免責事項</a></li></ul>
[footer] <address>Copyright (C) 2010 Yahoo Japan Corporation. All Rights
[footer] </body> <!--http://ard.yahoo.co.jp/SIG=15blcke9p/M=300330001.
44. 実行例(しょこたんブログ)
[head] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
[menu] <body id="mainIndex"> <!--bodyTop--> <ul id="amebaBar"> <li id
[menu] <li><a href="http://pigg.ameba.jp/" title="ピグ">ピグ</a></
[menu] <li class="last"><a href="http://blog.ameba.jp/ucs/entry/srvent
: ( 167 paragraphs)
[menu] <p><a href="http://blog.ameba.jp/reader.do?bnm=nakagawa-shoko">
[menu] <!--//.readerMainLink--> <div class="page articlePaging"> <a ti
手強すなよ……
[menu] <!--TopPagingBottom--> <div class="entry new"> <div class="ent
[cm] <!--//.entry_head--> <h3 class="title"><!-- google_ad_s
[cm] <span class="theme">テーマ:<!-- google_ad_section_s
[cm] <DIV>ぽこ(<●><●>)メポぽん</DIV><DIV>
: ( 33 paragraphs)
[cm] <!--//#footer_ad--></div>
[cm] <!--//#sub_main--> </div><!--//#main--> </div>
[cm] <!--//#subFirstContentsArea--> </div>
[linklist] <!--//#firstContentsArea--> <div id="sub_b"> <!--subBTop--> <!--
[linklist] “中川翔子物語~空色デイズ~”連載中<br
[linklist] 原明日美 (著)<br>
: ( 53 paragraphs)
[linklist] <li><a href="http://ameblo.jp/nakagawa-shoko/theme-10014191488.
45. まとめ
• CRFを使ったWeb本文抽出を実装
– CRFは本文抽出タスクにも有効っぽい?
• というには、まだまだ訓練が足りない……
• L1 の効果を見るには特徴量がまだ少ない
– 長距離の特徴を扱えれば指数的に増やせる
– 有効素性を減らすことは確かにできそう
47. References
• [Lafferty+ 2001] Conditional Random Fields: Probabilistic
Models for Segmenting and Labeling Sequence Data
• [Sutton+ 2006] An Introduction to Conditional Random
Fields for Relational Learning
• [Kudo+ 2004] Conditional Random Fieldsを用いた日本語
形態素解析
• [Duchi+ 2009] Efficient Online and Batch Learning using
Forward Backward Splittin
• [Marek+ 2007] Web Page Cleaning with Conditional
Random Fields