Top Banner
CRF を使ったWeb本文抽出 2011/7/30 確率の科学研究会 #1 中谷 秀洋@サイボウズ・ラボ
47

CRF を使った Web 本文抽出

Nov 12, 2014

Download

Technology

Shuyo Nakatani

CRF(Conditional Random Fields)を使って html から本文を抽出する実装プロトタイプの紹介です。
http://www.slideshare.net/shuyo/web-using-crf の改訂版です。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CRF を使った Web 本文抽出

CRF を使ったWeb本文抽出

2011/7/30

確率の科学研究会 #1

中谷 秀洋@サイボウズ・ラボ

Page 2: CRF を使った Web 本文抽出

アジェンダ

• 本文抽出について

– Web ページからの本文抽出

– ルールベースでの本文抽出

• 条件付確率場(CRF)について

– 系列ラベリング

– FOBOS による L1 正則化

• CRF を使った本文抽出

Page 3: CRF を使った Web 本文抽出

本文抽出

Page 4: CRF を使った Web 本文抽出

Webページは雑多な情報だらけ

ゲーム

スマホ

PC

生活

映画

Web

経済

livedoor ニュース より

Page 5: CRF を使った Web 本文抽出

「本文」

• さまざまなアプリが「本文」を要求

–分類、読み上げ、検索、携帯向け変換、etc

Page 6: CRF を使った Web 本文抽出

Webページ分類のために 本文抽出を作った

Page 7: CRF を使った Web 本文抽出

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

Page 8: CRF を使った Web 本文抽出

ExtractContent のアルゴリズム概略

• html をブロックに分割

• ブロックごとにスコアを計算

– 句読点が多い

– 非リンクテキストが長い

– 本文っぽくないフレーズが含まれている

• 連続するブロックを「大ブロック」にまとめる

– スコアの高いものをつなげていく

– スコアが低いとつながる確率は減衰していく

• スコアが最大となる「大ブロック」が本文

Page 9: CRF を使った Web 本文抽出

できるだけ長い「本文」を 抽出しようとする

Page 10: CRF を使った Web 本文抽出

問題となるパターン

Page 11: CRF を使った Web 本文抽出

「本文」の切れ目がわかりにくい

毎日 jp より

関係ない話題も 「本文」に入ってしまう

Page 12: CRF を使った Web 本文抽出

一番長いところが本文?

本文より長い

ここも それなり

PC Watch より

本文

Page 13: CRF を使った Web 本文抽出

短い「本文」を見落としがち

livedoor ニュース より

Page 14: CRF を使った Web 本文抽出

もっと短い「本文」

しょこたん ブログ より

Page 15: CRF を使った Web 本文抽出

そもそも「本文」がない場合も

ここを「本文」と してしまう

Yahoo! Japan トップ より

Page 16: CRF を使った Web 本文抽出

その他の課題

• アプリごとに求める「本文」が異なる

– 分類ではコメント不要。全文検索では必要

• パラメータを手動で設定

– 重み、減衰率、閾値など

– 最適なものとは言い難い

• 当時は機械学習をまだ勉強していなかった……

Page 17: CRF を使った Web 本文抽出

参考 : CLEANEVAL (2007)

• Webページcleaning(本文抽出)のコンテスト

– http://cleaneval.sigwac.org.uk/

– 英語と中国語の開発用データセット(約60件ずつ)

– 主に「おとなしいデータ」

• 開発データセット120件中、「本文なし」は1件だけ

• ファイルサイズの最大は150KB

– 現実には 1MB 超える html も珍しくない

– 結果

• 中国語は参加1組。精度 18%……

• 英語は9組。精度の最高値は84%

Page 18: CRF を使った Web 本文抽出

先行研究

• [Marek+ 2007] Web Page Cleaning with

Conditional Random Fields

– CLEANEVALの優勝チーム

• 評価はCLEANEVALの英語データセットのみ

– 今回紹介するのとほぼ同じ手法

• 実装後に発見

• というわけで、本発表に新規性はありません

Page 19: CRF を使った Web 本文抽出

系列ラベリングと CRF

Page 20: CRF を使った Web 本文抽出

ExtractContent のアルゴリズム(再掲)

• html をブロックに分割

• ブロックごとにスコアを計算

– 句読点が多い

– 非リンクテキストが長い ←特徴量

– 本文っぽくないフレーズが含まれている

• 連続するブロックを「大ブロック」にまとめる

– スコアの高いものをつなげていく

– スコアが低いとつながる確率は減衰 ←転移確率

• スコアが最大となる「大ブロック」が【本文】

↑ラベル

「系列ラベリング」の問題として定式化できる

Page 21: CRF を使った Web 本文抽出

系列ラベリング

• 系列に対してラベルを付与する

– 観測変数と潜在変数が1対1に対応

• 様々な問題を解くための定式化の一つ

– 形態素解析

• 品詞推定

• 分かち書き

