File size: 9,529 Bytes
1d5a1b0
 
 
 
 
 
a6c95c9
1d5a1b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6c95c9
1d5a1b0
 
 
 
 
 
5069192
1d5a1b0
 
 
 
 
 
 
aa96e64
1c96b69
a6c95c9
 
 
 
 
 
 
 
 
 
1c96b69
 
 
29859bc
 
 
 
 
 
 
 
 
 
1c96b69
 
64fb9b0
 
1c96b69
a6c95c9
aa96e64
8a19c8a
 
 
 
ed8a781
 
8a19c8a
aa96e64
64fb9b0
 
aa96e64
64fb9b0
1d5a1b0
aa96e64
1c96b69
 
a6c95c9
 
 
 
177c224
 
 
 
 
1c96b69
 
a6c95c9
 
 
 
 
1c96b69
 
a6c95c9
 
 
 
 
1c96b69
 
a6c95c9
 
 
 
 
1c96b69
 
 
aa96e64
 
 
 
 
 
 
 
 
 
 
 
ba0cf2b
aa96e64
 
 
 
 
ba0cf2b
aa96e64
 
 
 
 
 
 
ba0cf2b
aa96e64
 
 
 
ba0cf2b
aa96e64
 
 
ba0cf2b
aa96e64
 
 
ba0cf2b
aa96e64
 
ba0cf2b
aa96e64
 
 
 
 
 
 
 
 
1c96b69
aa96e64
 
 
 
 
 
 
1c96b69
aa96e64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53b63a7
aa96e64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
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 questions - from educationplanner.org
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)

# PanoramaEd categories and multiple choice questions
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?", [])
    ]
}

# Generators for output summaries
def generate_learning_plan(info):
    level = info.get("Grade_Level", "unknown")
    courses = info.get("Courses", [])
    gpa = info.get("GPA", "N/A")
    return f"""
📘 **Personalized Learning Plan**
- Grade Level: {level}
- GPA: {gpa}
- Suggested Focus Areas: {', '.join(courses[:3]) if courses else 'N/A'}
- Goals: Strengthen key subjects, explore interests, and build study habits.
"""

def generate_learning_style_summary(style):
    return f"""
🧠 **Learning Style Summary**
You are a **{style}** learner. That means you learn best through {"visual aids like charts and images" if "Visual" in style else "listening and verbal instruction" if "Auditory" in style else "reading and writing-based methods"}.
"""

def generate_motivation_section(responses):
    hopes = [ans for q, ans in responses.items() if "hope" in q.lower() or "dream" in q.lower()]
    return f"""
💡 **Motivational Summary**
Your dreams are powerful: {'; '.join(hopes) if hopes else 'You are filled with potential!'}. 
Believe in yourself and keep moving forward.
"""

# Save all answers into profile
def save_profile(file, *inputs):
    if not file:
        return "⚠️ Please upload your transcript."

    quiz_answers = inputs[:len(learning_style_questions)]
    if any(ans is None for ans in quiz_answers):
        return "⚠️ Please answer all the learning style questions."

    blog_checkbox = inputs[len(learning_style_questions)]
    blog_text = inputs[len(learning_style_questions)+1]
    category_answers = inputs[len(learning_style_questions)+2:]

    if any(ans.strip() == "" for ans in category_answers):
        return "⚠️ Please complete all 'Get to Know You' sections before saving."

    if blog_checkbox and blog_text.strip() == "":
        return "⚠️ You checked the blog option but didn’t write anything. Please write your mini blog or uncheck the option."

    df = parse_transcript(file)
    transcript_info = extract_transcript_info(df)
    learning_type = learning_style_quiz(*quiz_answers)

    question_texts = [q for cat in get_to_know_categories.values() for q, _ in cat]
    responses = dict(zip(question_texts, category_answers))

    profile = {
        "transcript": df.to_dict(orient='records'),
        "transcript_info": transcript_info,
        "learning_style": learning_type,
        "get_to_know_answers": responses,
        "blog": blog_text if blog_checkbox else "[User chose to skip this section]"
    }

    summary = {
        "Learning_Plan": generate_learning_plan(transcript_info),
        "Style_Summary": generate_learning_style_summary(learning_type),
        "Motivation": generate_motivation_section(responses)
    }

    with open("student_profile.json", "w") as f:
        json.dump(profile, f, indent=4)

    with open("student_summary.md", "w") as f:
        f.write(summary["Learning_Plan"] + '\n' + summary["Style_Summary"] + '\n' + summary["Motivation"])

    return f"✅ Profile saved! Your learning style is: {learning_type}"

# Build Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("## 🎓 Personalized AI Student Assistant")

    with gr.Row():
        file = gr.File(label="📄 Upload Your Transcript (.csv, .xlsx, .pdf)")

    with gr.Column():
        gr.Markdown("### 🧠 Learning Style Discovery")
        quiz_components = []
        for i, (question, options) in enumerate(zip(learning_style_questions, learning_style_answers)):
            quiz_components.append(gr.Radio(
                choices=options,
                label=f"{i+1}. {question}"
            ))

    category_inputs = []
    for category, questions in get_to_know_categories.items():
        gr.Markdown(f"### 📘 {category}")
        for q_text, _ in questions:
            category_inputs.append(gr.Textbox(label=q_text))

    blog_checkbox = gr.Checkbox(label="📝 I'd like to write a mini blog about myself")
    blog_text = gr.Textbox(lines=5, label="✍️ Mini Blog", visible=False)

    blog_checkbox.change(fn=lambda x: gr.update(visible=x), inputs=blog_checkbox, outputs=blog_text)

    submit = gr.Button("🗕️ Save My Profile")
    output = gr.Textbox(label="Status")

    submit.click(fn=save_profile,
                 inputs=[file, *quiz_components, blog_checkbox, blog_text, *category_inputs],
                 outputs=[output])

if __name__ == '__main__':
    demo.launch()