[python][ChatGPT]ChatGPTを用いて医師国家試験問題演習サイトを作成

python

医師国家試験

医師国家試験演習
医師国家試験のためのオンライン演習サイト。過去の試験問題を使用した試験のシミュレーションを提供し、あなたの試験対策をサポートします。

せっかく臨床検査技師の方も作ったし、ちょっと研究のついでに、医師国家試験の方も作成。

ChatGTPで臨床検査技師国家試験演習Webサイトを作成
臨床検査技師国家試験演習サイトで分野別演習を追加

変更点

handle_question関数をちょっといじって、解答がすぐに表示されるようにした(前は解答表示ページが遷移してしまいもともとの選択肢や問題が何だったか分かりにくかったので)。

def handle_question(questions, prefix, session_key_index, session_key_mode, img_folder, exam_number, answers):
    mode = session.get(session_key_mode, 'random')
    mode_jp = mode_translations[mode]

    if request.method == "POST":
        question_number = request.form['answer_key']
        answer_key = f"{prefix}{int(question_number):03}"
        selected_choices = request.form.getlist("selected_index")
        selected_choices_converted = [choice.upper() for choice in selected_choices]

        try:
            correct_answer = answers[answer_key]
        except KeyError:
            return render_template("error.html", message="不正なキーです。")

        is_correct = sorted(selected_choices_converted) == sorted(correct_answer)
        correct_answer_lower = ''.join([char.lower() for char in correct_answer])
        message = "正解!" if is_correct else f"不正解。正解は: {correct_answer_lower}"
        explanation = session.get('explanation', '解説はありません')

        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            # 次の問題を取得
            next_question_data = get_random_question(questions, img_folder) if mode == 'random' else get_sequential_question(questions, session_key_index, img_folder)
            session['explanation'] = next_question_data.get('explanation', '解説はありません')

            return jsonify({
                'is_correct': is_correct,
                'correct_answer': correct_answer_lower,
                'message': message,
                'explanation': explanation,
                'next_question': next_question_data  # 次の問題のデータを追加
            })

        # デバッグ情報の出力
        print(f"Converted Selected Choices: {selected_choices_converted}")
        print(f"Correct Answer: {correct_answer}")

        # 正解リストをセットに変換
        correct_answer_set = set(correct_answer)

        # 選択された回答もセットに変換
        selected_choices_set = set(selected_choices_converted)

        # 正解が複数の選択肢からなる場合(例:'DE')、選択された回答がそのいずれかに含まれているかチェック
        is_correct = sorted(selected_choices_converted) == sorted(correct_answer)
        # 正解が複数の選択肢からなる場合(例:'DE')、各選択肢を小文字に変換
        correct_answer_lower = ''.join([char.lower() for char in correct_answer])
        message = "正解!" if is_correct else f"不正解。正解は: {correct_answer_lower}"
        # message = "正解!" if is_correct else f"不正解。正解は: {correct_answer}"
        explanation = session.get('explanation', '解説はありません')
        session.pop('explanation', None)

        if mode == 'random':
            question_data = get_random_question(questions, img_folder)
        else:
            index = session.get(session_key_index, 0)
            question_data = get_sequential_question(questions, session_key_index, img_folder)
            session[session_key_index] = (index + 1) % len(questions)

        session['explanation'] = question_data.get('explanation', '解説はありません')
        return render_template("question.html", question_data=question_data, message=message, mode=mode_jp, explanation=explanation, exam_number = exam_number)

    if mode == 'random':
        question_data = get_random_question(questions, img_folder)
    else:
        index = session.get(session_key_index, 0)
        question_data = get_sequential_question(questions, session_key_index, img_folder)
        session[session_key_index] = (index + 1) % len(questions)

    session['explanation'] = question_data.get('explanation', '解説はありません')
    return render_template("question.html", question_data=question_data, mode=mode_jp, exam_number = exam_number)

後はquestion.htmlにAJAXのscriptを埋め込み。連続出題の場合、問題が2つおき(1番目の問題の次が3番目になってしまう)というエラーが起きたので、get_sequential_questionも修正。