– 係り受け

– 音声認識

– DNA解析

I am a pen

代名詞 動詞 不定冠詞 名詞

観測変数

隠れ変数

Page 22: CRF を使った Web 本文抽出

隠れマルコフモデル (Hidden Markov Model, HMM)

• 系列ラベリング手法のための生成モデル

• ベイジアンネットワーク

– 潜在変数は(1次の)マルコフ連鎖をなす

– 観測変数の分布は対応する潜在変数にのみ依存

• 線形オーダーの推論手法がある

– Baum-Welch / Viterbi

• 教師無し

𝑥1 𝑥2 𝑥3 𝑥𝑛

𝑦1 𝑦2 𝑦3 𝑦𝑛

Page 23: CRF を使った Web 本文抽出

HMMの推論と予測

𝑝(𝑋, 𝑌) = 𝑝 𝑦1 𝑝 𝑦𝑖 𝑦𝑖−1

𝑛

𝑖=2

𝑝(𝑥𝑖|𝑦𝑖)

𝑛

𝑖=1

• をもとに、

– 𝑝 𝑋 Θ = 𝑝(𝑋, 𝑌|Θ)𝑌 を最大化する Θ と、

– 𝑝(𝑌|𝑋) ∝ 𝑝(𝑋, 𝑌) を最大化する 𝑌 が

• 動的計画法により求められる

𝑥1 𝑥2 𝑥3 𝑥𝑛

𝑦1 𝑦2 𝑦3 𝑦𝑛

Page 24: CRF を使った Web 本文抽出

HMM の問題点 (1)

• 未知の観測値を扱うことが出来ない

– p(X|Y) が値を持たないと計算できない

• Y:潜在変数(ラベル)、X:観測変数

• 自然言語処理の場合、訓練データが全て

の単語を網羅するのは難しい

– 存在しない単語の確率=0

Page 25: CRF を使った Web 本文抽出

HMM の問題点 (2)

• 潜在変数を止めたとき、観測変数間は独

立になる

• 非独立/同時に起きうる特徴量を扱うこと

が難しい

– 「テキストが長い」と「句読点が多い」は同時

に起きやすい

– 「<ul>タグを含む」と「次のブロックが

<li>タグを含む」は非独立

Page 26: CRF を使った Web 本文抽出

HMM の問題点 (3)

• 大域的な「最適性」を得られない可能性

– 分岐の少ない経路が選ばれやすい

• Label bias と Length bias

– 同じラベルを持つ系列の続く確率が指数的に減衰

するため、「長い本文」が選ばれにくい

• 局所的な条件付き確率の積によって尤度を求めるため

[Kudo+ 2004] より

Page 27: CRF を使った Web 本文抽出

条件付き乱数場 (Conditional Random Fields, CRF)

• 系列ラベリングのための識別モデル

– マルコフ確率場 / 対数線型モデル

– 形態素解析器 Mecab(Kudo+ 04)で利用

• 線形オーダーの推論手法がある

– Linear-chain CRF の場合

• HMMより最適な系列を得やすい

• 教師有り

[Lafferty+ 2001]

Page 28: CRF を使った Web 本文抽出

CRFのモデル

𝒙

𝑦1 𝑦2 𝑦3 𝑦𝑛 𝑦0 𝑦𝑛+1

簡便性のために こちらのモデルで説明

linear-chain CRF と言えば 現在はこちらが主流

Page 29: CRF を使った Web 本文抽出

モデル

• (バイナリ)特徴量

– 𝝓 𝒚, 𝒙 = (𝒇 𝑦𝑖−1, 𝑦𝑖 , 𝒈 𝑦𝑖 , 𝑥𝑖 )

• 例:𝑔𝑘 = 1 if 𝑥𝑖 が大文字で始まる & 𝑦𝑖 が”名詞”

• 対数線型モデル

– 𝑝 𝒚 𝒙;𝐰 ∝ exp 𝐰T𝝓 𝒚, 𝒙

• 𝑝(𝒙, 𝒚)を経由せず、𝑝(𝒚|𝒙)を直接モデリング

• 目的関数 : 負の対数尤度

– 𝐿 = − log 𝑝 𝒚 𝒙;𝒘𝒙,𝒚 ∈𝑻 where T:訓練データ集合

Page 30: CRF を使った Web 本文抽出

解き方

• (1) 勾配を使ってなにがしかの最適化

𝜕𝐿

𝜕𝒘= − {𝝓 𝒚, 𝒙 − 𝐄𝑦′[𝝓 𝒚′, 𝒙 ]

𝒙,𝒚 ∈𝑻

}

– 準ニュートン法、勾配法

• 𝐄𝑦′は動的計画法で求められる

• (2) Gibbs サンプリング

– 𝑝(𝑦𝑖|𝒚−𝑖 , 𝒙;𝒘) からのサンプリングを繰り返す

• linear-chain でない CRF の場合

