第2回Webスクレイピング勉強会@東京
!
サイト/ブログから
本文抽出する方法
2014年8月17日
@dkfj 佐々木拓郎
✦ プロフィール
‣ Webシステムを得意とするSIerで勤務
‣ 最近の仕事はAWS事業の推進
‣ Webスクレイピングして、データマイニングするのが趣味
★ ソーシャル・ネットワーク
‣ blog: http://blog.takuros.net/
‣ twitter: @dkfj
‣ Facebook: takuro.sasaki
‣ SlideShare: http://www.slideshare.net/takurosasaki/
‣ http://www.justyo.co/TAKUROS/
@dkfj
自己紹介: 佐々木拓郎
主にJAWSUG大阪で活動しています
(AWS勉強会)
「Rubyによるクローラー開発技法」
Rubyのクローラー/スクレイピング本を
書きました。8月24日に発売予定です。
本日のテーマ
!
サイト/ブログから
本文抽出する方法
本日のテーマ
!
サイト/ブログから
本文抽出する方法
何故、必要なのか?
一般的なブログの構造
ブログ
タイトル
サイド
メニュー
ブログ
タイトル
サイド
メニュー
本文
記事
タイトル
ブログ
タイトル
サイド
メニュー
本文
記事
タイトル
欲しいのは、本文
サイト/ブログの本文抽出の目的
• 書かれている記事を読みたい
• コーパス/解析の元データとして利用したい
コーパスとは?
 コーパス(corpus)とは、言語学において、自然言語処理の
研究に用いるため、自然言語の文章を構造化し大規模に集積した
もの。構造化では言語的な情報(品詞、統語構造など)が付与さ
れる。コンピュータ利用が進み、電子化データとなった。
!
ウィキペディアより
自然文としてのブログの特徴
• 新聞に較べて、口語に近い単語/フレーズが出現する
• タグやカテゴリーなどのメタデータがあり、分類しやすい
• 投稿者の属性を、ある程度推定できる
  ex) 男性/女性、社会人/学生、10代、20代、30代
自然文としてのブログの特徴
• 新聞に較べて、口語に近い単語/フレーズが出現する
• タグやカテゴリーなどのメタデータがあり、分類しやすい
• 投稿者の属性を、ある程度推定できる
  ex) 男性/女性、社会人/学生、10代、20代、30代
わりと貴重なデータ
本文抽出の方法
• パーサーを利用して、HTML構造を分析しての抽出
• 自然言語処理を利用して、本文らしさを分析しての抽出
HTMLの構文解析
!
• 取得対象のHTMLの構文を分析して、本文を抽出
• いわゆるルール・ベース
  ex) HTMLのタグのidが、contentのものを取得
はてなブログの場合
entry-contentの中が
ブログ本文
HTMLの構文解析
メリット
• 正確に本文を抽出できる
• 比較的、(コンピュータリソースの)負荷が低い
デメリット
• ブログ種別ごとに、開発が必要
• 取得元のHTML構造の変更に弱い
nokogoriを使って取得
require 'open-uri'
require 'nokogiri'
!
html = open('http://blog.takuros.net/entry/
20140104/1388788175').read
!
doc = Nokogiri::HTML(html)
puts doc.xpath("//div[@class='entry-content']").text
• HTML/XMLの構文解析器(パーサー)
• ほぼデファクトスタンダード
• XPath or CSSセレクタで、HTML中の要素を選択
• UTF-8以外の文字コードを扱う場合は注意
require 'nokogiri'
require 'open-uri'
!
doc = Nokogiri.HTML(open("http://nokogiri.org/"))
doc.css('a').each do ¦element¦
puts element[:href]
end
参照:Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath
http://blog.takuros.net/entry/2014/04/15/070434
自然言語処理を利用した本文抽出
• 文章内から本文らしい部分を抜き出す
• ヒューリスティック(経験則)
• 自分で一から実装するのは、割と大変
本文抽出モジュール
• ExtractContnt (Ruby)
• HTML::Extract (Perl)
• HTML-Feature (Perl)
• ExtractContnt/webextract.py (Python)
ExtractContentの実装
• html をブロックに分離、スコアの低いブロックを除外
• 評価の高い連続ブロックをクラスタ化し、クラスタ間でさ
らに比較を行う
• スコアは配置、テキスト長、アフィリエイトリンク、フッ
タ等に特有のキーワードが含まれているかによって決定
• Google AdSense Section Target ブロックには本文が記
述されているとし、特に抽出
自然言語処理を利用した本文抽出
メリット
• ブログ種別に依存しない
• 取得元のHTML変更に強い
デメリット
• 構文解析に比べると、精度が落ちる
• 比較的、(コンピュータリソースの)負荷が高い
nokogoriを使って取得
require 'extractcontent'
require open-uri'
!
html = open( 'http://blog.takuros.net/entry/
20140104/1388788175').read
!
content, title = ExtractContent.analyse(html)
puts title
puts content
まとめ
• 本文抽出の方法は、主に2種類
• どちらも一長一短あるので、用途に応じて使う
• 正確さを期すならば、HTMLの構文解析
  書かれている内容、そのものが必要な場合
• 厳密さがいならいのであれば、本文抽出モジュール
  コーパスや解析用の元データとして利用
今日の話は、
この辺に書いています
おまけ
キーワード抽出
• 辞書方式
• Mecabを利用した未知語抽出
おまけ その2
特徴語抽出
• TD/IDFが一般的
• Yahooのキーフレーズ抽出APIなどもあり
 http://developer.yahoo.co.jp/webapi/jlp/keyphrase/
v1/extract.html
ご清聴ありがとうございました
後日の質問は、@dkfjまで

サイト/ブログから本文抽出する方法