469 lines
18 KiB
Python
469 lines
18 KiB
Python
"""
|
||
高考志愿填报 - 3分钟快速收集版
|
||
只保留最关键的问题,适合快速咨询场景
|
||
"""
|
||
|
||
# 3分钟快速问卷模板
|
||
QUICK_3MIN_TEMPLATE = """
|
||
╔═══════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ⚡ 高考志愿填报 - 3分钟快速问卷 ║
|
||
║ ║
|
||
║ 填写以下7个关键问题,即可生成个性化志愿建议 ║
|
||
║ ║
|
||
╚═══════════════════════════════════════════════════════════════════╝
|
||
|
||
【必填 - 基本信息】
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
□ 1. 考生姓名:_______________
|
||
□ 2. 所在省份:_______________
|
||
□ 3. 高考总分:_______ 分
|
||
□ 4. 全省位次:_______ 名(查一分一段表)
|
||
|
||
【必填 - 核心匹配】
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
□ 5. 你属于哪种类型?(单选)
|
||
|
||
R. 🔧 喜欢动手拆装修东西(电脑/模型/电器)
|
||
→ 推荐:计算机、电子、机械、自动化
|
||
|
||
I. 🔬 喜欢研究探索(解难题/做实验/查资料)
|
||
→ 推荐:数学、物理、医学、科研类
|
||
|
||
A. 🎨 喜欢创意创作(画画/设计/写作)
|
||
→ 推荐:设计、建筑、传媒、艺术
|
||
|
||
S. 🤝 喜欢帮助人(志愿者/当老师/照顾人)
|
||
→ 推荐:师范、医学、心理学、社工
|
||
|
||
E. 📊 喜欢领导组织(当班干部/策划活动/做生意)
|
||
→ 推荐:管理、经济、法学、商科
|
||
|
||
C. 📝 喜欢规范有序(整理数据/做表格/规划)
|
||
→ 推荐:会计、统计、财务、行政
|
||
|
||
□ 6. 你最擅长哪2门学科?(选填)
|
||
例:物理、数学
|
||
|
||
□ 7. 明确不喜欢的?(多选)
|
||
A. 背诵记忆 B. 数学计算 C. 社交应酬
|
||
D. 做实验 E. 写代码 F. 都喜欢
|
||
|
||
【选填 - 关键约束】
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
□ 8. 家庭经济条件:
|
||
①困难 ②一般 ③中等 ④较好
|
||
|
||
□ 9. 毕业后最想:
|
||
①直接工作赚钱 ②读研深造 ③考公务员 ④不确定
|
||
|
||
□ 10. 想去哪里工作:
|
||
①一线城市 ②新一线 ③本省 ④都能接受
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
💡 填写说明:
|
||
• 复制以上内容,填写后发回
|
||
• 必填1-7项,选填8-10项可选
|
||
• 位次查法:省教育考试院官网
|
||
|
||
📤 发送格式示例:
|
||
1. 李明
|
||
2. 浙江省
|
||
3. 612
|
||
4. 15230
|
||
5. R
|
||
6. 物理、数学
|
||
7. C
|
||
8. ③
|
||
9. ①
|
||
10. ②
|
||
"""
|
||
|
||
|
||
# 极简1分钟版
|
||
ULTRA_1MIN_TEMPLATE = """
|
||
╔═══════════════════════════════════════════════════════════════════╗
|
||
║ ⚡ 高考志愿 - 1分钟极速版 ║
|
||
╚════════════════════════════════━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━═══╝
|
||
|
||
只需要回答这5个问题:
|
||
|
||
1️⃣ 姓名+省份:______________(如:李明 浙江)
|
||
2️⃣ 分数+位次:______________(如:612分 15230名)
|
||
3️⃣ 选科:__________________(如:物化地)
|
||
4️⃣ 类型:__________________(R/I/A/S/E/C 选1个)
|
||
R=动手型 I=研究型 A=艺术型 S=助人型 E=管理型 C=常规型
|
||
5️⃣ 不能接受的:_____________(如:背诵、数学、社交)
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
示例回复:
|
||
李明 浙江 612分 15230名 物化地 R类型 不接受社交
|
||
"""
|
||
|
||
|
||
def parse_quick_response(text: str) -> dict:
|
||
"""
|
||
解析快速问卷回复
|
||
支持多种格式:带编号、无编号、紧凑型
|
||
"""
|
||
info: dict[str, dict[str, object]] = {
|
||
"basic": {},
|
||
"exam": {},
|
||
"profile": {},
|
||
"constraints": {},
|
||
}
|
||
|
||
lines = [line.strip() for line in text.strip().split("\n") if line.strip()]
|
||
|
||
# 类型映射
|
||
type_map = {
|
||
"R": ("现实型", ["计算机", "电子", "机械", "自动化"]),
|
||
"I": ("研究型", ["数学", "物理", "医学", "化学"]),
|
||
"A": ("艺术型", ["设计", "建筑", "传媒", "中文"]),
|
||
"S": ("社会型", ["师范", "医学", "心理学", "社工"]),
|
||
"E": ("企业型", ["管理", "经济", "金融", "法学"]),
|
||
"C": ("常规型", ["会计", "统计", "财务", "信息"]),
|
||
}
|
||
|
||
for line in lines:
|
||
# 尝试各种格式提取
|
||
|
||
# 格式1: "1. 李明" 或 "1、李明" 或 "1 李明"
|
||
if line[0].isdigit() and len(line) > 2:
|
||
parts = line.replace("、", " ").replace(".", " ").replace(":", " ").split()
|
||
if len(parts) >= 2:
|
||
key_num = parts[0]
|
||
value = " ".join(parts[1:])
|
||
|
||
if key_num == "1":
|
||
# 可能包含省份
|
||
if " " in value or "\t" in value:
|
||
parts2 = value.replace("\t", " ").split()
|
||
info["basic"]["name"] = parts2[0]
|
||
if len(parts2) > 1:
|
||
info["basic"]["province"] = parts2[1]
|
||
else:
|
||
info["basic"]["name"] = value
|
||
elif key_num == "2":
|
||
# 省份
|
||
provinces = [
|
||
"北京",
|
||
"天津",
|
||
"河北",
|
||
"山西",
|
||
"内蒙古",
|
||
"辽宁",
|
||
"吉林",
|
||
"黑龙江",
|
||
"上海",
|
||
"江苏",
|
||
"浙江",
|
||
"安徽",
|
||
"福建",
|
||
"江西",
|
||
"山东",
|
||
"河南",
|
||
"湖北",
|
||
"湖南",
|
||
"广东",
|
||
"广西",
|
||
"海南",
|
||
"重庆",
|
||
"四川",
|
||
"贵州",
|
||
"云南",
|
||
"西藏",
|
||
"陕西",
|
||
"甘肃",
|
||
"青海",
|
||
"宁夏",
|
||
"新疆",
|
||
]
|
||
for p in provinces:
|
||
if p in value:
|
||
info["basic"]["province"] = p
|
||
break
|
||
else:
|
||
info["basic"]["province"] = value.replace("省", "").strip()
|
||
elif key_num == "3":
|
||
# 分数
|
||
import re
|
||
|
||
numbers = re.findall(r"\d+", value)
|
||
if numbers:
|
||
info["exam"]["score"] = int(numbers[0])
|
||
elif key_num == "4":
|
||
# 位次
|
||
import re
|
||
|
||
numbers = re.findall(r"\d+", value)
|
||
if numbers:
|
||
info["exam"]["rank"] = int(numbers[0])
|
||
elif key_num == "5":
|
||
# 兴趣类型
|
||
code = value.upper()
|
||
if code in type_map:
|
||
info["profile"]["type_code"] = code
|
||
info["profile"]["type_name"] = type_map[code][0]
|
||
info["profile"]["recommended_majors"] = type_map[code][1]
|
||
elif key_num == "6":
|
||
# 优势学科
|
||
info["profile"]["strong_subjects"] = value.replace("、", " ")
|
||
elif key_num == "7":
|
||
# 不喜欢的内容
|
||
info["profile"]["dislikes"] = value
|
||
elif key_num in ["8", "9", "10"]:
|
||
# 选填项
|
||
if "经济" in line or key_num == "8":
|
||
info["constraints"]["economic"] = value
|
||
elif "毕业" in line or key_num == "9":
|
||
info["constraints"]["plan"] = value
|
||
elif "工作" in line or key_num == "10":
|
||
info["constraints"]["city"] = value
|
||
|
||
# 格式2: 紧凑型 "李明 浙江 612分 15230名 物化地 R 不接受社交"
|
||
elif " " in line and len(line.split()) >= 3:
|
||
parts = line.split()
|
||
# 尝试识别各部分
|
||
for i, part in enumerate(parts):
|
||
# 名字(通常第一个)
|
||
if i == 0 and len(part) >= 2 and part.isalpha():
|
||
info["basic"]["name"] = part
|
||
# 省份
|
||
elif part.replace("省", "") in [
|
||
"北京",
|
||
"天津",
|
||
"河北",
|
||
"山西",
|
||
"内蒙古",
|
||
"辽宁",
|
||
"吉林",
|
||
"黑龙江",
|
||
"上海",
|
||
"江苏",
|
||
"浙江",
|
||
"安徽",
|
||
"福建",
|
||
"江西",
|
||
"山东",
|
||
"河南",
|
||
"湖北",
|
||
"湖南",
|
||
"广东",
|
||
"广西",
|
||
"海南",
|
||
"重庆",
|
||
"四川",
|
||
"贵州",
|
||
"云南",
|
||
"西藏",
|
||
"陕西",
|
||
"甘肃",
|
||
"青海",
|
||
"宁夏",
|
||
"新疆",
|
||
]:
|
||
info["basic"]["province"] = part.replace("省", "")
|
||
# 分数(带"分")
|
||
elif "分" in part:
|
||
import re
|
||
|
||
nums = re.findall(r"\d+", part)
|
||
if nums:
|
||
info["exam"]["score"] = int(nums[0])
|
||
# 位次(带"名"或"位次")
|
||
elif "名" in part or "位次" in part:
|
||
import re
|
||
|
||
nums = re.findall(r"\d+", part)
|
||
if nums:
|
||
info["exam"]["rank"] = int(nums[0])
|
||
# 兴趣类型
|
||
elif part.upper() in type_map:
|
||
code = part.upper()
|
||
info["profile"]["type_code"] = code
|
||
info["profile"]["type_name"] = type_map[code][0]
|
||
info["profile"]["recommended_majors"] = type_map[code][1]
|
||
|
||
return info
|
||
|
||
|
||
def generate_quick_summary(info: dict) -> str:
|
||
"""生成快速摘要"""
|
||
lines = []
|
||
lines.append("\n" + "=" * 50)
|
||
lines.append("📋 快速信息汇总")
|
||
lines.append("=" * 50)
|
||
|
||
# 基本信息
|
||
name = info.get("basic", {}).get("name", "未知")
|
||
province = info.get("basic", {}).get("province", "未知")
|
||
lines.append(f"\n👤 {name} | {province}")
|
||
|
||
# 考试信息
|
||
score = info.get("exam", {}).get("score")
|
||
rank = info.get("exam", {}).get("rank")
|
||
if score:
|
||
lines.append(f"📊 高考:{score}分")
|
||
if rank:
|
||
lines.append(f"📊 位次:{rank}名")
|
||
|
||
# 兴趣类型
|
||
type_name = info.get("profile", {}).get("type_name")
|
||
type_code = info.get("profile", {}).get("type_code")
|
||
majors = info.get("profile", {}).get("recommended_majors", [])
|
||
if type_name:
|
||
lines.append(f"\n🎯 兴趣类型:{type_name} ({type_code})")
|
||
if majors:
|
||
lines.append(f" 推荐专业:{'、'.join(majors)}")
|
||
|
||
# 强项学科
|
||
strong = info.get("profile", {}).get("strong_subjects")
|
||
if strong:
|
||
lines.append(f"💪 优势学科:{strong}")
|
||
|
||
# 不喜欢
|
||
dislikes = info.get("profile", {}).get("dislikes")
|
||
if dislikes:
|
||
lines.append(f"❌ 应避免:{dislikes}")
|
||
|
||
# 约束
|
||
plan = info.get("constraints", {}).get("plan")
|
||
city = info.get("constraints", {}).get("city")
|
||
if plan or city:
|
||
lines.append(f"\n📍 规划:{plan or '未指定'} | 地域:{city or '未指定'}")
|
||
|
||
lines.append("\n" + "=" * 50)
|
||
|
||
# 缺失信息提醒
|
||
missing = []
|
||
if not info.get("basic", {}).get("name"):
|
||
missing.append("姓名")
|
||
if not info.get("exam", {}).get("score"):
|
||
missing.append("分数")
|
||
if not info.get("exam", {}).get("rank"):
|
||
missing.append("位次")
|
||
if not info.get("profile", {}).get("type_code"):
|
||
missing.append("兴趣类型")
|
||
|
||
if missing:
|
||
lines.append(f"⚠️ 还需补充:{', '.join(missing)}")
|
||
else:
|
||
lines.append("✅ 核心信息完整!可以开始推荐")
|
||
|
||
return "\n".join(lines)
|
||
|
||
|
||
def generate_quick_recommendation(info: dict) -> str:
|
||
"""基于快速信息生成初步推荐"""
|
||
lines = []
|
||
lines.append("\n" + "=" * 50)
|
||
lines.append("🎯 初步志愿建议")
|
||
lines.append("=" * 50)
|
||
|
||
# 基于霍兰德类型的推荐
|
||
type_code = info.get("profile", {}).get("type_code")
|
||
strong = info.get("profile", {}).get("strong_subjects", "")
|
||
dislikes = info.get("profile", {}).get("dislikes", "")
|
||
|
||
recommendations = {
|
||
"R": {
|
||
"majors": [
|
||
"计算机科学与技术",
|
||
"软件工程",
|
||
"电子信息工程",
|
||
"自动化",
|
||
"机械设计",
|
||
],
|
||
"reason": "喜欢动手操作,适合工科技术类专业",
|
||
"caution": "数学物理不能弱",
|
||
},
|
||
"I": {
|
||
"majors": ["数学与应用数学", "物理学", "临床医学", "生物科学", "化学"],
|
||
"reason": "喜欢研究探索,适合理科或医学类",
|
||
"caution": "需深造,本科就业面窄",
|
||
},
|
||
"A": {
|
||
"majors": [
|
||
"数字媒体技术",
|
||
"建筑学",
|
||
"工业设计",
|
||
"视觉传达设计",
|
||
"网络与新媒体",
|
||
],
|
||
"reason": "有创造力,适合设计或创意类专业",
|
||
"caution": "纯艺术就业难,推荐技术+艺术结合",
|
||
},
|
||
"S": {
|
||
"majors": ["临床医学", "师范类", "心理学", "护理学", "社会工作"],
|
||
"reason": "喜欢助人,适合医学或教育类专业",
|
||
"caution": "医学需长期投入,师范稳定但收入一般",
|
||
},
|
||
"E": {
|
||
"majors": ["工商管理", "经济学", "金融学", "法学", "市场营销"],
|
||
"reason": "有领导力,适合商科或管理类专业",
|
||
"caution": "非名校就业难,竞争激烈",
|
||
},
|
||
"C": {
|
||
"majors": ["会计学", "统计学", "财务管理", "信息管理与信息系统"],
|
||
"reason": "喜欢规范有序,适合财会或统计类专业",
|
||
"caution": "AI替代风险,需持续学习",
|
||
},
|
||
}
|
||
|
||
if type_code and type_code in recommendations:
|
||
rec = recommendations[type_code]
|
||
lines.append(f"\n【基于兴趣类型 {type_code}】")
|
||
lines.append(f"{rec['reason']}")
|
||
lines.append("\n📚 推荐专业方向:")
|
||
for i, major in enumerate(rec["majors"][:4], 1):
|
||
lines.append(f" {i}. {major}")
|
||
lines.append(f"\n⚠️ 注意事项:{rec['caution']}")
|
||
|
||
# 基于强学科的推荐
|
||
if strong:
|
||
lines.append("\n【基于优势学科】")
|
||
if "物理" in strong and "数学" in strong:
|
||
lines.append("物理数学强 → 计算机、电子信息、自动化")
|
||
elif "物理" in strong:
|
||
lines.append("物理强 → 工科类专业均可")
|
||
elif "数学" in strong:
|
||
lines.append("数学强 → 计算机、金融、统计、数学类")
|
||
elif "化学" in strong:
|
||
lines.append("化学强 → 医学、药学、材料、化工")
|
||
elif "生物" in strong:
|
||
lines.append("生物强 → 医学、生物科学、农学")
|
||
elif "语文" in strong or "英语" in strong:
|
||
lines.append("文科强 → 师范、法学、外语、新闻传播")
|
||
|
||
# 基于不喜欢的排除
|
||
if dislikes:
|
||
lines.append("\n【反向排除】")
|
||
if "数学" in dislikes or "计算" in dislikes:
|
||
lines.append("❌ 不喜欢数学 → 避开计算机、金融、人工智能")
|
||
if "背诵" in dislikes or "记忆" in dislikes:
|
||
lines.append("❌ 不喜欢背诵 → 避开法学、医学、文史哲")
|
||
if "社交" in dislikes or "应酬" in dislikes:
|
||
lines.append("❌ 不喜欢社交 → 避开市场营销、管理、师范")
|
||
if "实验" in dislikes:
|
||
lines.append("❌ 不喜欢实验 → 避开化学、生物、材料")
|
||
|
||
lines.append("\n" + "=" * 50)
|
||
|
||
return "\n".join(lines)
|
||
|
||
|
||
def main():
|
||
"""主函数 - 输出问卷模板"""
|
||
print(QUICK_3MIN_TEMPLATE)
|
||
|
||
print("\n" + "=" * 50)
|
||
print("或者使用极速版(1分钟):")
|
||
print("=" * 50)
|
||
print(ULTRA_1MIN_TEMPLATE)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|