個人的な備忘録として残します。
手早くファイルを得られるよう、なるべく簡潔に書きたいと思います。
完成予想図
Wikipediaのリダイレクトを収集して以下のようなファイルを作ります。
{"src": "COVID-19", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "COVID-2019", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "Covid-19", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "Covid-2019", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "新型コロナウイルス感染症", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "コビッド19", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "COVID19", "dst": "新型コロナウイルス感染症_(2019年)"}
{"src": "2019新型コロナウイルス感染症", "dst": "新型コロナウイルス感染症_(2019年)"}
リダイレクトとは
以下参照
Wikipedia:リダイレクト
リダイレクト例
https://ja.wikipedia.org/wiki/COVID-19 にアクセスしようとすると、
自動的にhttps://ja.wikipedia.org/wiki/新型コロナウイルス感染症_(2019年) に飛ばされます。
実装等
0. 必要な色々
- MySQL
- Python3
- mysqlclient
pip install mysqlclient
1. Wikidumpのリストア
必要データのダウンロード
以下から必要なデータをダウンロードしてください。
jawiki-[dump取得日]-redirect.sql.gz
jawiki-[dump取得日]-page.sql.gz
解凍
$ gunzip jawiki-[dump取得日]-redirect.sql.gz
$ gunzip jawiki-[dump取得日]-page.sql.gz
MySQLデータベースへリストア
$ mysql -u [ユーザー名] -p [DB名] < jawiki-[dump取得日]-page.sql
$ mysql -u [ユーザー名] -p [DB名] < jawiki-[dump取得日]-redirect.sql
2. リダイレクト抽出
Pythonコード
データベースを叩いてリダイレクトを抽出しJSONで保存するコードです。
import json
import MySQLdb
USERNAME = "[MySQLユーザー名]"
PASSWORD = "[パスワード]"
DB_NAME = "[DB名]"
OUTPUT = "./redirects.json"
def save_jsonl(file_path, data):
json_dumps = lambda d:json.dumps(d, ensure_ascii=False)
dumps = map(json_dumps, data)
with open(file_path, "w") as f:
f.write("\n".join(dumps))
if __name__ == '__main__':
# データベースに接続
conn = MySQLdb.connect(
user=USERNAME,
passwd=PASSWORD,
host='localhost',
db=DB_NAME
)
# Cursorを作成しクエリを実行
cur = conn.cursor(MySQLdb.cursors.DictCursor)
sql = "select page.page_title, redirect.rd_title from page, redirect where redirect.rd_from=page.page_id"
cur.execute(sql)
rows = cur.fetchall()
# 実行結果を整理
redirects = []
for row in rows:
row = {key:cell.decode() if type(cell) is bytes else cell for key, cell in row.items()}
redirects.append({
"src":row["page_title"],
"dst":row["rd_title"]
})
# 保存
save_jsonl(OUTPUT, redirects)
cur.close()
conn.close()
実行
python extract_redirects.py
以上です!
α. 軽い解説等
※事前知識:Wikipediaのページにはtitle
の他にpage_id
が個別に割り振られています。
jawiki-[dump取得日]-redirect.sql.gz
では、リダイレクト元のpage_id
とリダイレクト先のtitle
がレコードで紐づけられています。
jawiki-[dump取得日]-page.sql.gz
では、page_id
とtitle
がレコードで紐づけられています。
この2つのダンプを組み合わせることで、リダイレクト元title
とリダイレクト先title
を紐づけています。