サイト/ブログから本文抽出する方法
-
Upload
takuro-sasaki -
Category
Technology
-
view
5.600 -
download
3
description
Transcript of サイト/ブログから本文抽出する方法
第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まで