[chatGPT][臨床検査技師]臨床検査技師国家試験演習サイトで分野別演習を追加

ChatGPT

臨床検査技師国家試験演習サイト

以前の記事

今までは各年度ごとの演習のみだったが、分野別の演習も追加。

出題分野の追加

臨床検査技師国家試験は、年度によらず出題分野が以下のようにはっきりと決まっている。

分野問題番号
臨床検査総論1-10
臨床検査医学総論11-15
臨床生理学16-28
臨床化学29-44
病理組織細胞学45-58
臨床血液学59-67
臨床微生物学68-78
臨床免疫学79-89
公衆衛生学90-94
医用工学概論95-100
臨床検査技師国家試験の出題範囲。

したがって、以下のコードでまず作成済の各年度のJSONファイルにsubjectを埋め込む。

import json

# 番号と科目のマッピング
subject_mapping = {
    (1, 10): "臨床検査総論",
    (11, 15): "臨床検査医学総論",
    (16, 28): "臨床生理学",
    (29, 44): "臨床化学",
    (45, 58): "病理組織細胞学",
    (59, 67): "臨床血液学",
    (68, 78): "臨床微生物学",
    (79, 89): "臨床免疫学",
    (90, 94): "公衆衛生学",
    (95, 100): "医用工学概論"
}

