Upload
shuyo-nakatani
View
6.239
Download
1
Embed Size (px)
DESCRIPTION
WebDB Forum 2011 の技術報告セッションで発表した際の資料です。
Citation preview
CRFを使ったWeb本文抽出
2011/11/5
WebDB Forum 2011
中谷 秀洋@サイボウズ・ラボ
サイボウズについて
• サイボウズ株式会社
– サイボウズ Office / ガルーン
• 企業内グループウェア
– サイボウズ Live
• 企業間・個人向けグループウェア
• サイボウズ・ラボ株式会社
– サイボウズの100%子会社
– Web技術や情報共有をテーマとした、 中長期視点の研究開発
Web本文抽出
Webページは雑多な情報だらけ
ゲーム
スマホ
PC
生活
映画
Web
経済
livedoor ニュース より
「本文」
• さまざまなアプリが「本文」を要求
– 分類、読み上げ、検索、携帯向け変換、etc
Web 本文抽出モジュール (中谷 2007)
• ExtractContent for Ruby
– html から本文抽出を行う Ruby モジュール
– オープンソース(BSD ライセンス)
• http://rubyforge.org/projects/extractcontent/
• 特徴
– ルールベース
– できるだけ長い「本文」を抽出しようとする
苦手なパターン
「本文」の切れ目がわかりにくい
毎日 jp より
関係ない話題も 「本文」に入ってしまう
<BR> で区切り
一番長いけど「本文」ではない
本文より長い
ここも それなり
PC Watch より
本文
とても短い「本文」を見落とす
livedoor ニュース より
もっと短い「本文」も……
しょこたん ブログ より
そもそも「本文」がない
ここを「本文」と してしまう
Yahoo! Japan トップ より
系列ラベリングによる本文抽出
系列ラベリング
• 系列に対してラベルを付与する
– 観測変数と潜在変数が1対1に対応
• 様々な問題を解くための定式化の一つ
– 形態素解析
• 品詞推定
• 分かち書き
– 係り受け
– 音声認識
– DNA解析
I am a pen
代名詞 動詞 不定冠詞 名詞
観測変数
隠れ変数
系列ラベリングによる 本文抽出のイメージ (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
:
:
系列ラベリングによる 本文抽出のイメージ (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
:
:
← ヘッダ
← ヘッダ
← ヘッダ
← タイトル
← 本文
← 本文
← 本文
← 本文
← 本文
← 本文
← コメント
各ブロックに適切なラベルを振る
CRF : 条件付き乱数場 (Conditional Random Fields)
• 系列ラベリングのための識別モデル
– 形態素解析器 Mecab(Kudo+ 04)で利用
• 線形オーダーの推論手法がある
– Linear-chain CRF の場合
• HMMより最適な系列を得やすい
• 教師有り
[Lafferty+ 2001]
Linear-Chain CRF
• 対数線型モデル
– 𝑝 𝒚 𝒙;𝐰 ∝ exp 𝐰T𝝓 𝒚, 𝒙
– 𝝓 𝒚, 𝒙 = 𝒇 𝑦𝑖−1, 𝑦𝑖 , 𝒈 𝑦𝑖 , 𝑥𝑖 : (バイナリ)特徴量
• 例:𝑥𝑖 が大文字で始まる & 𝑦𝑖 が”名詞” なら 𝑔 = 1
• 目的関数 : 負の対数尤度
– 𝐿 = − log 𝑝 𝒚 𝒙;𝒘𝒙,𝒚 ∈𝑻 (T:訓練データ集合)
• 目的関数の最適化(勾配を使う準ニュートン法、SGDなど)
–𝜕𝐿
𝜕𝒘= − {𝝓 𝒚, 𝒙 − 𝐄𝑦′[𝝓 𝒚′, 𝒙 ]𝒙,𝒚 ∈𝑻 }
– 𝐄𝑦′は動的計画法で求められる
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
特徴量
• 特徴量設計(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 = ["<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>ぽこ(<●><●>)メポぽん</DIV><DIV> : ( 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は本文抽出タスクにも一定の有効性
• データが少ないのでもっと増やす必要あり
– ただしルールベースの実装より遅い
• 通常のアプリなら ExtractContent で十分か
• きめ細かい情報抽出の必要性があれば
参考 : CLEANEVAL (2007)
• Webページcleaning(本文抽出)のコンテスト
– http://cleaneval.sigwac.org.uk/
– 英語と中国語の開発用データセット(約60件ずつ)
– 主に「おとなしいデータ」
• 開発データセット120件中、「本文なし」は1件だけ
• ファイルサイズの最大は150KB
• 優勝チームは今回紹介したものとほぼ同じ手法
– [Marek+ 2007]
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