プログラミング
記事内に商品プロモーションを含む場合があります

WikipediaからPythonで特定ページやランダム記事を取得する方法

Aru

Pythonを使ってWikipediaの特定のページ(記事)や、ランダムに選んだページを取得する方法を解説します。大規模言語モデル(LLM)を使った実験や、データ解析の実験では、テスト用の文章データが欲しいことが度々あります。このような時、Wikipediaの文章データが手軽に入手うできて便利です。この記事では、APIを利用して、Wikipediaからページを取得する方法について解説します。

例えば、Wikipediaのテキストを使って近傍探索や、RAGの実験が行えます。以下は、実験例です。

LangChainのFaissを活用した近似最近傍探索の手順を解説
LangChainのFaissを活用した近似最近傍探索の手順を解説
LangChainで実装するRAG|CALM2 + FAISS + RetrievalQAを使った具体例
LangChainで実装するRAG|CALM2 + FAISS + RetrievalQAを使った具体例

はじめに

大規模言語モデル(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の説明ページ、結構分かりにくくて苦労しました。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました