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

7,198 views

Published on

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

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,198
On SlideShare
0
From Embeds
0
Number of Embeds
2,786
Actions
Shares
0
Downloads
26
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

  1. 1. CRFを使ったWeb本文抽出 2011/11/5 WebDB Forum 2011 中谷 秀洋@サイボウズ・ラボ
  2. 2. サイボウズについて• サイボウズ株式会社 – サイボウズ Office / ガルーン • 企業内グループウェア – サイボウズ Live • 企業間・個人向けグループウェア• サイボウズ・ラボ株式会社 – サイボウズの100%子会社 – Web技術や情報共有をテーマとした、 中長期視点の研究開発
  3. 3. Web本文抽出
  4. 4. Webページは雑多な情報だらけ Webゲーム 経済 生活スマホ 映画 PC livedoor ニュース より
  5. 5. 「本文」• さまざまなアプリが「本文」を要求 – 分類、読み上げ、検索、携帯向け変換、etc
  6. 6. Web 本文抽出モジュール (中谷 2007)• ExtractContent for Ruby – html から本文抽出を行う Ruby モジュール – オープンソース(BSD ライセンス) • http://rubyforge.org/projects/extractcontent/• 特徴 – ルールベース – できるだけ長い「本文」を抽出しようとする
  7. 7. 苦手なパターン
  8. 8. 「本文」の切れ目がわかりにくい <BR> で区切り 関係ない話題も 「本文」に入ってしまう 毎日 jp より
  9. 9. 一番長いけど「本文」ではない本文より 本文 長い ここも それなり PC Watch より
  10. 10. とても短い「本文」を見落とす livedoor ニュース より
  11. 11. もっと短い「本文」も…… しょこたん ブログ より
  12. 12. そもそも「本文」がない ここを「本文」と してしまう Yahoo! Japan トップ より
  13. 13. 系列ラベリングによる本文抽出
  14. 14. 系列ラベリング• 系列に対してラベルを付与する – 観測変数と潜在変数が1対1に対応• 様々な問題を解くための定式化の一つ – 形態素解析 • 品詞推定 隠れ変数 • 分かち書き – 係り受け 代名詞 動詞 不定冠詞 名詞 – 音声認識 I am a pen – DNA解析 観測変数
  15. 15. 系列ラベリングによる 本文抽出のイメージ (1) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:og="http://ogp.me/ns#"><head> HTML を適当な <body><div id="simple-header"><a href="http://www.hatena.ne.jp/ブロック(チャンク) ごとに分ける : <div class="section"><h3 class="title"><a href=" …… <p class="sectionheader"><span class="sectioncategory"><a hre <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Py Web <p>でも以下のように書くと、<a class="keyword" href=" ……ページ : <p>どっちにせよ裏技的になっちゃうから、こういうコードを …… <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
  16. 16. 系列ラベリングによる 本文抽出のイメージ (2)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ← ヘッダ<html xmlns:og="http://ogp.me/ns#"><head> ← ヘッダ 各<body><div id="simple-header"><a href="http://www.hatena.ne.jp/ ← ヘッダ ブ : ロ ッ<div class="section"><h3 class="title"><a href=" …… ← タイトル ク ← 本文 に<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=" …… ← 本文 な ラ : ベ ル<p>どっちにせよ裏技的になっちゃうから、こういうコードを …… ← 本文 を<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 ← コメント
  17. 17. CRF : 条件付き乱数場 (Conditional Random Fields) [Lafferty+ 2001]• 系列ラベリングのための識別モデル – 形態素解析器 Mecab(Kudo+ 04)で利用• 線形オーダーの推論手法がある – Linear-chain CRF の場合• HMMより最適な系列を得やすい• 教師有り
  18. 18. Linear-Chain CRF• 対数線型モデル – ������ ������ ������; ������ ∝ exp ������ T ������ ������, ������ – ������ ������, ������ = ������ ������������−1 , ������������ , ������ ������������ , ������������ : (バイナリ)特徴量 • 例:������������ が大文字で始まる & ������������ が”名詞” なら ������ = 1• 目的関数 : 負の対数尤度 – ������ = − ������,������ ∈������ log ������ ������ ������; ������ (T:訓練データ集合)• 目的関数の最適化(勾配を使う準ニュートン法、SGDなど) ������������ – =− ������,������ ∈������{������ ������, ������ − ������������′ [������ ������′, ������ ]} ������������ – ������������′ は動的計画法で求められる
  19. 19. 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
  20. 20. 特徴量• 特徴量設計(1678個) – bigram(ラベルの組) – タグ(a/p/div/...)の有無 – キーワードの有無 • Copyright/会社概要/利用規約など – 句読点、日付、アフィリエイトリンク – テキスト長、リンクされているテキスト長
  21. 21. アノテーション(正解データ作成)• 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"><divclass="BodyTxt"><p> トヨタ自動車が、マツダからハイブリッド車(HV)の技術の供与を……
  22. 22. 結果 訓練データ テストデータ件数 20 5総系列長 4341 709BFGS 正解数 3505 400 正解率 80.7% 56.4%FOBOS L1 正解数 3424 397(λ=1) 正解率 78.9% 56.0% 有効特徴数 1676 / 1678FOBOS L1 正解数 3520 401(λ=10) 正解率 81.1% 56.6% 有効特徴数 1630 / 1678FOBOS L1 正解数 3488 401(λ=20) 正解率 80.4% 56.6% 有効特徴数 1323 / 1678
  23. 23. 実行例(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
  24. 24. 実行例(はてなダイアリー)[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)
  25. 25. 実行例(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.
  26. 26. 実行例(しょこたんブログ)[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.
  27. 27. まとめ• CRFを使ったWeb本文抽出を実装 – CRFは本文抽出タスクにも一定の有効性 • データが少ないのでもっと増やす必要あり – ただしルールベースの実装より遅い • 通常のアプリなら ExtractContent で十分か • きめ細かい情報抽出の必要性があれば
  28. 28. 参考 : CLEANEVAL (2007)• Webページcleaning(本文抽出)のコンテスト – http://cleaneval.sigwac.org.uk/ – 英語と中国語の開発用データセット(約60件ずつ) – 主に「おとなしいデータ」 • 開発データセット120件中、「本文なし」は1件だけ • ファイルサイズの最大は150KB• 優勝チームは今回紹介したものとほぼ同じ手法 – [Marek+ 2007]
  29. 29. 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

×