Spaces:
Runtime error
Runtime error
File size: 9,326 Bytes
1d5a1b0 a6c95c9 1d5a1b0 a6c95c9 1d5a1b0 5069192 1d5a1b0 53b63a7 1c96b69 a6c95c9 1c96b69 29859bc 1c96b69 64fb9b0 1c96b69 a6c95c9 8a19c8a ed8a781 8a19c8a 64fb9b0 1d5a1b0 1c96b69 a6c95c9 177c224 1c96b69 a6c95c9 1c96b69 a6c95c9 1c96b69 a6c95c9 1c96b69 ba0cf2b ff89cdb ba0cf2b 1c96b69 53b63a7 1d5a1b0 53b63a7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
import gradio as gr
import pandas as pd
import PyPDF2
import json
import re
# Parse uploaded transcript file
def parse_transcript(file):
if file.name.endswith('.csv'):
df = pd.read_csv(file.name)
elif file.name.endswith(('.xls', '.xlsx')):
df = pd.read_excel(file.name)
elif file.name.endswith('.pdf'):
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text() or ""
df = pd.DataFrame({'Transcript_Text': [text]})
else:
raise ValueError("Unsupported file format. Use .csv, .xlsx, or .pdf")
return df
# Extract student info
def extract_transcript_info(df):
transcript_text = df['Transcript_Text'].iloc[0] if 'Transcript_Text' in df.columns else ''
info = {}
gpa_match = re.search(r'(GPA|Grade Point Average)[^\d]*(\d+\.\d+)', transcript_text, re.IGNORECASE)
if gpa_match:
info['GPA'] = gpa_match.group(2)
grade_match = re.search(r'Grade:?[\s]*(\d{1,2})', transcript_text, re.IGNORECASE)
if grade_match:
info['Grade_Level'] = grade_match.group(1)
courses = re.findall(r'(?i)\b([A-Z][a-zA-Z\s&/]+)\s+(\d{1,3})\b', transcript_text)
if courses:
info['Courses'] = list(set([c[0].strip() for c in courses]))
return info
# Learning style quiz
learning_style_questions = [
"When you are learning something new, you prefer to:",
"When you are at home, you like to:",
"When you spell a word, you remember it by:",
"When you read, you:",
"When you write, you:",
"When you listen to music, you:",
"When you work at solving a problem, you:",
"When you give someone directions, you:",
"When you are concentrating, you:",
"When you meet someone new, you remember them by:"
]
learning_style_answers = [
["Watch someone do it", "Listen to someone explain it", "Read about it"],
["Watch TV or play video games", "Listen to music or talk to people", "Read books or write stories"],
["Seeing the word in your mind", "Saying the word out loud", "Writing the word down"],
["See the action in your mind", "Hear the characters talk", "Focus on the written words"],
["Use diagrams or doodles", "Talk about ideas", "Write detailed notes"],
["Appreciate the rhythm and melodies", "Easily remember lyrics", "Analyze the lyrics"],
["Visualize the solution", "Discuss the problem", "Write out the steps"],
["Draw a map", "Give spoken directions", "Write directions"],
["Picture things", "Say things out loud", "Write or read quietly"],
["Remember faces", "Remember names or voices", "Remember what you wrote about them"]
]
style_count_map = {0: "visual", 1: "auditory", 2: "reading/writing"}
def learning_style_quiz(*answers):
scores = {'visual': 0, 'auditory': 0, 'reading/writing': 0}
for i, ans in enumerate(answers):
if i < len(learning_style_answers):
options = learning_style_answers[i]
if ans in options:
index = options.index(ans)
style = style_count_map[index]
scores[style] += 1
max_score = max(scores.values())
best_styles = [style.capitalize() for style, score in scores.items() if score == max_score]
return ", ".join(best_styles)
get_to_know_categories = {
"All About Me": [
("What’s your favorite way to spend a day off?", []),
("If you could only eat one food for the rest of your life, what would it be?", []),
("Do you have any pets? If so, what are their names?", []),
("If you could travel anywhere in the world, where would you go?", []),
("What’s your favorite holiday or tradition?", []),
("What are some of your favorite movies or shows?", []),
("Do you have a favorite book or book series? Why?", []),
("Who is a character from a show, book, or movie that you relate to? Why?", []),
("If you could be any fictional character, who would you be and why?", [])
],
"Hopes and Dreams": [
("What do you want to be when you grow up?", []),
("What’s something you hope to achieve this year?", []),
("If you could change the world in one way, what would you do?", []),
("What are you most proud of?", []),
("What’s a big dream you have for your future?", [])
],
"School Life": [
("What’s your favorite subject in school?", []),
("What’s something that makes learning easier for you?", []),
("Do you prefer working alone or in groups?", []),
("What helps you feel confident in class?", []),
("What’s something you’re good at in school?", [])
],
"Relationships": [
("Who do you look up to and why?", []),
("Who is someone that makes you feel safe and supported?", []),
("Do you have a best friend? What do you like to do together?", []),
("What’s one thing you wish people knew about you?", []),
("What’s something kind you’ve done for someone else?", [])
]
}
def display_saved_profile():
try:
with open("student_profile.json", "r") as f:
profile = json.load(f)
except FileNotFoundError:
return "⚠️ No profile data found."
transcript_info = profile.get("transcript_info", {})
gpa = transcript_info.get("GPA", "N/A")
grade = transcript_info.get("Grade_Level", "N/A")
courses = transcript_info.get("Courses", [])
past_classes = [{'Course': course, 'Grade': 'A'} for course in courses[:max(len(courses)-2, 0)]]
current_classes = [{'Course': course, 'Grade': 'IP'} for course in courses[-2:]]
all_classes_df = pd.DataFrame(past_classes + current_classes)
learning_type = profile.get("learning_style", "N/A")
responses = profile.get("get_to_know_answers", {})
blog = profile.get("blog", "[User skipped this section]")
comments = [f"⭐ I love how you spend your free time: {responses.get('What’s your favorite way to spend a day off?', 'N/A')}.",
f"🍕 {responses.get('If you could only eat one food for the rest of your life, what would it be?', 'N/A')} sounds delicious!",
f"🎬 You mentioned {responses.get('What are some of your favorite movies or shows?', 'N/A')}. Great picks!"]
blog_comment = ""
if blog and blog != "[User chose to skip this section]":
blog_comment = f"📝 Your blog was very thoughtful! You wrote: \"{blog[:150]}...\""
summary_text = f"""
👤 **Student Overview**
- Name: Extracted from transcript (if available)
- GPA: {gpa}
- Grade Level: {grade}
📚 **Courses**
{all_classes_df.to_markdown(index=False)}
🧠 **Learning Type**
Based on your answers, your learning style is: **{learning_type}**
💬 **Personal Reflections**
{chr(10).join(comments)}
{blog_comment}
❓ Is all this information correct?
"""
return summary_text
# Interface
with gr.Blocks() as demo:
profile_interface = gr.Column(visible=True)
confirmation_interface = gr.Column(visible=False)
with profile_interface:
gr.Markdown("## ✍️ Create Your Profile")
transcript_input = gr.File(label="Upload Transcript (.csv, .xlsx, or .pdf)")
ls_dropdowns = [gr.Dropdown(choices=learning_style_answers[i], label=learning_style_questions[i]) for i in range(10)]
get_to_know_inputs = {}
for section, questions in get_to_know_categories.items():
gr.Markdown(f"### {section}")
for q, _ in questions:
get_to_know_inputs[q] = gr.Textbox(label=q)
blog_input = gr.Textbox(label="Write a short blog about yourself (optional)", lines=5)
save_btn = gr.Button("Save Profile")
with confirmation_interface:
gr.Markdown("## ✅ Profile Review & Confirmation")
summary_output = gr.Markdown()
confirm_btn = gr.Button("Yes, everything is correct")
correct_btn = gr.Button("No, I need to make changes")
final_status = gr.Textbox(label="Final Status")
def save_profile(transcript_file, *answers):
df = parse_transcript(transcript_file)
transcript_info = extract_transcript_info(df)
learning_result = learning_style_quiz(*answers[:10])
personal_responses = {q: ans for q, ans in zip(get_to_know_inputs.keys(), answers[10:-1])}
blog_text = answers[-1]
student_data = {
"transcript_info": transcript_info,
"learning_style": learning_result,
"get_to_know_answers": personal_responses,
"blog": blog_text or "[User chose to skip this section]"
}
with open("student_profile.json", "w") as f:
json.dump(student_data, f, indent=2)
return gr.update(visible=False), gr.update(visible=True), display_saved_profile()
save_btn.click(
fn=save_profile,
inputs=[transcript_input] + ls_dropdowns + list(get_to_know_inputs.values()) + [blog_input],
outputs=[profile_interface, confirmation_interface, summary_output]
)
confirm_btn.click(fn=lambda: "🎉 All set! You're ready to move forward.", outputs=[final_status])
correct_btn.click(fn=lambda: "🔁 Okay! Please update the necessary information and save again.", outputs=[final_status])
if __name__ == '__main__':
demo.launch() |