Spaces:
Sleeping
Sleeping
import streamlit as st | |
from datasets import load_dataset | |
import pandas as pd | |
from transformers import pipeline | |
import time | |
# Constants | |
universities_url = "https://www.4icu.org/top-universities-world/" | |
# Load datasets with caching to optimize performance | |
def load_datasets(): | |
ds_jobs = load_dataset("lukebarousse/data_jobs") | |
ds_courses = load_dataset("azrai99/coursera-course-dataset") | |
ds_custom_courses = pd.read_csv("final_cleaned_merged_coursera_courses.csv") | |
ds_custom_jobs = pd.read_csv("merged_data_science_jobs.csv") | |
ds_custom_universities = pd.read_csv("merged_university_data_cleaned (1).csv") | |
return ds_jobs, ds_courses, ds_custom_courses, ds_custom_jobs, ds_custom_universities | |
ds_jobs, ds_courses, ds_custom_courses, ds_custom_jobs, ds_custom_universities = load_datasets() | |
# Initialize the pipeline with caching, using an accessible model like 'google/flan-t5-large' | |
def load_pipeline(): | |
return pipeline("text2text-generation", model="google/flan-t5-large") | |
qa_pipeline = load_pipeline() | |
# Streamlit App Interface | |
st.title("Career Counseling Application") | |
st.subheader("Build Your Profile and Discover Tailored Career Recommendations") | |
# Sidebar for Profile Setup | |
st.sidebar.header("Profile Setup") | |
educational_background = st.sidebar.text_input("Educational Background (e.g., Degree, Major)") | |
interests = st.sidebar.text_input("Interests (e.g., AI, Data Science, Engineering)") | |
tech_skills = st.sidebar.text_area("Technical Skills (e.g., Python, SQL, Machine Learning)") | |
soft_skills = st.sidebar.text_area("Soft Skills (e.g., Communication, Teamwork)") | |
# Save profile data for session-based recommendations | |
if st.sidebar.button("Save Profile"): | |
with st.spinner('Saving your profile...'): | |
time.sleep(2) # Simulate processing time | |
st.session_state.profile_data = { | |
"educational_background": educational_background, | |
"interests": interests, | |
"tech_skills": tech_skills, | |
"soft_skills": soft_skills | |
} | |
st.session_state.question_index = 0 # Initialize question index | |
st.session_state.answers = {} # Initialize dictionary for answers | |
st.session_state.submitted = False # Track if an answer was just submitted | |
st.sidebar.success("Profile saved successfully!") | |
st.write("To provide more personalized job and course recommendations, please answer the following questions one by one:") | |
# Additional questions for more tailored recommendations | |
additional_questions = [ | |
"What industry do you prefer working in (e.g., healthcare, finance, tech)?", | |
"What type of job role are you most interested in (e.g., research, management, development)?", | |
"Are you looking for remote, hybrid, or on-site opportunities?", | |
"Do you have any certifications or licenses related to your field?", | |
"What level of experience do you have (e.g., entry-level, mid-level, senior)?", | |
"What languages are you proficient in, apart from English (if any)?", | |
"Do you prefer working for startups, mid-sized companies, or large corporations?", | |
"What is your preferred learning style for courses (e.g., video tutorials, interactive projects, reading material)?", | |
"Are you open to relocation? If yes, to which cities or regions?", | |
"Do you have a preference for job roles in specific countries or regions?" | |
] | |
# Display questions one by one after the profile is saved | |
if "profile_data" in st.session_state and "question_index" in st.session_state: | |
total_questions = len(additional_questions) | |
# Show progress bar | |
progress = (st.session_state.question_index / total_questions) * 100 | |
st.progress(int(progress)) | |
st.write(f"Progress: {st.session_state.question_index} out of {total_questions} questions answered") | |
if st.session_state.question_index < total_questions: | |
question = additional_questions[st.session_state.question_index] | |
answer = st.text_input(question, key=f"q{st.session_state.question_index}") | |
# Submit button for each question | |
if st.button("Submit Answer", key=f"submit{st.session_state.question_index}"): | |
if answer: | |
st.session_state.answers[question] = answer | |
st.session_state.question_index += 1 | |
# Trigger page refresh using st.session_state change | |
st.session_state.updated = True # Indicate that a change has occurred | |
st.query_params = {"updated": "true"} # Update query params to indicate change | |
else: | |
st.warning("Please enter an answer before submitting.") | |
# Check if all questions are answered and show the "Generate Response" button | |
if st.session_state.question_index == total_questions: | |
st.success("All questions have been answered. Click below to generate your recommendations.") | |
if st.button("Generate Response"): | |
# Save all answers in the profile data | |
st.session_state.profile_data.update(st.session_state.answers) | |
# Career and Job Recommendations Section | |
st.header("Job Recommendations") | |
with st.spinner('Generating job recommendations...'): | |
time.sleep(2) # Simulate processing time | |
job_recommendations = [] | |
# Find jobs from ds_jobs | |
for job in ds_jobs["train"]: | |
job_title = job.get("job_title_short", "Unknown Job Title") | |
job_skills = job.get("job_skills", "") or "" | |
if any(skill.lower() in job_skills.lower() for skill in st.session_state.profile_data["tech_skills"].split(",")): | |
job_recommendations.append(job_title) | |
# Find jobs from ds_custom_jobs | |
for _, job in ds_custom_jobs.iterrows(): | |
job_title = job.get("job_title", "Unknown Job Title") | |
job_skills = job.get("skills", "") or "" | |
if any(skill.lower() in job_skills.lower() for skill in st.session_state.profile_data["tech_skills"].split(",")): | |
job_recommendations.append(job_title) | |
# Remove duplicates and keep the unique job titles | |
job_recommendations = list(set(job_recommendations)) | |
if job_recommendations: | |
st.subheader("Based on your profile, here are some potential job roles:") | |
for job in job_recommendations[:5]: # Limit to top 5 job recommendations | |
st.write("- ", job) | |
else: | |
st.write("No specific job recommendations found matching your profile. Here are some general recommendations:") | |
for job in ["Data Analyst", "Software Engineer", "Project Manager", "Research Scientist", "Business Analyst"][:5]: | |
st.write("- ", job) | |
# Course Suggestions Section | |
st.header("Recommended Courses") | |
with st.spinner('Finding courses related to your profile...'): | |
time.sleep(2) # Simulate processing time | |
course_recommendations = [] | |
# Find relevant courses in ds_courses | |
for course in ds_courses["train"]: | |
if any(interest.lower() in course.get("Course Name", "").lower() for interest in st.session_state.profile_data["interests"].split(",")): | |
course_recommendations.append({ | |
"name": course.get("Course Name", "Unknown Course Title"), | |
"url": course.get("Links", "#") | |
}) | |
# Find relevant courses in ds_custom_courses | |
for _, row in ds_custom_courses.iterrows(): | |
if any(interest.lower() in row["Course Name"].lower() for interest in st.session_state.profile_data["interests"].split(",")): | |
course_recommendations.append({ | |
"name": row["Course Name"], | |
"url": row.get("Links", "#") | |
}) | |
# Remove duplicates from course recommendations by converting to a set of tuples and back to a list | |
course_recommendations = list({(course["name"], course["url"]) for course in course_recommendations}) | |
# If there are fewer than 5 exact matches, add nearly related courses | |
if len(course_recommendations) < 5: | |
for course in ds_courses["train"]: | |
if len(course_recommendations) >= 5: | |
break | |
if any(skill.lower() in course.get("Course Name", "").lower() for skill in st.session_state.profile_data["tech_skills"].split(",")): | |
course_recommendations.append((course.get("Course Name", "Unknown Course Title"), course.get("Links", "#"))) | |
for _, row in ds_custom_courses.iterrows(): | |
if len(course_recommendations) >= 5: | |
break | |
if any(skill.lower() in row["Course Name"].lower() for skill in st.session_state.profile_data["tech_skills"].split(",")): | |
course_recommendations.append((row["Course Name"], row.get("Links", "#"))) | |
# Remove duplicates again after adding nearly related courses | |
course_recommendations = list({(name, url) for name, url in course_recommendations}) | |
if course_recommendations: | |
st.write("Here are the top 5 courses related to your interests:") | |
for course in course_recommendations[:5]: # Limit to top 5 course recommendations | |
st.write(f"- [{course[0]}]({course[1]})") | |
# University Recommendations Section | |
st.header("Top Universities") | |
st.write("For further education, you can explore the top universities worldwide:") | |
st.write(f"[View Top Universities Rankings]({universities_url})") | |
# Conclusion | |
st.write("Thank you for using the Career Counseling Application!") |