29
CRFを使ったWeb本文抽出 2011/11/5 WebDB Forum 2011 中谷 秀洋@サイボウズ・ラボ

CRF を使った Web 本文抽出 for WebDB Forum 2011

Embed Size (px)

DESCRIPTION

WebDB Forum 2011 の技術報告セッションで発表した際の資料です。

Citation preview

Page 1: CRF を使った Web 本文抽出 for WebDB Forum 2011

CRFを使ったWeb本文抽出

2011/11/5

WebDB Forum 2011

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

Page 2: CRF を使った Web 本文抽出 for WebDB Forum 2011

サイボウズについて

• サイボウズ株式会社

– サイボウズ Office / ガルーン

• 企業内グループウェア

– サイボウズ Live

• 企業間・個人向けグループウェア

• サイボウズ・ラボ株式会社

– サイボウズの100%子会社

– Web技術や情報共有をテーマとした、 中長期視点の研究開発

Page 3: CRF を使った Web 本文抽出 for WebDB Forum 2011

Web本文抽出

Page 4: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

ゲーム

スマホ

PC

生活

映画

Web

経済

livedoor ニュース より

Page 5: CRF を使った Web 本文抽出 for WebDB Forum 2011

「本文」

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

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

Page 6: CRF を使った Web 本文抽出 for WebDB Forum 2011

Web 本文抽出モジュール (中谷 2007)

• ExtractContent for Ruby

– html から本文抽出を行う Ruby モジュール

– オープンソース(BSD ライセンス)

• http://rubyforge.org/projects/extractcontent/

• 特徴

– ルールベース

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

Page 7: CRF を使った Web 本文抽出 for WebDB Forum 2011

苦手なパターン

Page 8: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

毎日 jp より

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

<BR> で区切り

Page 9: CRF を使った Web 本文抽出 for WebDB Forum 2011

一番長いけど「本文」ではない

本文より長い

ここも それなり

PC Watch より

本文

Page 10: CRF を使った Web 本文抽出 for WebDB Forum 2011

とても短い「本文」を見落とす

livedoor ニュース より

Page 11: CRF を使った Web 本文抽出 for WebDB Forum 2011

もっと短い「本文」も……

しょこたん ブログ より

Page 12: CRF を使った Web 本文抽出 for WebDB Forum 2011

そもそも「本文」がない

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

Yahoo! Japan トップ より

Page 13: CRF を使った Web 本文抽出 for WebDB Forum 2011

系列ラベリングによる本文抽出

Page 14: CRF を使った Web 本文抽出 for WebDB Forum 2011

系列ラベリング

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

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

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

– 形態素解析

• 品詞推定

• 分かち書き

– 係り受け

– 音声認識

– DNA解析

I am a pen

代名詞 動詞 不定冠詞 名詞

観測変数

隠れ変数

Page 15: CRF を使った Web 本文抽出 for WebDB Forum 2011

系列ラベリングによる 本文抽出のイメージ (1)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Web ページ

HTML を適当な ブロック(チャンク) ごとに分ける

<p>どっちにせよ裏技的になっちゃうから、こういうコードを ……

<div class="section"><h3 class="title"><a href=" ……

<body><div id="simple-header"><a href="http://www.hatena.ne.jp/

<html xmlns:og="http://ogp.me/ns#"><head>

<p class="sectionheader"><span class="sectioncategory"><a hre

<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Py

<p>でも以下のように書くと、<a class="keyword" href=" ……

<pre class="syntax-highlight"> <span class="synStatement">def</

<p class="sectionfooter"><a href="/n_shuyo/20100629/python">

<form id="comment-form" method="post" action="/n_shuyo/comment

:

:

Page 16: CRF を使った Web 本文抽出 for WebDB Forum 2011

系列ラベリングによる 本文抽出のイメージ (2)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<p>どっちにせよ裏技的になっちゃうから、こういうコードを ……

<div class="section"><h3 class="title"><a href=" ……

<body><div id="simple-header"><a href="http://www.hatena.ne.jp/

<html xmlns:og="http://ogp.me/ns#"><head>

<p class="sectionheader"><span class="sectioncategory"><a hre

<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Py

<p>でも以下のように書くと、<a class="keyword" href=" ……

<pre class="syntax-highlight"> <span class="synStatement">def</

<p class="sectionfooter"><a href="/n_shuyo/20100629/python">

<form id="comment-form" method="post" action="/n_shuyo/comment

:

:

← ヘッダ

← ヘッダ

← ヘッダ

← タイトル

← 本文

← 本文

← 本文

← 本文

← 本文

← 本文

← コメント

各ブロックに適切なラベルを振る

Page 17: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

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

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

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

– Linear-chain CRF の場合

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

• 教師有り

[Lafferty+ 2001]

Page 18: CRF を使った Web 本文抽出 for WebDB Forum 2011

Linear-Chain CRF

• 対数線型モデル

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

– 𝝓 𝒚, 𝒙 = 𝒇 𝑦𝑖−1, 𝑦𝑖 , 𝒈 𝑦𝑖 , 𝑥𝑖 : (バイナリ)特徴量

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

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

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

• 目的関数の最適化(勾配を使う準ニュートン法、SGDなど)

–𝜕𝐿

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

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

Page 19: CRF を使った Web 本文抽出 for WebDB Forum 2011

CRFを使ったWeb本文抽出 (中谷 2010, 2011)

• 本文抽出を系列ラベリングの問題に定式化

– htmlを閉じタグ/<br>で分割

– ブロックの系列に12種類のラベル付けを行う

• header(ヘッダ), title(タイトル), body(本文), comment(コメント), linklist(リンクリスト) など

• CRFが本文抽出タスクに有用かどうかの実験

– ヒューリスティックな工夫はしない

– 正規化は script/style タグの除去のみ

• プロトタイプ実装 – http://github.com/shuyo/iir/blob/master/extractcontent/webextract.py

Page 20: CRF を使った Web 本文抽出 for WebDB Forum 2011

特徴量

• 特徴量設計(1678個)

– bigram(ラベルの組)

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

– キーワードの有無

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

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

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

Page 21: CRF を使った Web 本文抽出 for WebDB Forum 2011

アノテーション(正解データ作成)

• 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 22: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

件数 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 23: CRF を使った Web 本文抽出 for WebDB Forum 2011

実行例(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 24: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

[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 25: CRF を使った Web 本文抽出 for WebDB Forum 2011

実行例(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 26: CRF を使った Web 本文抽出 for WebDB Forum 2011

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

[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 27: CRF を使った Web 本文抽出 for WebDB Forum 2011

まとめ

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

– CRFは本文抽出タスクにも一定の有効性

• データが少ないのでもっと増やす必要あり

– ただしルールベースの実装より遅い

• 通常のアプリなら ExtractContent で十分か

• きめ細かい情報抽出の必要性があれば

Page 28: CRF を使った Web 本文抽出 for WebDB Forum 2011

参考 : CLEANEVAL (2007)

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

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

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

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

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

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

• 優勝チームは今回紹介したものとほぼ同じ手法

– [Marek+ 2007]

Page 29: CRF を使った Web 本文抽出 for WebDB Forum 2011

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