はじめに
NLPモデルを試すときに、コーパスとしてとりあえずWikipediaやLivedoorニュースを使ってみる例は結構あると思います。
しかし、技術系のコーパスとしてQiita記事もなかなか面白い結果が得られるよ!ってことで、その軌跡を記します。
今回のシリーズで作ったソースコードはGitHubに置いてあります。
Qiitaの全記事を取得してみる
はじめに、Qiita APIを使って全記事を取得します。
ソースコードは以下です。
このソースでは記事を投稿日毎にjson出力しています。
Qiita APIの詳細はこちら
# --------------------------------------------------
# Qiita APIから記事データを取得
# --------------------------------------------------
import requests
import json
import time
from datetime import datetime, timedelta
import os
headers = {
'Authorization': 'Bearer ' + os.getenv('ACCESS_TOKEN')
}
start = datetime.strptime(os.getenv('START_DATE'), '%Y-%m-%d') # 開始日を設定
end = datetime.strptime(os.getenv('END_DATE'), '%Y-%m-%d') # 終了日を設定
# API実行
results = []
for i in range((end - start).days):
today = (start + timedelta(i)).strftime('%Y-%m-%d')
print(today)
params = {
'page': 1,
'per_page': 100,
'query': 'created:' + today
}
res = requests.get('https://qiita.com/api/v2/items',
params=params, headers=headers)
results.extend(res.json())
total_count = int(res.headers['Total-Count'])
print('total_count: ' + str(total_count))
print(1)
time.sleep(3.6) # 3600秒に1000回まで
# 1日に101件以上投稿されていた場合
for j in range(2, total_count // 100 + 2):
params['page'] = j
res = requests.get('https://qiita.com/api/v2/items',
params=params, headers=headers)
results.extend(res.json())
print(j)
time.sleep(3.6) # 3600秒に1000回まで
# ファイル書き込み
with open('data/qiita_' + today + '.json', 'w') as f:
json.dump(results, f)
results = []
補足
取得対象の日付
end
は最新より少し昔に設定することをお勧めします。スパム記事が大量に投稿されており、まだ削除されていない可能性があるので・・・
end = datetime.strptime(os.getenv('END_DATE'), '%Y-%m-%d') # 終了日を設定
今回は.env
に以下の設定をしています。
START_DATE=2011-09-15
END_DATE=2019-07-01
アクセス制限
アクセストークンを設定した場合、1時間に1000回のアクセス制限があるため待機処理を入れています。
time.sleep(3.6) # 3600秒に1000回まで
ページング
page
、per_page
でページングができますが、100までしか対応していません。
つまり、一回のクエリで10000件を超える場合は取得できないので注意が必要です。
今回、記事を一日毎に取得しているのはそういう背景もあります(まさか1日に10000件以上投稿されることなんてないだろ・・・)。
params = {
'page': 1,
'per_page': 100,
'query': 'created:' + today
}
おわりに
次回→
Qiitaコーパスを作る会 2️⃣前処理をする
次々回→
Qiitaコーパスを作る会 3️⃣単語埋め込みの様子を見てみる