#!/usr/bin/env python3 # -*- coding: utf-8 -*- # from .questionnaire import PERSONALITY_QUESTIONS, FACTOR_DESCRIPTIONS import os import sys from pathlib import Path current_dir = Path(__file__).resolve().parent project_root = current_dir.parent.parent.parent env_path = project_root / ".env.prod" root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) sys.path.append(root_path) from src.plugins.personality.scene import get_scene_by_factor,get_all_scenes,PERSONALITY_SCENES from src.plugins.personality.questionnaire import PERSONALITY_QUESTIONS,FACTOR_DESCRIPTIONS from src.plugins.personality.offline_llm import LLMModel class BigFiveTest: def __init__(self): self.questions = PERSONALITY_QUESTIONS self.factors = FACTOR_DESCRIPTIONS def run_test(self): """运行测试并收集答案""" print("\n欢迎参加中国大五人格测试!") print("\n本测试采用六级评分,请根据每个描述与您的符合程度进行打分:") print("1 = 完全不符合") print("2 = 比较不符合") print("3 = 有点不符合") print("4 = 有点符合") print("5 = 比较符合") print("6 = 完全符合") print("\n请认真阅读每个描述,选择最符合您实际情况的选项。\n") answers = {} for question in self.questions: while True: try: print(f"\n{question['id']}. {question['content']}") score = int(input("您的评分(1-6): ")) if 1 <= score <= 6: answers[question['id']] = score break else: print("请输入1-6之间的数字!") except ValueError: print("请输入有效的数字!") return self.calculate_scores(answers) def calculate_scores(self, answers): """计算各维度得分""" results = {} factor_questions = { "外向性": [], "神经质": [], "严谨性": [], "开放性": [], "宜人性": [] } # 将题目按因子分类 for q in self.questions: factor_questions[q['factor']].append(q) # 计算每个维度的得分 for factor, questions in factor_questions.items(): total_score = 0 for q in questions: score = answers[q['id']] # 处理反向计分题目 if q['reverse_scoring']: score = 7 - score # 6分量表反向计分为7减原始分 total_score += score # 计算平均分 avg_score = round(total_score / len(questions), 2) results[factor] = { "得分": avg_score, "题目数": len(questions), "总分": total_score } return results def get_factor_description(self, factor): """获取因子的详细描述""" return self.factors[factor] def main(): test = BigFiveTest() results = test.run_test() print("\n测试结果:") print("=" * 50) for factor, data in results.items(): print(f"\n{factor}:") print(f"平均分: {data['得分']} (总分: {data['总分']}, 题目数: {data['题目数']})") print("-" * 30) description = test.get_factor_description(factor) print("维度说明:", description['description'][:100] + "...") print("\n特征词:", ", ".join(description['trait_words'])) print("=" * 50) if __name__ == "__main__": main()