臨床検査技師演習サイト

こちらも修正。こっちは問題のJSONファイルにa., b. のような選択肢記号がなく、1, 2, …だったのでその部分も修正。ただし、解説は「解答は、1です」のようになっていて、全部修正するのが手間だったので、handle_questionの方を書き換え。

def handle_question(questions, prefix, session_key_index, session_key_mode, img_folder, exam_number, answers):
    # 数値をアルファベットに変換するマッピング
    number_to_alphabet = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}

    mode = session.get(session_key_mode, 'random')
    mode_jp = mode_translations[mode]

    if request.method == "POST":
        question_number = request.form['answer_key']
        answer_key = f"{prefix}{int(question_number):03}"
        selected_choices = request.form.getlist("selected_index")
        # 選択された選択肢をアルファベットに変換
        selected_choices_converted = ''.join([number_to_alphabet[int(choice)] for choice in selected_choices])

        try:
            correct_answer = answers[answer_key]
        except KeyError:
            return render_template("error.html", message="不正なキーです。")

        # 選択された回答と正解を比較
        is_correct = selected_choices_converted == correct_answer

        message = "正解!" if is_correct else f"不正解。正解は: {correct_answer}"
        explanation = session.get('explanation', '解説はありません')

        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            # 次の問題を取得
            next_question_data = get_random_question(questions, img_folder) if mode == 'random' else get_sequential_question(questions, session_key_index, img_folder)
            session['explanation'] = next_question_data.get('explanation', '解説はありません')

            return jsonify({
                'is_correct': is_correct,
                'correct_answer': correct_answer,
                'message': message,
                'explanation': explanation,
                'next_question': next_question_data  # 次の問題のデータを追加
            })

        # デバッグ情報の出力
        print(f"Converted Selected Choices: {selected_choices_converted}")
        print(f"Correct Answer: {correct_answer}")

        # 正解リストをセットに変換
        correct_answer_set = set(correct_answer)

        # 選択された回答もセットに変換
        selected_choices_set = set(selected_choices_converted)

        # 正解が複数の選択肢からなる場合(例:'DE')、選択された回答がそのいずれかに含まれているかチェック
        is_correct = sorted(selected_choices_converted) == sorted(correct_answer)
        # 正解が複数の選択肢からなる場合(例:'DE')、各選択肢を小文字に変換
        correct_answer_lower = ''.join([char.lower() for char in correct_answer])
        message = "正解!" if is_correct else f"不正解。正解は: {correct_answer_lower}"
        # message = "正解!" if is_correct else f"不正解。正解は: {correct_answer}"
        explanation = session.get('explanation', '解説はありません')
        session.pop('explanation', None)

        if mode == 'random':
            question_data = get_random_question(questions, img_folder)
        else:
            index = session.get(session_key_index, 0)
            question_data = get_sequential_question(questions, session_key_index, img_folder)
            session[session_key_index] = (index + 1) % len(questions)

        session['explanation'] = question_data.get('explanation', '解説はありません')
        return render_template("question.html", question_data=question_data, message=message, mode=mode_jp, explanation=explanation, exam_number = exam_number)

    if mode == 'random':
        question_data = get_random_question(questions, img_folder)
    else:
        index = session.get(session_key_index, 0)
        question_data = get_sequential_question(questions, session_key_index, img_folder)
        session[session_key_index] = (index + 1) % len(questions)

    session['explanation'] = question_data.get('explanation', '解説はありません')
    return render_template("question.html", question_data=question_data, mode=mode_jp, exam_number = exam_number)

最新回の問題もそのうち解説作成したい。

関連リンク

医師国家試験演習
医師国家試験のためのオンライン演習サイト。過去の試験問題を使用した試験のシミュレーションを提供し、あなたの試験対策をサポートします。
臨床検査技師国家試験演習
臨床検査技師国家試験のためのオンライン演習サイト。過去の試験問題を使用した試験のシミュレーションを提供し、あなたの試験対策をサポートします。

コメント

タイトルとURLをコピーしました