一枚謎の自動生成をやってみる
謎解きゲームの序盤で出てくるイラスト系の一枚謎を自動生成するスクリプトを作成してみた。
技術的な内容としては、webサイトのスクレイピングの初歩を学ぶことができた。
言語&ライブラリ : python , requests , BeautifulSoup , OpenCV
1. 一枚謎とは?
リアル脱出ゲーム( (株)SCRAPの商標 )を筆頭に、謎解きゲームがここ数年で広がりを見せている。
私も2年ほど前に友人に誘われて公演に参加したのをきっかけに、今では月2回ほどのペースで参加するようになった。
その中で、公演の序盤によく出てくる、紙1枚で問題が完結しているものを一枚謎と言ったりする。
パズル系の問題を除けば、基本的には閃けば数秒で回答できるものがほとんどである。
( TwitterなどWebで公開されている解き直しまくる系一枚謎は例外 )
たとえばこんな感じ(※自動生成ではありません。クオリティはお察しください)
例1
引用
https://www.ac-illust.com/main/detail.php?id=92571
例2
引用
※回答はページ最後に
言ってしまえば親父ギャグのような謎。
今回作成したのは、例2のような複数の画像をつなげる解き方の謎を自動生成するもの。
単語をインプットすると、それが回答となるような親父ギャグ謎を自動生成するスクリプト。
2. 手順
処理手順は3step
- インプットされた単語を、"意味の通じる"単語に分割
- 分割された単語に適合する画像を検索し取得
- 取得した画像を合わせて一枚の謎に
step1,step2はスクレイピング、step3は画像処理を活用。
3. step1 単語の分割
機械的に単語を分割するだけなら特に工夫は必要ないが、今回は、"意味の通じる"単語に分割する必要がある。
ここでのポイントは、ある文字列が"意味の通じる"単語であるかをどう判定するかということ。
ここでは"意味が通じる"を具体的に以下のように定義した。
- 世の中に存在する単語である
- 人によって言い回しが変化することがない
- 万人が知っている単語である
1つ目は当然のごとく、存在しない単語はただの文字列である。
2つ目、人や地域によって言い方が異なるような単語は、その地域でしか通じないため避ける。
(例:絆創膏 = サビオ、カットバン、バンドエイド、リバテープ ...)
3つ目、難しい単語や専門用語など、一部の人しか知らないような単語は避ける。
小中学生でもわかるような義務教育レベルの単語が理想。
ただし、3つ目の判断方法が難しい。
試して見た結果、普段使用しないような単語や、単語でない文字列も補完されて近い単語がサジェストされてしまった。
そこで今回利用したのは、以下のページ。
謎解きや謎製作で単語の検索で活用させてもらっているページ。
wikipediaやgoogleと比べ、マニアックな単語が少なく、補完もされない。
otoge-programing.hatenablog.jp
例
■imput
"いんすうぶんかい"
■output
['いん', 'すう', 'ぶん', 'かい']
['イン', '数', '文', '貝']
クロスワード辞典では、複数の漢字が出てくることがあるため、とりあえず先頭の漢字を使用
例 : ['カイ', ['貝', '下位']] →"貝"
これにより、ひとつの単語を複数の単語に切り分けることができた。
4. step2 画像検索
次に、それぞれの単語に対し、対応する画像を取得する。
例: ['イン', '数', '文', '貝']
当初は、例2と同じくみんな大好き"いらすとや"さんを使用するつもりでいたが、上のような単語単体で検索しても、思ったような画像が探せずに断念。
"いらすとや"の画像を用いた一枚謎をSNS等で拝見していたが、画像選びにも人間の手(センス)が求められることを学んだ。
そのため、多少カオスになることを覚悟しつつ、今回はみんな大好き?google画像検索を利用することに。
<具体的なスクレイピング方法は別記事にて記載予定>
例: ['イン', '数', '文', '貝']
<img alt="「イン」の画像検索結果" height="84" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-Ei0NWjEI5Qnd4MiAzw8X2FLQSo5OkLPLfyObM60ZFZt1ZLzQYnI7gWxm" width="150"/>
https://www.google.co.jp/search?q=%E6%95%B0&tbm=isch
<img alt="「数」の画像検索結果" height="123" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTpxoKtVPiUuxGiiw-9OwLnuDcBVTv-XvgOsftRueD11XGkIba__bOK1A" width="124"/>
https://www.google.co.jp/search?q=%E6%96%87&tbm=isch
<img alt="「文」の画像検索結果" height="123" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS6rAO4WBOF8CXimIF8DC83zOScFiIL8Z-SMfsCRP3Ovcr7ok3YzQBU0w" width="124"/>
https://www.google.co.jp/search?q=%E8%B2%9D&tbm=isch
<img alt="「貝」の画像検索結果" height="114" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSnEhxGlUaj-_3lW54d4FJ_XeQDZv6F-6hdFYcnbGkaYvf7ahZycGywEw" width="114"/>
5. step3 一枚謎に合成
※未実装
ひとまずstep2で取得した画像を手動で並べるとこちら。
例
- "イン"で検索すると東横インの画像が真っ先に出てくるのか
- 数の画像で、答えがそのまま出てきてしまっている
等つっこみどころは多々あるが、ひとまず形にはなった。
まとめ
所感
思いつきで作ったこともあり、とても一枚謎のクオリティに達しているとは言いがたいが、google画像検索のおかげで、いい感じにカオスなものが生成されて、適当な単語を生成するだけで面白い感じになるので、個人的には満足。ただ、step1,2どちらも改良の余地あり。
スクレイピングについて、手を動かして学ぶことができた。
わかっていたことだが、謎製作はクリエイティブな作業である。
おまけ
上記スクリプトで自動生成した謎をいくつか。
分かるか!といいたくなるようなもの多数なので、ネタとして見てください。
おまけ1
一言:まだまともな問題
おまけ2
一言:"けん"で3番目の画像がでてきてしまうのか...
おまけ3
一言:四字熟語。人物が写ってしまっている部分は別途隠しています。
おまけ4
一言:ライトノベル作品。入力単語を前から機械的に単語を分割するだけのやり方だと、長い単語はうまくいかない。
おまけ5
一言:音ゲーマーなら知っている(かもしれない)単語。現状のやり方だと、カタカナ(英語)が入ってもあまりうまくいかない。
お付き合いいただき、ありがとうございました。
回答一覧
例とおまけの回答となります。
例1 ひよこ
(ひ が横になっている)
例2 ネットワーク
(網、仕事の画像。それぞれ英語でネット、ワーク)
おまけ1 水泳
(水、エイの画像)
おまけ2 埼玉県
(差異、玉、県の画像)
おまけ3 意気投合
(息、塔、業の画像。人の写真も遠慮なくサジェストしてくるgoogle先生)
おまけ4 ノーゲームノーライフ
(NO,ゲーム,らい の画像。"らい"で単語として認識され、ライ麦パンが画像検索された様子)
おまけ5 猫叉マスター
(猫、股、鱒の画像。魚の種類で単語認識されると、魚の種類当てクイズに変化してしまう課題)