xinli/z_Project change/量表示例/create_scl90_json.py
2025-11-07 12:07:24 +08:00

464 lines
22 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
生成SCL-90完整JSON文件的脚本
包含90个题目、9个因子、计分规则、结果解释和预警规则
"""
import json
# SCL-90标准90个题目内容
scl90_items = [
"头痛", "神经过敏,心中不踏实", "头脑中有不必要的想法或字句盘旋", "头昏或昏倒", "对异性的兴趣减退",
"对旁人责备求全", "感到别人能控制您的思想", "责怪别人制造麻烦", "忘记性大", "担心自己的衣饰整齐及仪态的端正",
"容易烦恼和激动", "胸痛", "害怕空旷的场所或街道", "感到自己的精力下降,活动减慢", "想结束自己的生命",
"听到旁人听不到的声音", "发抖", "感到大多数人都不可信任", "胃口不好", "容易哭泣",
"同异性相处时感到害羞不自在", "感到受骗、中了圈套或有人想抓住您", "无缘无故地突然感到害怕", "自己不能控制地大发脾气", "怕单独出门",
"经常责怪自己", "腰痛", "感到难以完成任务", "感到孤独", "感到苦闷",
"过分担忧", "对事物不感兴趣", "感到害怕", "您的感情容易受到伤害", "感到旁人能知道您的私下想法",
"感到别人不理解您、不同情您", "感到人们对您不友好、不喜欢您", "做事必须做得很慢以保证做得正确", "心跳得很厉害", "恶心或胃部不舒服",
"感到比不上他人", "肌肉酸痛", "感到有人在监视您、谈论您", "难以入睡", "做事必须反复检查",
"难以做出决定", "怕乘电车、公共汽车、地铁或火车", "呼吸有困难", "一阵阵发冷或发热", "因为感到害怕而避开某些东西、场合或活动",
"脑子变空了", "身体发麻或刺痛", "喉咙有梗塞感", "感到前途没有希望", "不能集中注意",
"感到身体的某一部分软弱无力", "感到紧张或容易紧张", "感到手或脚发重", "想到死亡的事", "吃得太多",
"当别人看着您或谈论您时感到不自在", "有一些不属于您自己的想法", "有想打人或伤害他人的冲动", "醒得太早", "必须反复洗手、点数或触摸某些东西",
"睡得不稳不深", "有想摔坏或破坏东西的冲动", "有一些别人没有的想法或念头", "感到对别人神经过敏", "在商店或电影院等人多的地方感到不自在",
"感到任何事情都很困难", "一阵阵恐惧或惊恐", "感到在公共场合吃东西很不舒服", "经常与人争论", "单独一人时神经很紧张",
"别人对您的成绩没有做出恰当的评价", "即使和别人在一起也感到孤单", "感到坐立不安心神不定", "感到自己没有什么价值", "感到熟悉的东西变成陌生或不像是真的",
"大叫或摔东西", "害怕会在公共场合昏倒", "感到别人想占您的便宜", "为一些有关\"\"的想法而很苦恼", "您认为应该因为自己的过错而受到惩罚",
"感到要很快把事情做完", "感到自己的身体有严重问题", "从未感到和其他人很亲近", "感到自己有罪", "感到自己的脑子有毛病"
]
# SCL-90因子定义因子代码、名称、包含的题目编号
factors_data = [
{"code": "F1", "name": "躯体化", "items": [1,4,12,27,40,42,48,49,52,53,56,58]},
{"code": "F2", "name": "强迫症状", "items": [3,9,10,28,38,45,46,51,55,65]},
{"code": "F3", "name": "人际关系敏感", "items": [6,21,34,36,37,41,61,69,73]},
{"code": "F4", "name": "抑郁", "items": [5,14,15,20,22,26,29,30,31,32,54,71,79]},
{"code": "F5", "name": "焦虑", "items": [2,17,23,33,39,57,72,78,80,86]},
{"code": "F6", "name": "敌对", "items": [11,24,63,67,74,81]},
{"code": "F7", "name": "恐怖", "items": [13,25,47,50,70,75,82]},
{"code": "F8", "name": "偏执", "items": [8,18,43,68,76,83]},
{"code": "F9", "name": "精神病性", "items": [7,16,35,62,77,84,85,87,88,90]}
]
# 因子英文名称映射
factor_en_names = {
"F1": "Somatization",
"F2": "Obsessive-Compulsive",
"F3": "Interpersonal Sensitivity",
"F4": "Depression",
"F5": "Anxiety",
"F6": "Hostility",
"F7": "Phobic Anxiety",
"F8": "Paranoid Ideation",
"F9": "Psychoticism"
}
# 生成量表基本信息
scale_info = {
"scaleCode": "SCL_90",
"scaleName": "症状自评量表SCL-90",
"scaleEnName": "Symptom Checklist 90",
"scaleType": "symptom",
"scaleVersion": "1.0",
"scaleIntro": "SCL-90是一个包含90个项目的症状自评量表用于评估个体的心理症状水平",
"scaleDescription": "SCL-90量表包含90个项目涵盖9个症状因子躯体化、强迫症状、人际关系敏感、抑郁、焦虑、敌对、恐怖、偏执、精神病性。采用5级评分0-4分是心理健康评估的重要工具。",
"itemCount": 90,
"estimatedTime": 30,
"targetPopulation": "一般人群",
"author": "Derogatis",
"source": "心理卫生评定量表手册",
"reference": "Derogatis, L. R. (1977). SCL-90: Administration, scoring, and procedures manual. Clinical Psychometric Research.",
"status": "0",
"sortOrder": 0
}
# 生成题目列表(包含选项)
items_list = []
for i, content in enumerate(scl90_items, 1):
item_data = {
"item": {
"itemNumber": i,
"itemContent": content,
"itemType": "single",
"required": "1",
"reverseScore": "0",
"sortOrder": i
},
"options": [
{"optionCode": "A", "optionContent": "没有", "optionScore": 0, "sortOrder": 1},
{"optionCode": "B", "optionContent": "很轻", "optionScore": 1, "sortOrder": 2},
{"optionCode": "C", "optionContent": "中等", "optionScore": 2, "sortOrder": 3},
{"optionCode": "D", "optionContent": "偏重", "optionScore": 3, "sortOrder": 4},
{"optionCode": "E", "optionContent": "严重", "optionScore": 4, "sortOrder": 5}
]
}
items_list.append(item_data)
# 生成因子列表(包含计分规则)
factors_list = []
for idx, factor_data in enumerate(factors_data, 1):
factor_obj = {
"factor": {
"factorCode": factor_data["code"],
"factorName": factor_data["name"],
"factorEnName": factor_en_names.get(factor_data["code"], ""),
"factorDescription": "SCL-90 {}因子,包含{}个题目".format(factor_data["name"], len(factor_data["items"])),
"factorOrder": idx
},
"rules": [
{
"itemNumber": item_num,
"rule": {
"optionIds": "",
"weight": 1.0,
"calculationType": "sum"
}
}
for item_num in factor_data["items"]
]
}
factors_list.append(factor_obj)
# SCL-90因子常模和解释规则
# 因子均分标准:<1.0正常1.0-1.9轻度2.0-2.9中度≥3.0重度
# 因子总分 = 因子均分 × 题目数量
# 因子题目数量和总分范围
factor_ranges = {
"F1": {"itemCount": 12, "maxScore": 48}, # 躯体化
"F2": {"itemCount": 10, "maxScore": 40}, # 强迫症状
"F3": {"itemCount": 9, "maxScore": 36}, # 人际关系敏感
"F4": {"itemCount": 13, "maxScore": 52}, # 抑郁
"F5": {"itemCount": 10, "maxScore": 40}, # 焦虑
"F6": {"itemCount": 6, "maxScore": 24}, # 敌对
"F7": {"itemCount": 7, "maxScore": 28}, # 恐怖
"F8": {"itemCount": 6, "maxScore": 24}, # 偏执
"F9": {"itemCount": 10, "maxScore": 40} # 精神病性
}
# 生成总体解释配置总分范围0-360
interpretations_list = [
{
"factorId": None,
"scoreRangeMin": 0,
"scoreRangeMax": 160,
"level": "",
"levelName": "正常",
"interpretationTitle": "正常范围",
"interpretationContent": "您的总体得分在正常范围内,心理健康状况良好。",
"suggestions": "继续保持良好的心理状态,注意日常生活中的压力管理。",
"sortOrder": 1
},
{
"factorId": None,
"scoreRangeMin": 161,
"scoreRangeMax": 250,
"level": "",
"levelName": "轻度",
"interpretationTitle": "轻度症状",
"interpretationContent": "您可能存在轻度的心理症状,建议适当关注自己的心理健康。",
"suggestions": "建议通过放松训练、运动、社交等方式缓解压力,如症状持续可考虑咨询专业人士。",
"sortOrder": 2
},
{
"factorId": None,
"scoreRangeMin": 251,
"scoreRangeMax": 360,
"level": "",
"levelName": "中重度",
"interpretationTitle": "中重度症状",
"interpretationContent": "您的得分显示可能存在中重度的心理症状,建议寻求专业心理帮助。",
"suggestions": "强烈建议咨询心理医生或心理治疗师,进行专业的心理评估和治疗。",
"sortOrder": 3
}
]
# 为每个因子生成解释配置(基于因子总分)
# 因子均分 < 1.0 为正常1.0-1.9 为轻度2.0-2.9 为中度,≥ 3.0 为重度
factor_interpretations = {
"F1": {
"name": "躯体化",
"descriptions": {
"正常": "您的躯体化因子得分在正常范围内,躯体不适感较轻。",
"轻度": "您可能存在轻度的躯体化症状,建议关注身体健康状况。",
"中度": "您存在中度的躯体化症状,建议进行身体检查并关注心理健康。",
"重度": "您存在重度的躯体化症状,强烈建议寻求医疗和心理双重帮助。"
},
"suggestions": {
"正常": "继续保持良好的生活习惯,定期体检。",
"轻度": "建议关注身体健康,适当进行体检,同时注意心理压力的管理。",
"中度": "建议进行全面的身体检查,排除器质性病变,并寻求心理帮助。",
"重度": "强烈建议尽快就医,进行全面的身体和心理评估,制定综合治疗方案。"
}
},
"F2": {
"name": "强迫症状",
"descriptions": {
"正常": "您的强迫症状因子得分在正常范围内,强迫思维和行为较少。",
"轻度": "您可能存在轻度的强迫症状,偶尔出现不必要的想法或行为。",
"中度": "您存在中度的强迫症状,可能影响日常生活和工作效率。",
"重度": "您存在重度的强迫症状,严重影响日常生活,需要专业治疗。"
},
"suggestions": {
"正常": "继续保持良好的心理状态。",
"轻度": "建议学习放松技巧,减少不必要的担心和重复行为。",
"中度": "建议寻求心理治疗,学习认知行为疗法等方法来缓解强迫症状。",
"重度": "强烈建议寻求专业心理治疗,可能需要药物治疗配合心理治疗。"
}
},
"F3": {
"name": "人际关系敏感",
"descriptions": {
"正常": "您的人际关系敏感因子得分在正常范围内,人际交往较为自然。",
"轻度": "您可能在人际交往中偶尔感到不适或敏感。",
"中度": "您存在中度的人际关系敏感,可能影响社交能力和人际关系。",
"重度": "您存在重度的人际关系敏感,严重影响社交和人际关系,需要帮助。"
},
"suggestions": {
"正常": "继续保持良好的人际交往。",
"轻度": "建议增加社交活动,培养自信,学习沟通技巧。",
"中度": "建议寻求心理咨询,学习改善人际关系的方法和技巧。",
"重度": "强烈建议寻求专业心理治疗,改善社交恐惧和人际关系问题。"
}
},
"F4": {
"name": "抑郁",
"descriptions": {
"正常": "您的抑郁因子得分在正常范围内,情绪状态良好。",
"轻度": "您可能存在轻度的抑郁情绪,偶尔感到沮丧或失落。",
"中度": "您存在中度的抑郁症状,可能影响日常生活和工作。",
"重度": "您存在重度的抑郁症状,严重影响生活功能,需要立即寻求帮助。"
},
"suggestions": {
"正常": "继续保持良好的情绪状态。",
"轻度": "建议增加运动,培养兴趣爱好,保持规律的作息。",
"中度": "建议寻求心理咨询或心理治疗,必要时考虑药物治疗。",
"重度": "强烈建议立即寻求专业帮助,可能需要药物治疗和心理治疗相结合。"
}
},
"F5": {
"name": "焦虑",
"descriptions": {
"正常": "您的焦虑因子得分在正常范围内,焦虑水平较低。",
"轻度": "您可能存在轻度的焦虑情绪,偶尔感到紧张或担心。",
"中度": "您存在中度的焦虑症状,可能影响日常生活和工作。",
"重度": "您存在重度的焦虑症状,严重影响生活功能,需要专业治疗。"
},
"suggestions": {
"正常": "继续保持良好的心理状态。",
"轻度": "建议学习放松技巧,进行深呼吸和冥想练习。",
"中度": "建议寻求心理咨询,学习焦虑管理技巧,必要时考虑药物治疗。",
"重度": "强烈建议寻求专业治疗,可能需要药物治疗配合心理治疗。"
}
},
"F6": {
"name": "敌对",
"descriptions": {
"正常": "您的敌对因子得分在正常范围内,情绪控制良好。",
"轻度": "您可能存在轻度的敌对情绪,偶尔感到愤怒或烦躁。",
"中度": "您存在中度的敌对情绪,可能影响人际关系。",
"重度": "您存在重度的敌对情绪,严重影响人际关系和社会功能。"
},
"suggestions": {
"正常": "继续保持良好的情绪管理。",
"轻度": "建议学习情绪管理技巧,进行适当的运动来释放压力。",
"中度": "建议寻求心理咨询,学习愤怒管理和冲突解决技巧。",
"重度": "强烈建议寻求专业心理治疗,改善情绪控制和人际交往能力。"
}
},
"F7": {
"name": "恐怖",
"descriptions": {
"正常": "您的恐怖因子得分在正常范围内,恐惧情绪较少。",
"轻度": "您可能存在轻度的恐怖情绪,对某些情境感到轻微不安。",
"中度": "您存在中度的恐怖情绪,可能影响正常生活和工作。",
"重度": "您存在重度的恐怖情绪,严重影响正常生活,需要专业治疗。"
},
"suggestions": {
"正常": "继续保持良好的心理状态。",
"轻度": "建议逐步面对恐惧,进行脱敏训练。",
"中度": "建议寻求心理咨询,进行系统脱敏治疗。",
"重度": "强烈建议寻求专业心理治疗,可能需要暴露疗法和药物治疗。"
}
},
"F8": {
"name": "偏执",
"descriptions": {
"正常": "您的偏执因子得分在正常范围内,信任感良好。",
"轻度": "您可能存在轻度的偏执倾向,偶尔对他人产生怀疑。",
"中度": "您存在中度的偏执倾向,可能影响人际关系和信任。",
"重度": "您存在重度的偏执倾向,严重影响人际关系和社会功能。"
},
"suggestions": {
"正常": "继续保持良好的人际信任。",
"轻度": "建议增强自信,学习信任他人,改善人际关系。",
"中度": "建议寻求心理咨询,改善偏执思维,学习正确的认知方式。",
"重度": "强烈建议寻求专业心理治疗,可能需要认知行为疗法和药物治疗。"
}
},
"F9": {
"name": "精神病性",
"descriptions": {
"正常": "您的精神病性因子得分在正常范围内,思维清晰。",
"轻度": "您可能存在轻微的精神病性症状,偶尔出现异常想法。",
"中度": "您存在中度的精神病性症状,可能影响思维和判断。",
"重度": "您存在重度的精神病性症状,严重影响思维功能,需要立即就医。"
},
"suggestions": {
"正常": "继续保持良好的心理状态。",
"轻度": "建议关注心理健康,如有持续异常思维请及时咨询。",
"中度": "强烈建议寻求精神科医生的专业评估和治疗。",
"重度": "紧急建议立即寻求精神科专业治疗,可能需要住院治疗。"
}
}
}
# 为每个因子添加解释配置
for factor_code, factor_info in factor_interpretations.items():
if factor_code in factor_ranges:
item_count = factor_ranges[factor_code]["itemCount"]
max_score = factor_ranges[factor_code]["maxScore"]
# 正常:均分 < 1.0,总分 < 题目数
interpretations_list.append({
"factorId": None, # 导入时会通过factorCode映射设置
"factorCode": factor_code, # 用于映射到factorId的临时字段
"scoreRangeMin": 0,
"scoreRangeMax": item_count - 1,
"level": "",
"levelName": "正常",
"interpretationTitle": "{}因子正常".format(factor_info["name"]),
"interpretationContent": factor_info["descriptions"]["正常"],
"suggestions": factor_info["suggestions"]["正常"],
"sortOrder": 1
})
# 轻度:均分 1.0-1.9,总分 = 题目数 × 1.0 到 题目数 × 1.9
min_light = item_count * 1.0
max_light = int(item_count * 1.9)
interpretations_list.append({
"factorId": None,
"factorCode": factor_code,
"scoreRangeMin": int(min_light),
"scoreRangeMax": max_light,
"level": "",
"levelName": "轻度",
"interpretationTitle": "{}因子轻度".format(factor_info["name"]),
"interpretationContent": factor_info["descriptions"]["轻度"],
"suggestions": factor_info["suggestions"]["轻度"],
"sortOrder": 2
})
# 中度:均分 2.0-2.9,总分 = 题目数 × 2.0 到 题目数 × 2.9
min_moderate = item_count * 2.0
max_moderate = int(item_count * 2.9)
interpretations_list.append({
"factorId": None,
"factorCode": factor_code,
"scoreRangeMin": int(min_moderate),
"scoreRangeMax": max_moderate,
"level": "",
"levelName": "中度",
"interpretationTitle": "{}因子中度".format(factor_info["name"]),
"interpretationContent": factor_info["descriptions"]["中度"],
"suggestions": factor_info["suggestions"]["中度"],
"sortOrder": 3
})
# 重度:均分 ≥ 3.0,总分 ≥ 题目数 × 3.0
min_severe = int(item_count * 3.0)
interpretations_list.append({
"factorId": None,
"factorCode": factor_code,
"scoreRangeMin": min_severe,
"scoreRangeMax": max_score,
"level": "",
"levelName": "重度",
"interpretationTitle": "{}因子重度".format(factor_info["name"]),
"interpretationContent": factor_info["descriptions"]["重度"],
"suggestions": factor_info["suggestions"]["重度"],
"sortOrder": 4
})
# 生成预警规则
warning_rules_list = [
# 总体预警规则
{
"factorId": None,
"ruleName": "重度症状预警",
"warningLevel": "",
"scoreMin": 250,
"scoreMax": 360,
"autoRelief": "0",
"status": "0"
},
{
"factorId": None,
"ruleName": "紧急症状预警",
"warningLevel": "紧急",
"scoreMin": 300,
"scoreMax": 360,
"autoRelief": "0",
"status": "0"
}
]
# 为每个因子添加预警规则(重度及以上需要预警)
for factor_code, factor_info in factor_interpretations.items():
if factor_code in factor_ranges:
item_count = factor_ranges[factor_code]["itemCount"]
max_score = factor_ranges[factor_code]["maxScore"]
# 重度预警(均分 ≥ 3.0
min_severe = int(item_count * 3.0)
warning_rules_list.append({
"factorId": None, # 导入时会通过factorCode映射设置
"factorCode": factor_code, # 用于映射到factorId的临时字段
"ruleName": "{}因子重度预警".format(factor_info["name"]),
"warningLevel": "",
"scoreMin": min_severe,
"scoreMax": max_score,
"autoRelief": "0",
"status": "0"
})
# 中度预警(均分 2.0-2.9- 对于某些敏感因子
if factor_code in ["F4", "F5", "F9"]: # 抑郁、焦虑、精神病性需要中度预警
min_moderate = int(item_count * 2.0)
max_moderate = int(item_count * 2.9)
warning_rules_list.append({
"factorId": None,
"factorCode": factor_code,
"ruleName": "{}因子中度预警".format(factor_info["name"]),
"warningLevel": "",
"scoreMin": min_moderate,
"scoreMax": max_moderate,
"autoRelief": "0",
"status": "0"
})
# 组合完整的JSON对象
json_data = {
"scale": scale_info,
"items": items_list,
"factors": factors_list,
"interpretations": interpretations_list,
"warningRules": warning_rules_list
}
# 输出JSON文件
output_file = "SCL90症状自评量表.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
print("✅ SCL-90 JSON文件已生成: {}".format(output_file))
print("📊 统计信息:")
print(" - 量表: {}".format(scale_info["scaleName"]))
print(" - 题目数量: {}".format(len(items_list)))
print(" - 因子数量: {}".format(len(factors_list)))
print(" - 结果解释: {}".format(len(interpretations_list)))
print(" - 预警规则: {}".format(len(warning_rules_list)))