はじめに

ウェブページ(HTML文書)はヘッダーフッダー,メニュー,広告など,自身の内容とは関係のない多くのノイズを含んでいます. これらのノイズはウェブページ解析を非常に難しくさせています. 特に最近では,ページに関連した広告が貼られていたりするので,ウェブページ解析がさらに難しくなっているように思います.

このような問題は昔から研究されていて,HTMLからのメインコンテンツ抽出 (Main Content Extraction)とか,本文抽出とか呼ばれています. 多くの既存手法は,DOMの構造を元にメインコンテンツに該当するDOM要素を特定します. そのために,入念にスコア関数を設計したり,教師データから学習させたりする試みがなされています. スコア関数や素性には,ほとんどと言っていいほどテキスト情報が使われます. よって,これらはニュース記事など,そのページのメインコンテンツがテキストである場合,十分な性能が期待できます.

しかしながら,ウェブページの中には,テキスト以外をメインコンテンツとするページもあります. 例えば,何かのメタ情報のみを掲載しているページや,動画や画像メインのページなどです. このような場合,上記のような手法では,非常に少ないテキスト情報からメインコンテンツ部分を予測することになり,結果として性能の低下を生みます. 今回は,テキスト以外をメインコンテンツとするページにもある程度適用できるようなメインコンテンツ抽出アルゴリズムの構築を目指します.

DOM PageRank: DOM要素への重み付け

以前,

を提案しました. 半教師付きページランクを実行するには,隣接行列と初期重みが必要です. 教師データをで表現すれば,その情報を活用できます. 今回はこれをメインコンテンツ抽出に応用したアルゴリズム,DOM PageRankを提案します.この場合,DOMツリーをそのまま隣接行列として与えれば,あとは初期値をどう決めるかの問題になります.

具体的に定式化していきます. をDOMツリーの無向グラフ表現とします. つまり,がテキストノードを含むDOMの要素,がその間のエッジです. を隣接行列で表現します.ただし,

をどう決めるかによって,結果が変わってきます. 基本的には,にはが重要であればあるほど高い値を設定します. の決定例を幾つか考えてみました.

DOMツリー内の重要な要素とは何でしょうか? とりあえず先人達と同じようにテキストノードは重要だと考えると,は以下のようになります(これをテキスト一様重みと呼びます).

基本的には,テキスト一様重みで良さそうですが, テキストの中には重要なものとそうでないものがあると考えられます. 例えばウェブページのタイトルやディスクリプションは重要だと考えてもいいと思います. この考えを用いて,タイトルやディスクリプションと似たテキストは重要だと仮定すると,以下のような重み関数も考えられます(これをタイトル重みと呼びます).

ただし, が持つテキスト,はタイトル,はディスクリプション,はトレードオフパラメータです.

その他にも,画像や動画メインのページも考慮すると,<img>や<video>タグにも初期重みをいくらか与えることも考えられます.

さて,これでを元に,すべてのDOM要素に対して,重みが付きます.

メインコンテンツ抽出

半教師付きページランクにより,すべてのDOM要素に対して,重みが付きます. 次は,メインコンテンツ抽出にこのDOM要素への重みを活用します. ここはあまり深く考えず,包括的にメインコンテンツを抽出するために,Sunらによって提案されたDensitySumを用います. DensitySumでは,あるDOM要素のスコアを以下のように求めます.

つまり,あるDOM要素のスコアは,その子要素の合計値であると定義します. Sunらはさらに抽出アルゴリズムも提案していますが,今回はシンプルにメインとなるDOM要素を以下のように定義します.

実験

実験してみました. 今回は,教師ありメインコンテンツ抽出アルゴリズムである,dragnetと比較してみます.

とりあえず画像メインのページとして,

を選びました.2つ目は本文抽出で有名なしょこたんブログです. 抽出結果を以下の表1, 表2に示します(今回はテキストで示しますが,実際にはDOM要素をスコア付きで取得できます). なおは正則化パラメータで,大体0.5にしとけば良さそうです

