rca123456 commited on
Commit
2fbd716
·
verified ·
1 Parent(s): 21fca9f

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +96 -0
app.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from langchain_community.document_loaders import PyPDFLoader
3
+ from langchain_community.embeddings import HuggingFaceEmbeddings
4
+ from langchain.vectorstores import FAISS
5
+ from sklearn.metrics.pairwise import cosine_similarity
6
+ from langchain_groq import ChatGroq
7
+ from langchain.chains import LLMChain
8
+ from langchain.prompts import PromptTemplate
9
+ import numpy as np
10
+ import os
11
+
12
+ # ✅ Set Groq API Key
13
+ os.environ["GROQ_API_KEY"] = "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" # Replace with your actual Groq API key
14
+
15
+ def extract_text_from_pdf(pdf_file):
16
+ temp_path = f"temp_{pdf_file.name}"
17
+ with open(temp_path, "wb") as f:
18
+ f.write(pdf_file.read())
19
+ loader = PyPDFLoader(temp_path)
20
+ pages = loader.load_and_split()
21
+ os.remove(temp_path)
22
+ return " ".join([page.page_content for page in pages])
23
+
24
+ def extract_skills(text):
25
+ skills_list = ["Python", "SQL", "Machine Learning", "Deep Learning", "NLP", "Data Visualization", "Cloud", "TensorFlow", "PyTorch", "Statistics", "Java", "C++", "HTML", "CSS", "JavaScript"]
26
+ return [skill for skill in skills_list if skill.lower() in text.lower()]
27
+
28
+ def calculate_match(user_skills, job_skills):
29
+ common = set(user_skills) & set(job_skills)
30
+ match_percent = (len(common) / len(job_skills)) * 100 if job_skills else 0
31
+ missing_skills = list(set(job_skills) - set(user_skills))
32
+ return round(match_percent, 2), missing_skills
33
+
34
+ def generate_skill_gap_report(user_skills, job_skills, missing_skills, match_percent):
35
+ llm = ChatGroq(model="llama3-8b-8192", temperature=0.2)
36
+
37
+ template = """
38
+ User Skills: {user_skills}
39
+ Job Requirements: {job_skills}
40
+ Missing Skills: {missing_skills}
41
+ Match Percentage: {match_percent}%
42
+
43
+ Generate a short, friendly skill gap report. Suggest next steps for the user to improve their chances.
44
+ """
45
+
46
+ prompt = PromptTemplate.from_template(template)
47
+ chain = LLMChain(llm=llm, prompt=prompt)
48
+
49
+ report = chain.run({
50
+ "user_skills": ", ".join(user_skills),
51
+ "job_skills": ", ".join(job_skills),
52
+ "missing_skills": ", ".join(missing_skills),
53
+ "match_percent": match_percent
54
+ })
55
+
56
+ return report
57
+
58
+ def process_skill_gap(resume_pdf, jd_pdf):
59
+ if resume_pdf is None or jd_pdf is None:
60
+ return "❌ Please upload both Resume and Job Description PDFs.", "", "", ""
61
+
62
+ resume_text = extract_text_from_pdf(resume_pdf)
63
+ jd_text = extract_text_from_pdf(jd_pdf)
64
+
65
+ user_skills = extract_skills(resume_text)
66
+ job_skills = extract_skills(jd_text)
67
+
68
+ match_percent, missing_skills = calculate_match(user_skills, job_skills)
69
+
70
+ embed_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
71
+ vectors = embed_model.embed_documents([resume_text, jd_text])
72
+ similarity_score = cosine_similarity([vectors[0]], [vectors[1]])[0][0]
73
+ similarity_percent = round(similarity_score * 100, 2)
74
+
75
+ report = generate_skill_gap_report(user_skills, job_skills, missing_skills, match_percent)
76
+
77
+ return f"✅ Skill Match: {match_percent}%", f"❌ Missing Skills: {', '.join(missing_skills) if missing_skills else 'None'}", f"🔎 Similarity Score: {similarity_percent}%", report
78
+
79
+ demo = gr.Interface(
80
+ fn=process_skill_gap,
81
+ inputs=[
82
+ gr.File(label="Upload Resume (PDF)", type="binary"),
83
+ gr.File(label="Upload Job Description (PDF)", type="binary")
84
+ ],
85
+ outputs=[
86
+ gr.Textbox(label="Skill Match Percentage"),
87
+ gr.Textbox(label="Missing Skills"),
88
+ gr.Textbox(label="Similarity Score"),
89
+ gr.Textbox(label="AI-Generated Skill Gap Report")
90
+ ],
91
+ title="📄 Skill Gap AI Checker (Gradio + LangChain + Groq LLaMA3)",
92
+ description="Upload your Resume PDF and Job Description PDF to analyze your skill match percentage, missing skills, and get an AI-generated report using Groq's LLaMA3 model."
93
+ )
94
+
95
+ if __name__ == "__main__":
96
+ demo.launch()