Wikipediaのデータを全探索する方法

　微妙に反響があったので。

https://x.com/hibit_at/status/1856998890811150686
 
　ルールを変えて同じようなことをやってみたい！　という方もいるかもしれないので、方法を共有します。
 
　昔は気合の総当たりスクレイピング（やめましょう）をやっていましたが、一応これが合理的ではないかと思う方法を示します。

# データ取得

　[https://dumps.wikimedia.org/jawiki/latest/](https://dumps.wikimedia.org/jawiki/latest/) に全データがあります……とは言っても、全データなのですごい量です。今回の解析では記事タイトルだけ必要なので、「jawiki-latest-all-titles-in-ns0.gz」のデータを使えば良いですが、タイトルだけでも $14,865,482$ B、つまり約 $14$ MBあります。展開すると更に倍ぐらいになります。

　「gz」という拡張子は UNIX 系で使われる拡張子で、Windows だと馴染みがないですが、[7-zip](https://7-zip.opensource.jp/) を使えば対応可能です。

　展開後のデータはこのようになっています。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/08e8522d-59f0-ad00-67e7-8f6555021cea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/64a2b871-71eb-bce7-894a-6c5aa95bd1c0.png)

　約 $2$ 百万タイトルほどあります。

　まあただのプレーンテキストなので、これなら全探索できる範囲です。

# 解析

　Python で解析を行います。こういう時は正規表現を使うと短くてスマートな実装をできることが多いですが、今回はある程度力押しで補正しています。

```python
import re

input_path = 'jawiki-latest-all-titles-in-ns0'

key = 'あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもやゆよらりるれろわゐゑをんゔ'
key += 'アイウエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモヤユヨラリルレロヮワヰヱヲンヴヷヸヹヺ'

with open(input_path, encoding='utf-8') as f:
    reader = f.read().split('\n')
    buffer = []
    for row in reader:
        # print(row)
        pat = r'^.ー.ー....$'
        res = re.match(pat,row)
        if res:
            txt = res.group()
            cnt = 0
            cnt += txt[0] in key
            cnt += txt[2] in key
            cnt += txt[4] in key
            cnt += txt[5] in key
            cnt += txt[6] in key
            cnt += txt[7] in key
            if cnt != 6:
                continue
            buffer.append(txt)
    for i in range((len(buffer)+5)//6):
        output = '、'.join(buffer[6*i:6*i+6])
        print(output)
```

　結果です。

```
すーぱーぷよぷよ、びービーみつばち、アープーレイウス、アーマードバトル、アーリーアクセス、アーリーアダプタ
アーリーウイング、アーリータイムス、アーリータイムズ、アーリーレインズ、アーリーロブスト、イーシーカレント
イージーフイルム、ウーウーリウリウ、ウーバーオニオン、ウーリーマンモス、エーコートランス、エーコープえひめ
エーコープライン、エーバースドルフ、エーバースブルク、エーラーシステム、オージーロイヤル、オーナーズクラブ
オーバーアマガウ、オーバーウエイト、オーバーウルゼル、オーバーエルザス、オーバーグルグル、オーバーコレクト
オーバーダビング、オーバードライブ、オーバードライヴ、オーバーハウゼン、オーバーブラウス、オーユーシステム
カーリーおばさん、キーホールテレビ、キーボードアンプ、キーボードトリオ、キーボードマニア、クーパーズタウン
クーパーハイタカ、クーパーユニオン、クーピーペンシル、ゲーマーグランマ、コーエーザベスト、コーキーとともに
コージーミステリ、コーヒーがりがり、コーヒーサイホン、コーヒーフラノン、ゴーゴーシステム、ゴーゴーバニラズ
ゴーパールガンジ、シーザースパレス、シーザーズパレス、シーターワカプラ、シーダーオルアン、シーフードドリア
シーホークホテル、シーモールパレス、スーパーあまいけ、スーパーいしはら、スーパーおおうち、スーパーおおぞら
スーパーおれんじ、スーパーくにびき、スーパーくまがい、スーパーくろさき、スーパーくろしお、スーパーしおかぜ
スーパーのアオキ、スーパーはつかり、スーパーふじおか、スーパーまつかぜ、スーパーまつばや、スーパーまるおか
スーパーやまびこ、スーパーよさこい、スーパーアルプス、スーパーアレスタ、スーパーエイジス、スーパーエイジズ
スーパーオキシド、スーパーカドイケ、スーパーガンダム、スーパークマさん、スーパーコルセア、スーパーサウルス
スーパーシマダヤ、スーパーシンザン、スーパースクラル、スーパースタジオ、スーパーストラト、スーパースライド
スーパースランプ、スーパーゼネコン、スーパーゼビウス、スーパータリカン、スーパートランプ、スーパードライブ
スーパードライヴ、スーパードラゴン、スーパーハイレグ、スーパーハナハナ、スーパーバンタム、スーパーヒドリド
スーパーヒロイン、スーパーフレンズ、スーパーペイント、スーパーペガサス、スーパーマグナム、スーパーマルトモ
スーパーマルハチ、スーパーミニコン、スーパーモリナガ、スーパーヤオスズ、スーパーヤマザキ、スーパーリミナル
スーラータンメン、セーカーハヤブサ、セーラーウラヌス、セーラーズあかね、ゼーオースタヂオ、ソーピードアンナ
ソーラーアサルト、ソーラーアナログ、ソーラーシステム、ターターシステム、ダーラーブギルド、ツーツーレロレロ
テーオーケインズ、テーオーロイヤル、テーラーホブソン、トーゴーサンピン、トーヨーシアトル、トーヨーリンクス
ニーダーザクセン、ハーバープリンス、ハーパーコリンズ、バーバーチズガメ、ヒーローポイント、ヒーローマガジン
ビーバースカウト、ビーバーテイルズ、ビービーエムエフ、ビービーガルダン、ピーシーエンジン、ピーターとマリア
ピーターバラカン、ピーターパンバス、フーコーのふりこ、フーバーブレイン、ブーブートレイン、ベーターカプセル
ペータースベルク、ペーパーどうぶつ、ペーパーウエイト、ペーパークラフト、ホーバークラフト、ホーボーとはいえ
ホーリードラモン、ホーリーバランス、ボーダーブレイク、ボーダープリント、ボーローポイント、ポーターズピンク
ミーノータウロス、メータースタンプ、モーターサイクル、モーターサイレン、モータースカウト、モータードライブ
モータードライヴ、モーターマガジン、ユーザーズガイド、ユーホーケミカル、ユーホーニイタカ、ユーラーヘルメス
ユーリーズナイト、ヨーヨーデスピン、リーダーにつづけ、リーダークライス、ルーキーパステル、ルーシーサイモク
ルーダースベルク、レーサーレプリカ、レーザーエンジン、レーザーカラオケ、レーザーブラスト、レーザープリンタ
レーザーポインタ、ローバースカウト、ローラーコンベア、ローワーマハノイ、ローワーメリオン、ワーナーマイカル
ワープーアオバト
```