CRF を使った Web 本文抽出

Post on 12-Nov-2014

10958 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

CRF(Conditional Random Fields)を使って html から本文を抽出する実装プロトタイプの紹介です。 http://www.slideshare.net/shuyo/web-using-crf の改訂版です。

Transcript

CRF を使ったWeb本文抽出

2011/7/30

確率の科学研究会 #1

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

アジェンダ

• 本文抽出について

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

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

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

– 系列ラベリング

– FOBOS による L1 正則化

• CRF を使った本文抽出

本文抽出

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

ゲーム

スマホ

PC

生活

映画

Web

経済

livedoor ニュース より

「本文」

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

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

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

ExtractContent のアルゴリズム概略

• html をブロックに分割

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

– 句読点が多い

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

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

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

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

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

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

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

問題となるパターン

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

毎日 jp より

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

一番長いところが本文?

本文より長い

ここも それなり

PC Watch より

本文

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

livedoor ニュース より

もっと短い「本文」

しょこたん ブログ より

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

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

Yahoo! Japan トップ より

その他の課題

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

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

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

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

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

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

参考 : CLEANEVAL (2007)

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

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

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

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

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

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

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

– 結果

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

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

先行研究

• [Marek+ 2007] Web Page Cleaning with

Conditional Random Fields

– CLEANEVALの優勝チーム

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

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

• 実装後に発見

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

系列ラベリングと CRF

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

• html をブロックに分割

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

– 句読点が多い

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

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

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

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

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

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

↑ラベル

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

系列ラベリング

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

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

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

– 形態素解析

• 品詞推定

• 分かち書き

– 係り受け

– 音声認識

– DNA解析

I am a pen

代名詞 動詞 不定冠詞 名詞

観測変数

隠れ変数

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

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

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

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

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

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

– Baum-Welch / Viterbi

• 教師無し

𝑥1 𝑥2 𝑥3 𝑥𝑛

𝑦1 𝑦2 𝑦3 𝑦𝑛

HMMの推論と予測

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

𝑛

𝑖=2

𝑝(𝑥𝑖|𝑦𝑖)

𝑛

𝑖=1

• をもとに、

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

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

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

𝑥1 𝑥2 𝑥3 𝑥𝑛

𝑦1 𝑦2 𝑦3 𝑦𝑛

HMM の問題点 (1)

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

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

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

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

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

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

HMM の問題点 (2)

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

立になる

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

が難しい

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

に起きやすい

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

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

HMM の問題点 (3)

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

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

• Label bias と Length bias

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

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

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

[Kudo+ 2004] より

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

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

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

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

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

– Linear-chain CRF の場合

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

• 教師有り

[Lafferty+ 2001]

CRFのモデル

𝒙

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

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

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

モデル

• (バイナリ)特徴量

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

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

• 対数線型モデル

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

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

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

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

解き方

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

𝜕𝐿

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

𝒙,𝒚 ∈𝑻

}

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

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

• (2) Gibbs サンプリング

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

• linear-chain でない CRF の場合

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

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

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

教師無し 教師有り

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

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

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

[Sutton+ 06]より

CRFを実装してみた

Linear-chain CRF の Python 実装

• 簡易な実装

– 下図のモデルを採用

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

• 実用と言うより勉強用

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

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

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

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

推論

• 次の2つをサポート

– (1) 準ニュートン法

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

• scipy.optimize.fmin_bfgs

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

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

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

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

L1 正則化

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

L′ = − log 𝑝 𝒚 𝒙;𝒘

𝒙,𝒚 ∈𝑻

+ 𝜆 𝑤 1

– 過学習を抑える

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

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

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

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

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

CRFで本文抽出

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

特徴量

• 特徴量設計(1678個)

– bigram(ラベルの組)

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

– キーワードの有無

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

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

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

データ作成方法

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

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

件数 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

実行例(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 として正しく分類

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

[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)

コメントを 正しく判別

実行例(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]とラベリングされた ブロック無し

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

[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.

手強すなよ……

まとめ

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

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

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

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

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

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

発展(課題)

• データを増やす

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

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

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

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

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

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

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

top related