SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

PythonでWebスクレイピングと形態素解析。

Webは情報の宝庫なのでクローラーを作って巡回させたりすると楽しい。僕も入社1年目の時に検索エンジンを自作して一人遊んでいたが、最近また久しぶりにスクレイピングで遊んでみた。

Webページをスクレイピングして、そのページを特徴付ける単語を抽出したい時、PythonだとBeautifulSoupとMeCabを利用すれば簡単に抽出できる。urllib2でHTMLを読み込んであげたあと、BeautifulSoupに渡してあげるとHTMLタグごとの操作が簡易的になったりして、Parseがとても簡単に出来るようになる。たとえば、soup.find_all("a")を指定すると、タグaの情報を全て取得できるようになり、このようにBeautifulSoupを使うと、HTML中の必要な情報の操作がとても楽になる。

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("http://example.com")

soup = BeautifulSoup(html)
soup.find_all("a")


Webページを特徴づける単語を抽出したい場合は、Webページ中のタグを除去し、まずはテキストを抽出してあげる。テキストの中にはHTMLの静的な文字列*1が埋め込まれていたりするため、今回は形態素解析MeCabを使って動詞を含む文字列を抽出対象としている。Webページ内の本文テキストを抽出したあと、正規化をしてあげた上で、再度形態素解析を行い、名詞のみを抽出している。固有名詞は文章を特徴付けやすいため、文書中での出現回数が多い名詞がスクレイピングをしたWebページの特徴単語としている。


結果①「日経スポーツ記事: 野球国際大会」

     word  count
0       野球     10
19
27
37
4       決勝      6
56
6       日本      6
7     スポーツ      5
85
95
10    プレミア      4
11      プロ      4
124
134
144
15      桃園      4
16      台湾      4
17    オランダ      3
183
19   大リーガー      3
20    サヨナラ      3
21      勝ち      3
22       U      3
233
24      科学      3
253
26      監督      3
27  プエルトリコ      3
28     スマホ      2


結果②「日経経済記事: 携帯料金引き下げ」

URL:http://www.nikkei.com/article/DGXLASGC26H1S_W5A121C1EE8000/
   word  count
0    携帯     12
1    料金      9
2    会議      7
3   スマホ      7
4    総務      6
5    規制      6
6   プラン      5
7    格安      5
8    端末      5
9   有識者      4
10   軽減      4
11   割安      4
124
13   大手      4
143
15   設定      3
16   通信      3
17   利用      3
183
193
20  値下げ      3
213
223
23   負担      3
24   議論      3
253
263
27   教授      2
28   電話      2


結果を見てみるとそれっぽい単語が抽出できている。

ただ、単語の羅列を見てもらえればわかると思うが、ストップワードの取り除きといったきちんとした正規化ができていない。たとえばこれらのWebページをNaiveBayesといった文書分類器に通してカテゴリー分けをしたいといった時は、ゴミ単語が混ざっていると分類の精度が悪くなってしまう可能性がある。データの前準備はモデルに通す前の重要なプロセスであるため、自然言語処理を用いて機械学習の精度を出せるようにもう少し考えないといけなくなる。とはいえ、Webページの特徴ワードを抽出するだけなら、PythonでBeutifulSoupとMeCabを利用すればさくっと書くことができる。


Webの情報を収集してうにゃっとすると面白いのでオモチャとして遊んでみるとよいかと。

*1:たとえば、「次へ」といったリンクなど