2010年5月25日火曜日

Wikipediaからキーワードを集めてみる

火曜担当の三森です。今夜はみんな大好きなWikipediaについて調べていました!そして、自分の指定したキーワードの記事の中から、関連するキーワードの一覧を取得するスクリプトをpythonの練習がてら書いてみました。今日はそれを紹介したいと思います。

Wikipediaの記事の内容を引用しているサイトは沢山ありますが、「wikipedia API」でググるとsimpleapiというサイトが筆頭に来ます。このAPIを使えば、キーワードに対して簡単なサマリーを取得することができます。
これでは情報量が少ないので全文をダウンロードしたいという時は

http://ja.wikipedia.org/wiki/特別:データ書き出し/<検索キーワード>

にアクセスすると、記事のXMLデータが取得出来ます。ただ、このページはブラウザからなら見られますが、自前のプログラムからだとアクセスが拒否されてしまいました。本家のサイトが本格的にAPIを提供できないということだと思いますが、練習ならいいだろうということでブラウザを装ってアクセスするスクリプトを書いてみました。

Wikipediaの記法では、記事が書かれているキーワードへのリンクは
[[<キーワード>]]
というパターンになっています。これを利用して、あるキーワードに関する記事の中で、既に記事が書かれている別のキーワードを見つけようというわけです。

先読み、後読みが使える正規表現なら

(?<=\[\[)([^\[\]:]+)(?=\]\])

のように書くと<キーワード>にマッチさせることができます。コロン(:)が入っている場合は特別な意味になるので、これも省くようにしています。

ではスクリプトのソースコードです。XMLをパースするminidom、正規表現のre、urlアクセスのためにurllib、urllib2
などのモジュールを使いました。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from xml.dom import minidom
import re, urllib, urllib2

def encode(str):
return urllib.urlencode({"": str})[1:]

SPECIAL = encode("特別:データ書き出し")
kw = encode("小室哲哉")
kw_pat = re.compile(r"(?<=\[\[)([^\[\]:]+)(?=\]\])", re.U)

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
data = opener.open("http://ja.wikipedia.org/wiki/" + SPECIAL + "/" + kw)

lines = data.read()
dom = minidom.parseString(lines)
textData = dom.getElementsByTagName("text")[0].firstChild.data
words = kw_pat.findall(textData)
for word in words:
print word
print str(len(words)) + " keywords found!"


例えばキーワード「小室哲哉」で実行してみると

....
中田英寿
原田大三郎
DRAGON
坂本美雨
細木数子
スティーヴィー・ワンダー
スティーヴィー・サラス
高見沢俊彦
持田香織
1198 keywords found!

のように1198個ものキーワードリンクが見つかり、
かなりの人気記事であることが伺えます。

0 件のコメント:

コメントを投稿