CRF を使ったWeb本文抽出

     2011/7/30
   確率の科学研究会 #1
 中谷 秀洋@サイボウズ・ラボ
アジェンダ
• 本文抽出について
 – Web ページからの本文抽出
 – ルールベースでの本文抽出
• 条件付確率場(CRF)について
 – 系列ラベリング
 – FOBOS による L1 正則化
• CRF を使った本文抽出
本文抽出
Webページは雑多な情報だらけ
                         Web

ゲーム



 経済
                         生活



スマホ                      映画



 PC

      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に対応
• 様々な問題を解くための定式化の一つ
 – 形態素解析
  • 品詞推定
                   隠れ変数
  • 分かち書き
 – 係り受け     代名詞   動詞   不定冠詞   名詞

 – 音声認識      I    am      a   pen
 – DNA解析
                   観測変数
隠れマルコフモデル
          (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)
                                          [Lafferty+ 2001]

• 系列ラベリングのための識別モデル
 – マルコフ確率場 / 対数線型モデル
 – 形態素解析器 Mecab(Kudo+ 04)で利用
• 線形オーダーの推論手法がある
 – Linear-chain CRF の場合
• HMMより最適な系列を得やすい
• 教師有り
CRFのモデル


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



0   1   2        3      +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   正解数      3424                    397
(λ=1)      正解率      78.9%                  56.0%
           有効特徴数            1676 / 1678
FOBOS L1   正解数      3520                    401
(λ=10)     正解率      81.1%                  56.6%
           有効特徴数            1630 / 1678
FOBOS L1   正解数      3488                    401
(λ=20)     正解率      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)                     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
実行例(はてなダイアリー)
[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)
                         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.