表1: 癒されたい人集合!一生離れないと誓った「にこいちアニマル」に悶える12選 | CuRAZY [クレイジー]の抽出結果
手法 抽出したテキスト
DOM Page Rank (テキスト一様重み, Facebook でシェアする Twitter でシェアする LINE で送る ネコ部を フォローする クレイジーの最新記事 をお届けします 1. 窒息するギリギリまでギュッ View post on imgur.com 2. くっついてないと焦りだす View post on imgur.com 3. 夢の中でも二匹は一緒 http://bit.ly/16Yh5ll 4. ご主人が出かけると始まるダンスパーティー Boomer (Golden retriever) and Trigger (Lab) 5. 2匹にイタズラさせたら横に出る者はいない View post on imgur.com 6. 一緒にいると自然と笑顔に View post on imgur.com 7. 落ち込んだら片方が慰める View post on imgur.com 8. 溶けて1匹になっちゃいそう View post on imgur.com 9. どこにも行かないって約束! http://catasters.tumblr.com/post/139548429975/thank-you-for-reminding-me-to-wish-you-a-happy 10. 愛が溢れ出ちゃってる View post on imgur.com 11. 他のワンコそっちのけ View post on imgur.com 12. 二人の間には誰も入れない View post on imgur.com Editor クレイジーピンク クレイジー特戦隊、唯一の女子隊員! 最近Twitter始めました♡クレイジーガールなつぶやきしていくので、是非フォローしてください( ✧Д✧) 最近、習字道具を一式揃えました! Twitter:https://twitter.com/curazypink クレイジーピンクの他の記事 local_offer 動物 ネコ大好き! 仲良し 猫 犬 公園 桃 ドリンク 不運 この記事が気に入ったら いいね!しよう 最新記事をお届けします フォローしよう 友達に追加しよう
dragnet 歴代のあだ名は「ラーメン屋の娘」「シュワちゃん」「プレデター」「雨女」「サイババ」「ダヴ」「39の女(中2で握力39だったので)」等々です♡ Twitter:https://twitter.com/curazypink クレイジーピンクの他の記事


表2: 10年|中川翔子 オフィシャルブログ Powered by Amebaの抽出結果
手法 抽出したテキスト
DOM PageRank (テキスト一様重み, 2016-07-15 09:53:22 NEW ! テーマ: ブログ いよいよ明日はポケモン映画公開‼️ 10年連続で映画ゲスト声優として参加させていただけるなんて幸せの極みです。感謝と愛‼️であしたの舞台挨拶を楽しみにしています 夏はポケモン‼️ 今日までしか買えない前売り券でボルケニオンをもらおう AD いいね! リブログする NEW リブログボタンが追加されました! さっそく試してみよう リブログって何? いいね!した人 |リブログ(0) 中川翔子さんの読者になろう ブログの更新情報が受け取れて、アクセスが簡単になります 読者になる ツイート 記事一覧 | ポケモンGO » 最近の画像つき記事 ドラゴンクエストライ… 昨日 アリーナ おととい ドラゴンクエストライ… おととい
dragnet  


青字の部分は僕がメインコンテンツだと判断した部分です. DOM PageRankはメインコンテンツ前後の多少のノイズを含んではいるものの,うまく抽出できています. 一方でdragnetは完全に抽出に失敗しています.

おわりに

今回は,半教師付きページランクをウェブページ(HTML文書)のメインコンテンツ抽出に応用してみました. さらに,簡単ではありますが,dragnetと性能を比較し,その実用性を示しました. この手法の強みは,初期重みを用いて,バイアスを入れることができるところです. 今回はメインコンテンツ抽出ということで,テキストノードは重要だというバイアスを入れました. もちろん,他の重みを使うこともできるので,重みを変えるだけで異なるアルゴリズムに変身します. 次回以降は,ウェブページの意味解析とかやりたいと思います.

コード

コードはgistに載せています.

一応ここにも載せておきます.