WikipediaからPythonで特定ページやランダム記事を取得する方法
Pythonを使ってWikipediaの特定のページ(記事)や、ランダムに選んだページを取得する方法を解説します。大規模言語モデル(LLM)を使った実験や、データ解析の実験では、テスト用の文章データが欲しいことが度々あります。このような時、Wikipediaの文章データが手軽に入手うできて便利です。この記事では、APIを利用して、Wikipediaからページを取得する方法について解説します。
例えば、Wikipediaのテキストを使って近傍探索や、RAGの実験が行えます。以下は、実験例です。
はじめに
大規模言語モデル(LLM)やLangChainを用いた学習実験では、何らかの日本語のテキストデータを集めたいことがあります。このような場合に、Wikipediaの記事は有用なリソースとなります。
本記事では、Wikipediaから記事を収集するための便利な関数をいくつか作成します。これらの関数はWikipediaのAPIを利用して、特定のページや、ランダムにN記事を取得する関数です。自身のコードに組み込んで使うことができますし、これをテンプレートして新たな関数を作成することもできます。
この記事で作成した関数は以下の2つです
get_wikipedia_page(title)
title
で指定されたページを取得し、文書データを返す関数です。title
を指定することで任意のページをダウンロードできます。get_random_index(n)
n件のページのインデックスをランダムに抽出します。得られたインデックスには、get_wikipedia_page()
で使うタイトルも含まれているので、併せて使うことで、ランダムなページの内容を取得できます。
以下では、具体的な処理内容と使い方をサンプルコードをまじえて解説します。
①特定のページを取得する関数
get_wikipedia_page()
この関数は、特定のページを読み込むための関数です。title
にページのタイトルを入れると、ページをダウンロードして返します。
import requests
def get_wikipedia_page(title):
url = "https://ja.wikipedia.org/w/api.php"
params = {
"action": "query",
"format": "json",
"titles": title,
"prop": "extracts",
"exlimit": 1,
"explaintext": True,
"redirects": 1,
}
response = requests.get(url, params=params)
data = response.json()
page = next(iter(data['query']['pages'].values()))
return page.get("extract", "")
get_wikipedia_page関数の使い方
get_wikipedia_page()
の引数は、ページタイトルです。ページタイトルはブラウザのURLのリンク部分を見ることで確認できます。
以下のプログラムでは、取得したページのテキストに名前(wiki_page.txt
)をつけて保存しています。
page_content = get_wikipedia_page("少額投資非課税制度")
file_path = "./wiki_page.txt"
with open(file_path, 'w', encoding='utf-8') as file:
file.write(page_content)
②ランダムにNページのインデックスを取得する関数
get_random_index()
ランダムにNページのインデックスを取得する関数です。引数は、取得したいページ数です。実行すると、ページのid
とタイトルをタプル形式で返します。
import requests
def get_random_index(n) :
url = "https://ja.wikipedia.org/w/api.php"
params = {
"action": "query",
"format": "json",
"list": "random",
"rnlimit": f"{n}",
"rnnamespace": "0",
}
response = requests.get(url, params=params)
data = response.json()
index = []
for e in data['query']['random']:
index.append((e['id'], e['title']))
return index
get_random_indexの使い方①(インデックスを取得)
以下のように呼び出すだけです。
index = get_random_index(3)
print(index)
# [(1085797, '豊田市立山之手小学校'), (2417492, 'ドン・ムーマウ'), (354425, 'ジャン・ピエール・ブルギニョン')]
get_random_indexの使い方②(ランダムにページを取得し保存)
get_random_index()
とget_wikipedia_page()
を組み合わせることで、ランダムに選ばれたページの内容をダウンロードすることができます。
以下のプログラムは、ランダムにインデックスを10件取得し、ページのテキストをwiki_{id}.txt
の形式で保存する例になります。
index = get_random_index(10)
for id, title in index:
file = f"wiki_{id}.txt"
print(f"{title}--> '{file}'")
page_content = get_wikipedia_page(title)
with open(file, 'w', encoding='utf-8') as file:
file.write(page_content)
まとめ
wikipediaの内容をテキストファイルでダウンロードして保存する方法について、主に以下のサイトを参考に自分向けにカスタムし、関数化してみました。
wikipediaのapi.phpの説明ページ、結構分かりにくくて苦労しました。