実行例(しょこたんブログ)
[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

More Related Content

PDF
Crfと素性テンプレート
PDF
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
PDF
不均衡データのクラス分類
PPTX
[DL輪読会]When Does Label Smoothing Help?
PDF
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
PDF
Contrastive learning 20200607
PPTX
畳み込みニューラルネットワークの高精度化と高速化
PDF
論文紹介 Anomaly Detection using One-Class Neural Networks (修正版
Crfと素性テンプレート
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
不均衡データのクラス分類
[DL輪読会]When Does Label Smoothing Help?
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
Contrastive learning 20200607
畳み込みニューラルネットワークの高精度化と高速化
論文紹介 Anomaly Detection using One-Class Neural Networks (修正版

What's hot (20)

PPTX
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
PDF
抽出型要約と言い換えによる生成型要約の訓練データ拡張
PPTX
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
PDF
ウェーブレット木の世界
PDF
全力解説!Transformer
PPTX
近年のHierarchical Vision Transformer
PDF
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
PDF
状態空間モデルの考え方・使い方 - TokyoR #38
PDF
「深層学習」第6章 畳込みニューラルネット
PDF
Rでisomap(多様体学習のはなし)
PDF
Newman アルゴリズムによるソーシャルグラフのクラスタリング
PDF
数式をnumpyに落としこむコツ
PDF
BERT+XLNet+RoBERTa
PDF
はじめてのKrylov部分空間法
PDF
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
PDF
ベルヌーイ分布からベータ分布までを関係づける
PPTX
マハラノビス距離を用いた異常値検知
PDF
レプリカ交換モンテカルロ法で乱数の生成
PDF
深層生成モデルを用いたマルチモーダル学習
PDF
Deeplearning輪読会
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
抽出型要約と言い換えによる生成型要約の訓練データ拡張
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
ウェーブレット木の世界
全力解説!Transformer
近年のHierarchical Vision Transformer
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
状態空間モデルの考え方・使い方 - TokyoR #38
「深層学習」第6章 畳込みニューラルネット
Rでisomap(多様体学習のはなし)
Newman アルゴリズムによるソーシャルグラフのクラスタリング
数式をnumpyに落としこむコツ
BERT+XLNet+RoBERTa
はじめてのKrylov部分空間法
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
ベルヌーイ分布からベータ分布までを関係づける
マハラノビス距離を用いた異常値検知
レプリカ交換モンテカルロ法で乱数の生成
深層生成モデルを用いたマルチモーダル学習
Deeplearning輪読会
Ad

Viewers also liked (10)

PDF
系列ラベリングの基礎
PDF
条件付き確率場の推論と学習
PDF
今日からできる構造学習(主に構造化パーセプトロンについて)
PPTX
論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」
PPTX
Signl213
PDF
自然言語処理はじめました - Ngramを数え上げまくる
PDF
言語モデル入門
PPTX
Amazon Athena で実現する データ分析の広がり
PDF
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
PDF
シリコンバレーの「何が」凄いのか
系列ラベリングの基礎
条件付き確率場の推論と学習
今日からできる構造学習(主に構造化パーセプトロンについて)
論文紹介:「End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF」
Signl213
自然言語処理はじめました - Ngramを数え上げまくる
言語モデル入門
Amazon Athena で実現する データ分析の広がり
「はじめてでもわかる RandomForest 入門-集団学習による分類・予測 -」 -第7回データマイニング+WEB勉強会@東京
シリコンバレーの「何が」凄いのか
Ad

Similar to CRF を使った Web 本文抽出 (20)

PDF
Web本文抽出 using crf
PDF
CRF を使った Web 本文抽出 for WebDB Forum 2011
PDF
TreeFrog Frameworkの紹介
PDF
Jubatusでマルウェア分類
PDF
アドテク×Scala×パフォーマンスチューニング
PDF
第9回ACRiウェビナー_日立/島田様ご講演資料
PPTX
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
PDF
使い捨て python コードの書き方
PDF
PFI Christmas seminar 2009
PPTX
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
PDF
企業におけるSpring@日本springユーザー会20090624
PDF
とあるFlashの自動生成
PDF
LDA入門
PDF
刊行記念セミナー「HBase徹底入門」
PDF
最近のストリーム処理事情振り返り
PDF
A Machine Learning Framework for Programming by Example
PDF
Rokko チュートリアル
ODP
Sourcecode Reading Workshop2010
PPTX
Startup JavaScript
PPTX
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
Web本文抽出 using crf
CRF を使った Web 本文抽出 for WebDB Forum 2011
TreeFrog Frameworkの紹介
Jubatusでマルウェア分類
アドテク×Scala×パフォーマンスチューニング
第9回ACRiウェビナー_日立/島田様ご講演資料
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
使い捨て python コードの書き方
PFI Christmas seminar 2009
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
企業におけるSpring@日本springユーザー会20090624
とあるFlashの自動生成
LDA入門
刊行記念セミナー「HBase徹底入門」
最近のストリーム処理事情振り返り
A Machine Learning Framework for Programming by Example
Rokko チュートリアル
Sourcecode Reading Workshop2010
Startup JavaScript
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門

More from Shuyo Nakatani (20)

PDF
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
PDF
Generative adversarial networks
PDF
無限関係モデル (続・わかりやすいパターン認識 13章)
PDF
Memory Networks (End-to-End Memory Networks の Chainer 実装)
PDF
人工知能と機械学習の違いって?
PDF
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
PDF
ドラえもんでわかる統計的因果推論 #TokyoR
PDF
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
PDF
星野「調査観察データの統計科学」第3章
PDF
星野「調査観察データの統計科学」第1&2章
PDF
言語処理するのに Python でいいの? #PyDataTokyo
PDF
Zipf? (ジップ則のひみつ?) #DSIRNLP
PDF
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
PDF
ソーシャルメディアの多言語判定 #SoC2014
PDF
猫に教えてもらうルベーグ可測
PDF
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
PDF
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
PDF
Active Learning 入門
PDF
数式を綺麗にプログラミングするコツ #spro2013
PDF
ノンパラベイズ入門の入門
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
Generative adversarial networks
無限関係モデル (続・わかりやすいパターン認識 13章)
Memory Networks (End-to-End Memory Networks の Chainer 実装)
人工知能と機械学習の違いって?
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoR
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第1&2章
言語処理するのに Python でいいの? #PyDataTokyo
Zipf? (ジップ則のひみつ?) #DSIRNLP
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ソーシャルメディアの多言語判定 #SoC2014
猫に教えてもらうルベーグ可測
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
Active Learning 入門
数式を綺麗にプログラミングするコツ #spro2013
ノンパラベイズ入門の入門

CRF を使った Web 本文抽出

  • 1. CRF を使ったWeb本文抽出 2011/7/30 確率の科学研究会 #1 中谷 秀洋@サイボウズ・ラボ
  • 2. アジェンダ • 本文抽出について – Web ページからの本文抽出 – ルールベースでの本文抽出 • 条件付確率場(CRF)について – 系列ラベリング – FOBOS による L1 正則化 • CRF を使った本文抽出
  • 4. Webページは雑多な情報だらけ Web ゲーム 経済 生活 スマホ 映画 PC livedoor ニュース より
  • 5. 「本文」 • さまざまなアプリが「本文」を要求 – 分類、読み上げ、検索、携帯向け変換、etc
  • 7. 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
  • 8. ExtractContent のアルゴリズム概略 • html をブロックに分割 • ブロックごとにスコアを計算 – 句読点が多い – 非リンクテキストが長い – 本文っぽくないフレーズが含まれている • 連続するブロックを「大ブロック」にまとめる – スコアの高いものをつなげていく – スコアが低いとつながる確率は減衰していく • スコアが最大となる「大ブロック」が本文
  • 11. 「本文」の切れ目がわかりにくい 関係ない話題も 「本文」に入ってしまう 毎日 jp より
  • 12. 一番長いところが本文? 本文より 本文 長い ここも それなり PC Watch より
  • 13. 短い「本文」を見落としがち livedoor ニュース より
  • 15. そもそも「本文」がない場合も ここを「本文」と してしまう Yahoo! Japan トップ より
  • 16. その他の課題 • アプリごとに求める「本文」が異なる – 分類ではコメント不要。全文検索では必要 • パラメータを手動で設定 – 重み、減衰率、閾値など – 最適なものとは言い難い • 当時は機械学習をまだ勉強していなかった……
  • 17. 参考 : CLEANEVAL (2007) • Webページcleaning(本文抽出)のコンテスト – http://cleaneval.sigwac.org.uk/ – 英語と中国語の開発用データセット(約60件ずつ) – 主に「おとなしいデータ」 • 開発データセット120件中、「本文なし」は1件だけ • ファイルサイズの最大は150KB – 現実には 1MB 超える html も珍しくない – 結果 • 中国語は参加1組。精度 18%…… • 英語は9組。精度の最高値は84%
  • 18. 先行研究 • [Marek+ 2007] Web Page Cleaning with Conditional Random Fields – CLEANEVALの優勝チーム • 評価はCLEANEVALの英語データセットのみ – 今回紹介するのとほぼ同じ手法 • 実装後に発見 • というわけで、本発表に新規性はありません
  • 20. ExtractContent のアルゴリズム(再掲) • html をブロックに分割 • ブロックごとにスコアを計算 – 句読点が多い – 非リンクテキストが長い ←特徴量 – 本文っぽくないフレーズが含まれている • 連続するブロックを「大ブロック」にまとめる – スコアの高いものをつなげていく – スコアが低いとつながる確率は減衰 ←転移確率 • スコアが最大となる「大ブロック」が【本文】 ↑ラベル 「系列ラベリング」の問題として定式化できる
  • 21. 系列ラベリング • 系列に対してラベルを付与する – 観測変数と潜在変数が1対1に対応 • 様々な問題を解くための定式化の一つ – 形態素解析 • 品詞推定 隠れ変数 • 分かち書き – 係り受け 代名詞 動詞 不定冠詞 名詞 – 音声認識 I am a pen – DNA解析 観測変数
  • 22. 隠れマルコフモデル (Hidden Markov Model, HMM) • 系列ラベリング手法のための生成モデル • ベイジアンネットワーク – 潜在変数は(1次の)マルコフ連鎖をなす – 観測変数の分布は対応する潜在変数にのみ依存 • 線形オーダーの推論手法がある – Baum-Welch / Viterbi • 教師無し 1 2 3 1 2 3
  • 23. HMMの推論と予測 (, ) = 1 −1 ( | ) =2 =1 • をもとに、 – Θ = (, |Θ) を最大化する Θ と、 – (|) ∝ (, ) を最大化する が • 動的計画法により求められる 1 2 3 1 2 3
  • 24. HMM の問題点 (1) • 未知の観測値を扱うことが出来ない – p(X|Y) が値を持たないと計算できない • Y:潜在変数(ラベル)、X:観測変数 • 自然言語処理の場合、訓練データが全て の単語を網羅するのは難しい – 存在しない単語の確率=0
  • 25. HMM の問題点 (2) • 潜在変数を止めたとき、観測変数間は独 立になる • 非独立/同時に起きうる特徴量を扱うこと が難しい – 「テキストが長い」と「句読点が多い」は同時 に起きやすい – 「<ul>タグを含む」と「次のブロックが <li>タグを含む」は非独立
  • 26. HMM の問題点 (3) • 大域的な「最適性」を得られない可能性 – 分岐の少ない経路が選ばれやすい • Label bias と Length bias – 同じラベルを持つ系列の続く確率が指数的に減衰 するため、「長い本文」が選ばれにくい • 局所的な条件付き確率の積によって尤度を求めるため [Kudo+ 2004] より
  • 27. 条件付き乱数場 (Conditional Random Fields, CRF) [Lafferty+ 2001] • 系列ラベリングのための識別モデル – マルコフ確率場 / 対数線型モデル – 形態素解析器 Mecab(Kudo+ 04)で利用 • 線形オーダーの推論手法がある – Linear-chain CRF の場合 • HMMより最適な系列を得やすい • 教師有り
  • 28. CRFのモデル 簡便性のために こちらのモデルで説明 0 1 2 3 +1 linear-chain CRF と言えば 現在はこちらが主流
  • 29. モデル • (バイナリ)特徴量 – , = ( −1 , , , ) • 例: = 1 if が大文字で始まる & が”名詞” • 対数線型モデル – ; ∝ exp T , • (, )を経由せず、(|)を直接モデリング • 目的関数 : 負の対数尤度 – = − , ∈ log ; where T:訓練データ集合
  • 30. 解き方 • (1) 勾配を使ってなにがしかの最適化 =− { , − ′ [ ′, ]} , ∈ – 準ニュートン法、勾配法 • ′ は動的計画法で求められる • (2) Gibbs サンプリング – ( |− , ; ) からのサンプリングを繰り返す • linear-chain でない CRF の場合 • この研究会的にはこっちでしょうけど(苦笑)
  • 31. HMM と CRF の相違点 Hidden Markov Model Conditional Random Fields ベイジアンネット /生成モデル マルコフ確率場 /識別モデル 教師無し 教師有り ( | )で記述できる特徴量 特徴量設計の自由度が高い (, )から(|)を計算 (|)を直接計算 ラベリングの計算量はどちらも O(特徴量数×状態数^2×系列長) だが、 CRFは特徴量数が爆発する傾向あり(bigramの特徴量=状態数^2) [Sutton+ 06]より
  • 33. Linear-chain CRF の Python 実装 • 簡易な実装 – 下図のモデルを採用 – 長距離の特徴量は扱えない • 実用と言うより勉強用 – numpy / scipy でできる限り処理しているが、遅い • Python の行列・科学計算ライブラリ – CRF 処理部は 200行程度なので読みやすい、かも? • https://github.com/shuyo/iir/blob/master/sequence/crf.py
  • 34. 推論 • 次の2つをサポート – (1) 準ニュートン法 • BFGS を用いて目的関数を最大化 • scipy.optimize.fmin_bfgs – (2) 最急降下法 + L1 正則化 • 学習率は手動で調整…… • FOBOS(Duchi+ 09) による L1 正則化 – SGD では特徴量がつぶれにくい
  • 35. L1 正則化 • 目的関数に「ペナルティ項」を付加 L′ = − log ; + 1 , ∈ – 過学習を抑える – 効果の小さいパラメータを0に落とす • 推論と同時に特徴選択できる • 特徴を手当たり次第つぎ込める CRF と相性がよい • 1 は微分不可なため、一般には扱いにくい – FOBOS(Duchi+ 09) はオンライン正則化を容易に実現
  • 37. 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
  • 38. 特徴量 • 特徴量設計(1678個) – bigram(ラベルの組) – タグ(a/p/div/...)の有無 – キーワードの有無 • Copyright/会社概要/利用規約など – 句読点、日付、アフィリエイトリンク – テキスト長、リンクされているテキスト長
  • 39. データ作成方法 • 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)の技術の供与を……
  • 40. 結果 訓練データ テストデータ 件数 20 5 総系列長 4341 709 BFGS 正解数 3505 400 正解率 80.7% 56.4% FOBOS L1 正解数 3424 397 (λ=1) 正解率 78.9% 56.0% 有効特徴数 1676 / 1678 FOBOS L1 正解数 3520 401 (λ=10) 正解率 81.1% 56.6% 有効特徴数 1630 / 1678 FOBOS L1 正解数 3488 401 (λ=20) 正解率 80.4% 56.6% 有効特徴数 1323 / 1678
  • 41. 実行例(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
  • 42. 実行例(はてなダイアリー) [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)
  • 43. 実行例(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.
  • 44. 実行例(しょこたんブログ) [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.
  • 45. まとめ • CRFを使ったWeb本文抽出を実装 – CRFは本文抽出タスクにも有効っぽい? • というには、まだまだ訓練が足りない…… • L1 の効果を見るには特徴量がまだ少ない – 長距離の特徴を扱えれば指数的に増やせる – 有効素性を減らすことは確かにできそう
  • 46. 発展(課題) • データを増やす • アノテーションを見直す • 素性を増やす(増やせるように作り直す) – ライブラリを使えばいい • Gibbs サンプリングで解いてみる – non linear-chain なモデルも試してみたい? • C++ などでまじめに書いて実用化を狙う
  • 47. 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