語群からキーワードを選択する問題を作成する
やりたいこと
問題文の空欄に入る適切な語句を語群から選択する問題を簡単に作る。
特に、キーワードにランダムな記号を割り当てて、記号順にソートするところがめんどうなので、これを自動化したい。
僕のブログから、適当な文章を抜き出して、問題文としてみる。
まだやっていないこと
- 問題文から選択肢群をスクリプトで抜き出すこと。
- 選択肢を抜き出した問題文の[]に自動で解答番号を入れること。
簡単にやれるけど、今日は早くテスト作らないと締切に間に合わないので、次回に回すことにした。
なんか、テストのたびにスクリプト書いてる気がするので、記録に残しておく。
例
問題文は次のようにする。正しい選択肢に続けて|を入れて、ダミー選択肢を入れる。別にダミーがなくて選択肢一つでもかまわない。 こうしておくと、各解答欄の最初のキーワードを正答として集めてくれる。
解答候補は重複していてもかまわない。後で重複は削除する。
Zoteroは[ライブラリ|ブラブラリ]とオンラインのアカウントが紐ついているので、別アカウントと同期することは[できない|できる]。 今回、紐付けを[削除|強化|あれ]して、別アカウントと同期できたので、記録に残す。 小学生から[高校生|中学生]までの計算[ドリル|地獄]を自動で生成してくれる。これ、かなりいいツールだ。 ただ、僕の環境では[pLaTeX環境|Word|Excel]がない。そこで、LuaLaTeXに対応させてみた。
ここが次に自動化したいところだが、今は問題文から、[]の中身を手作業で取り出して、次のようなファイルを生成してkeys.csvとしておく。
1, ライブラリ|ブラブラリ 2, できない|できる 3, 削除|強化|あれ 4, 高校生|中学生 5, ドリル|地獄 6, pLaTeX環境|Word|Excel
このとき、問題文は次のように変更しておく。
Zoteroは[1]とオンラインのアカウントが紐ついているので、別アカウントと同期することは[2]。 今回、紐付けを[3]して、別アカウントと同期できたので、記録に残す。 小学生から[4]までの計算[5]を自動で生成してくれる。これ、かなりいいツールだ。 ただ、僕の環境では[6]がない。そこで、LuaLaTeXに対応させてみた。
先のkeys.csvをスクリプトにかけると、以下のように語群ができる。 問題番号と解答記号のリストは、correctanswers.csvに保存されているので、採点時はそちらを参照する。
ア. pLaTeX環境、イ. できる、ウ. 地獄、エ. Word、オ. ドリル、カ. できない、キ. Excel、ク. 高校生、ケ. 中学生、コ. ライブラリ、サ. 強化、シ. あれ、ス. ブラブラリ、セ. 削除
スクリプト
なにか、説明が必要だろうか?
もとはJupyterなので、[]を自動で抽出するところまでやったら、そちらでコメント付きで公開したい。
import pandas as pd
import numpy as np
import random
df = pd.read_csv('./keys.csv', header=None)
keywords = []
answers = []
for l in df.iterrows():
for k in l[1][1].split('|'):
keywords.append(k)
answers.append(l[1][1].split('|')[0])
uniquewords = pd.unique(keywords)
label = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンabcdefghijklmnopqrstuvwxyz'
klabel = []
for l in range(len(uniquewords)):
klabel.append(label[l]+'. ')
random.shuffle(klabel)
keylabels = pd.DataFrame([klabel, uniquewords]).T
cor_answers = pd.merge(ansnums.T, keylabels, how='left', left_on = 1, right_on=1)
correctanswers = cor_answers.set_axis(['num', 'keyword','label'],axis=1)
choices = ''
for row in keylabels.sort_values(0).iterrows():
choices = choices + '、'+ row[1][0]+row[1][1]
correctanswers.to_csv('correctanswers.csv')
keylabels.to_csv('keylabels.csv')
with open('choices.txt', mode='w', encoding='UTF-8') as f:
f.write(choices[1:])