Final_project / app.py
Dannyar608's picture
Create app.py
1d5a1b0 verified
raw
history blame
3.7 kB
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
def learning_style_quiz(q1, q2, q3):
scores = {'visual': 0, 'auditory': 0, 'reading/writing': 0, 'kinesthetic': 0}
mapping = [q1, q2, q3]
for answer in mapping:
scores[answer] += 1
best = max(scores, key=scores.get)
return best.capitalize()
# Save all answers into profile
def save_profile(file, q1, q2, q3, about_me, blog_text, blog_opt_in):
df = parse_transcript(file)
transcript_info = extract_transcript_info(df)
learning_type = learning_style_quiz(q1, q2, q3)
if not blog_opt_in and blog_text.strip() == "":
blog_text = "[User chose to skip this section]"
profile = {
"transcript": df.to_dict(orient='records'),
"transcript_info": transcript_info,
"learning_style": learning_type,
"about_me": about_me,
"blog": blog_text
}
with open("student_profile.json", "w") as f:
json.dump(profile, f, indent=4)
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")
q1 = gr.Radio(["visual", "auditory", "reading/writing", "kinesthetic"], label="1. How do you prefer to learn new topics?")
q2 = gr.Radio(["visual", "auditory", "reading/writing", "kinesthetic"], label="2. How do you remember lists best?")
q3 = gr.Radio(["visual", "auditory", "reading/writing", "kinesthetic"], label="3. Favorite way to study?")
with gr.Column():
gr.Markdown("### ❀️ About You")
about_me = gr.Textbox(lines=6, label="Answer a few questions: \n1. What’s a fun fact about you? \n2. Favorite music/artist? \n3. Your dream job?")
blog_opt_in = gr.Checkbox(label="I want to write a personal blog for better personalization")
blog_text = gr.Textbox(lines=5, label="✍️ Optional: Write a mini blog about your life", visible=True)
submit = gr.Button("πŸ“₯ Save My Profile")
output = gr.Textbox(label="Status")
submit.click(fn=save_profile,
inputs=[file, q1, q2, q3, about_me, blog_text, blog_opt_in],
outputs=[output])
if __name__ == '__main__':
demo.launch()