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

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

Nov 12, 2014

Download

Technology

Shuyo Nakatani

WebDB Forum 2011 の技術報告セッションで発表した際の資料です。
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 本文抽出 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