【Python】クイズを作問するアルゴリズムを考えたよ【試作版】
唯坂 優(たださか ゆう)です。
皆さん、クイズ好きですか?
あなたはどうか知りませんけど、世間の人ってみんなクイズ好きなんですよ。
TVをザッピングしてみてください。絶対どっかしらの局でクイズやってますから。
…しかしながら。
こんなペースでクイズを消費しまくっていたら、
そのうち問題が枯渇するのでは…?
想像してみてください。
ありとあらゆるクイズがベタ問と成り果てた、
知識の荒野であえぐクイズ亡者たちの姿を。
そんな未来を否定すべく、
クイズを自動生成するコードを書きましたのでお披露目いたします!
コード概観
import func
import wikipedia
import ast
import random
import re
wikipedia.set_lang("ja")
def quiz(word=False):
if not word:
_list=[]
for i in [v for k,v in eval(func.txtfile("word.txt")).items() if "名詞" in k]:
_list.extend(i)
word=random.choice(_list)
for i in wikipedia.search(word):
code_regex=re.compile('[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉『』【】&*・()$#@。、?!`+¥%]')
i2=code_regex.sub('',i)
if i2!=i:
continue
try:
wp=wikipedia.page(i)
break
except wikipedia.exceptions.DisambiguationError:
pass
quiz_list=wp.summary.split("。")
hint_a=quiz_list[0]
hint_b=[qi for qi in quiz_list if i not in qi and len(qi)>0]
if len(hint_b)!=0:
hint_b=random.choice(hint_b)+"、"
inp=input(hint_b+hint_a.split("、")[-1]+"。これは何?\n")
if wikipedia.search(inp)[0]==wikipedia.search(i)[0]:
print("正解!答えは "+i)
else:
print("残念!答えは "+i)
まだバグも出ますが試作品ってことでご勘弁いただきたく。
現代の集合知たるWikipedia様から情報を引っ張ってきてクイズの定型文に突っ込む感じですね。
細かく解説するのめんどくさいので、
ここからはさっさと実際に生成された問題に挑戦してみたいと思います!
第一問
知らね〜!!
ちゃんと問題文のテイにはなってますけど、シンプルにこっちの知識が足りてない。
全然わかんないんで、適当に『ルーン文字』って答えておきます。
結局知らね〜〜!!
聞いたこともないぞそんな文字…
なんか『ムー』的な話に興味ある人はチェックしてみては。(脱線)
第二問
待って。
これ下手するとめちゃくちゃ失礼になっちゃうやつだ。
いろんな言葉が過りますけどことごとく失礼な気しかしない。
無難に『ご老体』とでもしておきますか。
…翁ってそうなんだ。
『翁』なんて言葉、竹取物語でしか聞いたことないぞ。
そんな細かいニュアンス知らんがな。
第三問
知らんがな!!!!!!!!
Wikipediaにスリーサイズを載せるな。
仮にコレで当てたとしたら僕もナニモンなんだよ。
韓国の女優で知ってるの一人しかいないし、『チェジウ』でいいか。
…知らんがなって言いにくい!!!
ぶっちゃけ聞いたこともない…韓国女優好きの方、読んでたらホントすみません。
っていうかスエさんに一番すみません。
第四問
知らんけど、クイズ王とかなら即答できそうな雰囲気がすごい。
東○王とかで出てても違和感ない感じだ。かなり満足!
けどシンプルにわからんので、解答は『エッフェル』で。
…やられたッッ!!!!
たまにある、「まんまやないかい問題」!!!
第五問
情報量が少なすぎるッ…!
とはいえ、「日本作詩家協会副会長」って肩書きがあれば一意に定まる…のか?
設計上、情報の抜き出しはほぼランダムなので
物によっちゃ解答不可能みたいな問題文も出かねないですが。
一応の答えは作詞家でパッと思いついた『滝廉太郎』で。
人物が答えになると「知らんがな」ツッコミが使いにくいな!
第六問
じゃあ川上アキラじゃねぇか!!!!!
たまにこのバグ出るんですよね。
一応解説しますと、
hint_b=[qi for qi in quiz_list if i not in qi and len(qi)>0]
ここで解答となる文字列を含んでる文章は問題文として採用しないように弾いてるはずなんですが、
人名がタイトルの記事だと本文中にその人の名前がスペース区切りで苗字と下の名前に分けられてるパターンがちょいちょいあるんですよね。
そうなっちゃうと、同じ文字列だと認識できずに問題文が語るに落ちちゃう今回のようなバグが発生するわけです。まぁ伸びしろですわな!
もちろん解答は『川上アキラ』です。
やったぁぁぁぁぁぁぁぁぁ!!!!!!(大ヤラセ)
正解をもぎ取れて溜飲も下がりましたので今回はこの辺で。
またちょいちょい改良を加えて精度を高めていきたいですね。
僕ばっかり楽しんでてもアレなんで、
せっかくここまで読んでくれた方のために、このコードで生成した問題をいくつか追加で掲載しておきます。
※下記の問題は全て本記事内で紹介したコードによって自動生成されたものであり、出力をそのままペーストしたので複数解や誤った解答が含まれている可能性があります。予めご了承ください。
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Q8
Q9
Q10
全ての正解は↓下記↓
お楽しみいただけましたでしょうか。
それではまた次回!
この記事が気に入ったらサポートをしてみませんか?