2016年6月4日土曜日

ブログをスクレイピングしてKH Coderで分析する

Raspberry PiとPythonでスクレイピングをするでこのブログのスクレイピングを試したので、今度はブログのすべての投稿を取得して、KH Coderでテキストマイニングする。KH Coderはテキストデータを統計的に分析できるフリーソフトウェア。KH CoderではExcelファイルを取り込めるので、Pythonでスクレイピングしたテキストをcsvファイルにして、ExcelでxlsファイルにしてKH Coderで分析する。以下はその手順。

1.ブログ本文のスクレイピング
以下のPythonとBeautifulsoup4のコードで、このブログの本文を取り込める。
# ライブラリの読み込み
from urllib.request import urlopen
from bs4 import BeautifulSoup

# スクレイピングするページのurl 
reviewUrl = 'http://sample.com/blog/sample.html'

# 指定したurlからデータを読み込む
htmlData = urlopen( reviewUrl ).read()
# パーサーに「html.parser」を指定してデータを解析
htmlParsed = BeautifulSoup( htmlData, 'html.parser' )
# ブログ本文の取り込み
content = htmlParsed.find( 'div', class_='entry-content' ).find( 'div' ).text
ただし、KH Coderで読み込むには多少のテキストの整形が必要。まずは、テキスト前後の空白、テキスト中の改行を取り除く。また、csvファイルを作成するので、半角カンマを全角カンマに変換する。プログラムコードを除外したいので、プログラムコードの表示に使用しているpreタグ部分も取り除く。

2.リンクurlの取得
すべての投稿をスクレイピングするには各ページのurlを取得する必要がある。ブログには前後のページへのリンクがあるので、それをたどっていく。リンク部分のHTMLは以下のようになっている。

1番古い投稿からはじめ、「次の投稿」のリンクをたどっていきすべてのブログをクロールするには、classがblog-pagerのdivタグとidがblog-pager-newer-linkのspanタグで検索すれば、目的のリンク先urlを取得できる。Beautifulsoup4を使うと以下のようなコードで目的のurlを取得できる。
htmlParsed.find( 'div', class_='blog-pager' ).find( 'span', id='blog-pager-newer-link' ).a.get( 'href' )
ここまできたら、あとはループで最新の投稿まで繰り返してcsvファイルに出力すればよい。

3.Excelファイルの作成
Raspberry Piの文字コードがUTF-8なので、作成されるcsvもUTF-8。Excelでこのまま開くと文字化けするので、Raspberry PiでSHIFT-JISに変換する。ここではblogger.csvの文字コードを変換してblogger_s.csvを作成。
$ iconv -f UTF8 -t SHIFT_JISX0213 blogger.csv > blogger_s.csv
※以下のコマンドだとエラーになってしまう。
$ iconv -f UTF8 -t SJIS blogger.csv > blogger_s.csv
iconv: 位置 939 に不正な入力シーケンスがあります
続いて、Excelでcsvを開いて、先頭行にラベルを追加する(KH Coderで読み込んだときに先頭行はラベルとみなされる)。 最終的に以下のようなExcelファイルができた。

4.KH Coderでの取り込み
KH Coderでのデータ取り込みはこちらを参照。リンク先はテキストファイルを取り込む場合で、Excelファイルの場合は、読み込んだ後に以下のように分析対象のテキストを含む列を選択する。他はテキストファイルの場合と同じ。

5.KH Coderでの分析
抽出語リストと共起ネットワークを出力した。結果は以下の通り。

[抽出語リスト]


[共起ネットワーク]
※出現数の多い語ほど大きな円で描画されている。また、赤い語は中心性の高い語。

せっかくなので無理矢理分析を試みる。共起ネットワークをみると、KH Coder、Raspberry Pi、Three.js 関連の語がそれぞれ集まっていて、KH Coderで分析しなくても明らかなことだが、主な投稿ネタになっていることが分かる。投稿数だとThree.jsネタが一番多いが、KH Coderの結果ではKH Coder関連の語の出現数が多い。これは意外な結果だったが、よくよく投稿をみてみたら、1投稿当たりではKH Coder関連の投稿の文章量が他の投稿よりも多いので、そのためと思われる。KH Coderネタは割と気合いを入れて書いたのだろうか、それとも他が手抜きなのか。いずれにしても34という少ないサンプル数では正確なことはわからないと思う。サンプルがもっと多ければ何かの傾向がわかるかもしれないので、投稿数が増えたらまたやってみたい。

0 件のコメント:

コメントを投稿