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

31
第2回Webスクレイピング勉強会@東京 サイト/ブログから 本文抽出する方法 2014年8月17日 @dkfj 佐々木拓郎

description

ルールベースとヒューリスティック、二つの方法でサイト/ブログから本文抽出する方法

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

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

第2回Webスクレイピング勉強会@東京 !

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

2014年8月17日 @dkfj 佐々木拓郎

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

✦ プロフィール

‣ 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

自己紹介: 佐々木拓郎

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

主にJAWSUG大阪で活動しています (AWS勉強会)

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

「Rubyによるクローラー開発技法」

Rubyのクローラー/スクレイピング本を 書きました。8月24日に発売予定です。

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

本日のテーマ !

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

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

本日のテーマ !

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

何故、必要なのか?

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

一般的なブログの構造

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

ブログ タイトル

サイド メニュー

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

ブログ タイトル

サイド メニュー

本文

記事 タイトル

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

ブログ タイトル

サイド メニュー

本文

記事 タイトル

欲しいのは、本文

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

サイト/ブログの本文抽出の目的

• 書かれている記事を読みたい • コーパス/解析の元データとして利用したい

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

コーパスとは?

 コーパス(corpus)とは、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。構造化では言語的な情報(品詞、統語構造など)が付与される。コンピュータ利用が進み、電子化データとなった。 !

ウィキペディアより

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

自然文としてのブログの特徴

• 新聞に較べて、口語に近い単語/フレーズが出現する • タグやカテゴリーなどのメタデータがあり、分類しやすい • 投稿者の属性を、ある程度推定できる   ex) 男性/女性、社会人/学生、10代、20代、30代

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

自然文としてのブログの特徴

• 新聞に較べて、口語に近い単語/フレーズが出現する • タグやカテゴリーなどのメタデータがあり、分類しやすい • 投稿者の属性を、ある程度推定できる   ex) 男性/女性、社会人/学生、10代、20代、30代

わりと貴重なデータ

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

本文抽出の方法

• パーサーを利用して、HTML構造を分析しての抽出 • 自然言語処理を利用して、本文らしさを分析しての抽出

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

HTMLの構文解析

!

• 取得対象のHTMLの構文を分析して、本文を抽出 • いわゆるルール・ベース   ex) HTMLのタグのidが、contentのものを取得

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

はてなブログの場合entry-contentの中が

ブログ本文

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

HTMLの構文解析メリット

• 正確に本文を抽出できる • 比較的、(コンピュータリソースの)負荷が低い デメリット

• ブログ種別ごとに、開発が必要 • 取得元のHTML構造の変更に弱い

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

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

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

• 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

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

自然言語処理を利用した本文抽出

• 文章内から本文らしい部分を抜き出す • ヒューリスティック(経験則) • 自分で一から実装するのは、割と大変

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

本文抽出モジュール

• ExtractContnt (Ruby) • HTML::Extract (Perl) • HTML-Feature (Perl) • ExtractContnt/webextract.py (Python)

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

ExtractContentの実装

• html をブロックに分離、スコアの低いブロックを除外 • 評価の高い連続ブロックをクラスタ化し、クラスタ間でさらに比較を行う

• スコアは配置、テキスト長、アフィリエイトリンク、フッタ等に特有のキーワードが含まれているかによって決定

• Google AdSense Section Target ブロックには本文が記述されているとし、特に抽出

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

自然言語処理を利用した本文抽出

メリット

• ブログ種別に依存しない • 取得元のHTML変更に強い デメリット

• 構文解析に比べると、精度が落ちる • 比較的、(コンピュータリソースの)負荷が高い

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

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

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

まとめ

• 本文抽出の方法は、主に2種類 • どちらも一長一短あるので、用途に応じて使う • 正確さを期すならば、HTMLの構文解析  ⇒書かれている内容、そのものが必要な場合

• 厳密さがいならいのであれば、本文抽出モジュール  ⇒コーパスや解析用の元データとして利用

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

今日の話は、 この辺に書いています

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

おまけ

キーワード抽出

• 辞書方式 • Mecabを利用した未知語抽出

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

おまけ その2

特徴語抽出

• TD/IDFが一般的 • Yahooのキーフレーズ抽出APIなどもあり  http://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html

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

ご清聴ありがとうございました 後日の質問は、@dkfjまで