def assign_subjects(file_name):
    # JSON ファイルを読み込む
    with open(file_name, 'r', encoding='utf-8') as f:
        data = json.load(f)

    # すべての問題に対して "subject" を割り当てる
    for item in data:
        number = item["number"]
        for range_, subject in subject_mapping.items():
            if range_[0] <= number <= range_[1]:
                item["subject"] = subject
                break

    # 結果を新しい JSON ファイルに書き出す
    with open(file_name, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

# 関数を実行

for i in range(65, 70):
    assign_subjects(f"/Users/Documents/LabDepartment/lab_exam_app/data/{i:0>3}/question_{i:0>3}_01.json")

for i in range(65, 70):
    assign_subjects(f"/Users/Documents/LabDepartment/lab_exam_app/data/{i:0>3}/question_{i:0>3}_02.json")

まず、各分野ごとのフォルダーを作成

こちらは簡単なコードで分野別のフォルダを作成。

import os

data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"

# 分野のリストを定義
SUBJECT_IDS = ["CLT", "CLM", "CP", "CC", "PHC", "CH", "CM", "CI", "PH", "IME"]

# 分野ごとのフォルダを作成
for subject_id in SUBJECT_IDS:
    os.makedirs(os.path.join(data_dir, subject_id), exist_ok=True)

import shutil

data_dir = "/Users/tk/Documents/LabDepartment/lab_exam_app/data"
SUBJECT_IDS = ["CLT", "CLM", "CP", "CC", "PHC", "CH", "CM", "CI", "PH", "IME"]

# 各分野のフォルダに対応するファイルを移動
for subject_id in SUBJECT_IDS:
    for suffix in ["_question.json", "_ans.json"]:
        src_file = os.path.join(data_dir, subject_id + suffix)
        dst_dir = os.path.join(data_dir, subject_id)

        # ファイルが存在する場合のみ移動操作を行う
        if os.path.exists(src_file):
            shutil.move(src_file, dst_dir)

分野ごとのJSONファイルの作成

この分野情報を用いて、各分野ごとのフォルダを作り、そこに分野別のJSONファイルを投げ込んでいく。

import json
import os

SUBJECT_IDS = {
    "CLT": "臨床検査総論",
    "CLM": "臨床検査医学総論",
    "CP": "臨床生理学",
    "CC": "臨床化学",
    "PHC": "病理組織細胞学",
    "CH": "臨床血液学",
    "CM": "臨床微生物学",
    "CI": "臨床免疫学",
    "PH": "公衆衛生学",
    "IME": "医用工学概論"
}

# ディレクトリパスを設定
data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"

# すべての年度にわたる各分野の問題と解答を保持するためのディクショナリを作成
subjects_data = {subject_id: {"questions": [], "answers": []} for subject_id in SUBJECT_IDS.keys()}

# 65から69までの5年分を処理
for year in range(65, 70):
    for half in ['01', '02']:
        questions_file = os.path.join(data_dir, f'0{year}/question_0{year}_{half}.json')

        # JSONファイルを読み込み
        with open(questions_file, 'r') as qf:
            questions = json.load(qf)

        # 分野ごとに問題を分けてディクショナリに追加
        for subject_id, subject_name in SUBJECT_IDS.items():
            subject_questions = [q for q in questions if q['subject'] == subject_name]
            for i, q in enumerate(subject_questions, start=1):
                q['year'] = year
                q['half'] = half
                subjects_data[subject_id]['questions'].append(q)

# 各分野ごとに問題と解答のリストを取り出し、新たに問題番号を割り振り
for subject_id, data in subjects_data.items():
    questions = data['questions']

    for i, question in enumerate(questions, start=1):
        question['number'] =  i

    output_questions_file = os.path.join(data_dir, f'{subject_id}_question.json')

    # JSONファイルを整形して出力
    with open(output_questions_file, 'w') as oqf:
        json.dump(questions, oqf, ensure_ascii=False, indent=2)

分野別の回答も作成

同様に、分野別の回答も作成していく。こちらは番号で処理。

import os
import json

data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"

# 各分野の範囲を定義
SUBJECT_RANGES = {
    "CLT": range(1, 11),
    "CLM": range(11, 16),
    "CP": range(16, 29),
    "CC": range(29, 45),
    "PHC": range(45, 59),
    "CH": range(59, 68),
    "CM": range(68, 79),
    "CI": range(79, 90),
    "PH": range(90, 95),
    "IME": range(95, 101)
}

# 分野ごとの回答データを格納する辞書を初期化
subjects_data = {k: {} for k in SUBJECT_RANGES.keys()}

# 各年度の回答データを読み込み、適切な分野に分けて格納
for year in range(65, 70):  # 第65回から第69回まで
    for half in range(1, 3):  # 午前(1)から午後(2)まで
        half_char = "A" if half == 1 else "B"
        answers_file = os.path.join(data_dir, f"0{year}", f'ans_0{year}.json')
        with open(answers_file, 'r') as af:
            answers = json.load(af)
            for subject_id, subject_range in SUBJECT_RANGES.items():
                for number in subject_range:
                    answer_key = f"{year}{half_char}{number:03}"
                    answer_value = answers.get(answer_key)
                    subject_key = f"{subject_id}{len(subjects_data[subject_id]) + 1:03}"
                    subjects_data[subject_id][subject_key] = answer_value

# 分野ごとにJSONファイルに出力
for subject_id, subject_answers in subjects_data.items():
    with open(os.path.join(data_dir, f"{subject_id}_ans.json"), 'w') as f:
        json.dump(subject_answers, f, ensure_ascii=False, indent=4)

画像の収集

色々考えた結果、分野別に画像を再度収集しフォルダに配置するのが一番簡単だと思い、実行。まずは各年度の画像フォルダから分野別の画像を収集。分野が公衆衛生学がだったら、”PH_001.jpg”などと新しい名前をつけていく。

import os
import json
import shutil

SUBJECT_IDS = {
    "臨床検査総論": "CLT",
    "臨床検査医学総論": "CLM",
    "臨床生理学": "CP",
    "臨床化学": "CC",
    "病理組織細胞学": "PHC",
    "臨床血液学": "CH",
    "臨床微生物学": "CM",
    "臨床免疫学": "CI",
    "公衆衛生学": "PH",
    "医用工学概論": "IME"
}

for root, dirs, files in os.walk('/Users/Documents/LabDepartment/lab_exam_app/data'):
    for subject in SUBJECT_IDS.values():
        question_file = f"{subject}_question.json"
        if question_file in files:
            json_file_path = os.path.join(root, question_file)
            with open(json_file_path, 'r') as json_file:
                data = json.load(json_file)

            # 新しいファイル名に使用する番号
            image_counter = 1

            for item in data:
                if 'image' in item:
                    old_image_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/0{item['year']}/{item['half']}_pic/{item['image']}"

                    subject_dir = SUBJECT_IDS[item['subject']]
                    new_dir_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/{subject_dir}/{subject_dir}_pic"

                    if not os.path.exists(new_dir_path):
                        os.makedirs(new_dir_path)

                    # 新しい画像ファイル名を作成: 主題名 + 三桁の番号
                    new_image_name = f"{subject_dir}_{str(image_counter).zfill(3)}.jpg"

                    new_image_path = os.path.join(new_dir_path, new_image_name)

                    shutil.copy2(old_image_path, new_image_path)

                    # 画像番号をインクリメント
                    image_counter += 1

JSONファイルの画像ファイル名も変更

上記に伴い、もともとのJSONファイルの方では画像名が”page_10.jpg”などであったので、こちらも修正していく。

import os
import json
import shutil

SUBJECT_IDS = {
    "臨床検査総論": "CLT",
    "臨床検査医学総論": "CLM",
    "臨床生理学": "CP",
    "臨床化学": "CC",
    "病理組織細胞学": "PHC",
    "臨床血液学": "CH",
    "臨床微生物学": "CM",
    "臨床免疫学": "CI",
    "公衆衛生学": "PH",
    "医用工学概論": "IME"
}

for root, dirs, files in os.walk('/Users/Documents/LabDepartment/lab_exam_app/data'):
    for subject in SUBJECT_IDS.values():
        question_file = f"{subject}_question.json"
        if question_file in files:
            json_file_path = os.path.join(root, question_file)
            with open(json_file_path, 'r') as json_file:
                data = json.load(json_file)

            # 新しいファイル名に使用する番号
            image_counter = 1

            for item in data:
                if 'image' in item:
                    old_image_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/0{item['year']}/{item['half']}_pic/{item['image']}"

                    subject_dir = SUBJECT_IDS[item['subject']]
                    new_dir_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/{subject_dir}/{subject_dir}_pic"

                    if not os.path.exists(new_dir_path):
                        os.makedirs(new_dir_path)

                    # 新しい画像ファイル名を作成: 主題名 + 三桁の番号
                    new_image_name = f"{subject_dir}_{str(image_counter).zfill(3)}.jpg"
                    item['image'] = new_image_name  # 'image'キーの値を新しい画像名に更新

                    new_image_path = os.path.join(new_dir_path, new_image_name)

                    shutil.copy2(old_image_path, new_image_path)

                    # 画像番号をインクリメント
                    image_counter += 1

            # 更新されたデータを同じJSONファイルに書き出し
            with open(json_file_path, 'w') as json_file:
                json.dump(data, json_file, ensure_ascii=False, indent=2)

できあがり

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

比較的軽微な変更で、分野別出題も実装できてよかった。FileZillaでアップロードして完了。

関連記事

JSONファイル中にhtmlリンクやimgリンクを入れ込む
ChatGTPで臨床検査技師国家試験演習Webサイトを作成

関連リンク

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

コメント

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