• この研究会的にはこっちでしょうけど(苦笑)

Page 31: CRF を使った Web 本文抽出

HMM と CRF の相違点 Hidden Markov Model Conditional Random Fields

ベイジアンネット /生成モデル マルコフ確率場 /識別モデル

教師無し 教師有り

𝑝(𝑥𝑖|𝑦𝑖)で記述できる特徴量 特徴量設計の自由度が高い

𝑝(𝒙, 𝒚)から𝑝(𝒚|𝒙)を計算 𝑝(𝒚|𝒙)を直接計算

ラベリングの計算量はどちらも O(特徴量数×状態数^2×系列長) だが、 CRFは特徴量数が爆発する傾向あり(bigramの特徴量=状態数^2)

[Sutton+ 06]より

Page 32: CRF を使った Web 本文抽出

CRFを実装してみた

Page 33: CRF を使った Web 本文抽出

Linear-chain CRF の Python 実装

• 簡易な実装

– 下図のモデルを採用

– 長距離の特徴量は扱えない

• 実用と言うより勉強用

– numpy / scipy でできる限り処理しているが、遅い

• Python の行列・科学計算ライブラリ

– CRF 処理部は 200行程度なので読みやすい、かも?

• https://github.com/shuyo/iir/blob/master/sequence/crf.py

Page 34: CRF を使った Web 本文抽出

推論

• 次の2つをサポート

– (1) 準ニュートン法

• BFGS を用いて目的関数を最大化

• scipy.optimize.fmin_bfgs

– (2) 最急降下法 + L1 正則化

• 学習率は手動で調整……

• FOBOS(Duchi+ 09) による L1 正則化

– SGD では特徴量がつぶれにくい

Page 35: CRF を使った Web 本文抽出

L1 正則化

• 目的関数に「ペナルティ項」を付加

L′ = − log 𝑝 𝒚 𝒙;𝒘

𝒙,𝒚 ∈𝑻

+ 𝜆 𝑤 1

– 過学習を抑える

– 効果の小さいパラメータを0に落とす

• 推論と同時に特徴選択できる

• 特徴を手当たり次第つぎ込める CRF と相性がよい

• 𝜆 𝑤 1は微分不可なため、一般には扱いにくい

– FOBOS(Duchi+ 09) はオンライン正則化を容易に実現

Page 36: CRF を使った Web 本文抽出

CRFで本文抽出

Page 37: CRF を使った Web 本文抽出

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

Page 38: CRF を使った Web 本文抽出

特徴量

• 特徴量設計(1678個)

– bigram(ラベルの組)

– タグ(a/p/div/...)の有無

– キーワードの有無

• Copyright/会社概要/利用規約など

– 句読点、日付、アフィリエイトリンク

– テキスト長、リンクされているテキスト長

Page 39: CRF を使った Web 本文抽出

データ作成方法

• 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)の技術の供与を……

Page 40: CRF を使った Web 本文抽出

結果 訓練データ テストデータ

件数 20 5

総系列長 4341 709

BFGS 正解数 3505 400

正解率 80.7% 56.4%

FOBOS L1 (λ=1)

正解数 3424 397

正解率 78.9% 56.0%

有効特徴数 1676 / 1678

FOBOS L1 (λ=10)

正解数 3520 401

正解率 81.1% 56.6%

有効特徴数 1630 / 1678

FOBOS L1 (λ=20)

正解数 3488 401

正解率 80.4% 56.6%

有効特徴数 1323 / 1678

Page 41: CRF を使った Web 本文抽出

実行例(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) [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

関連記事へのリンクを linklist として正しく分類

Page 42: CRF を使った Web 本文抽出

実行例(はてなダイアリー)

[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 = [&quot;<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)

コメントを 正しく判別

Page 43: CRF を使った Web 本文抽出

実行例(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) [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 [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.

記事見出しや抜粋を linklist として正しく分類

[body]とラベリングされた ブロック無し

Page 44: CRF を使った Web 本文抽出

実行例(しょこたんブログ)

[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>ぽこ(&lt;●&gt;&lt;●&gt;)メポぽん</DIV><DIV>&nbsp; : ( 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.

手強すなよ……

Page 45: CRF を使った Web 本文抽出

まとめ

• CRFを使ったWeb本文抽出を実装

– CRFは本文抽出タスクにも有効っぽい?

• というには、まだまだ訓練が足りない……

• L1 の効果を見るには特徴量がまだ少ない

– 長距離の特徴を扱えれば指数的に増やせる

– 有効素性を減らすことは確かにできそう

Page 46: CRF を使った Web 本文抽出

発展(課題)

• データを増やす

• アノテーションを見直す

• 素性を増やす(増やせるように作り直す)

– ライブラリを使えばいい

• Gibbs サンプリングで解いてみる

– non linear-chain なモデルも試してみたい?

• C++ などでまじめに書いて実用化を狙う

Page 47: CRF を使った Web 本文抽出

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