Spaces:
Sleeping
Sleeping
sancharikadebnath
commited on
Commit
·
66e260e
1
Parent(s):
cf3a54c
Added all feature file
Browse files- .gitignore +1 -0
- __pycache__/ats.cpython-39.pyc +0 -0
- __pycache__/docLoader.cpython-39.pyc +0 -0
- app.py +91 -31
- components/__pycache__/ats.cpython-39.pyc +0 -0
- components/__pycache__/docLoader.cpython-39.pyc +0 -0
- components/__pycache__/functions.cpython-39.pyc +0 -0
- components/__pycache__/prompts.cpython-39.pyc +0 -0
- components/docLoader.py +60 -0
- ats.py → components/functions.py +45 -73
- components/prompts.py +345 -0
- features/__pycache__/analyzer.cpython-39.pyc +0 -0
- features/__pycache__/ats.cpython-39.pyc +0 -0
- features/__pycache__/company_recommend.cpython-39.pyc +0 -0
- features/__pycache__/cover_letter.cpython-39.pyc +0 -0
- features/__pycache__/enhance.cpython-39.pyc +0 -0
- features/__pycache__/improve.cpython-39.pyc +0 -0
- features/__pycache__/interview.cpython-39.pyc +0 -0
- features/__pycache__/linkedin.cpython-39.pyc +0 -0
- features/__pycache__/newresume.cpython-39.pyc +0 -0
- features/__pycache__/recommend.cpython-39.pyc +0 -0
- features/__pycache__/review.cpython-39.pyc +0 -0
- features/__pycache__/synonym.cpython-39.pyc +0 -0
- features/analyzer.py +36 -0
- features/ats.py +33 -0
- features/company_recommend.py +30 -0
- features/cover_letter.py +31 -0
- features/enhance.py +30 -0
- features/improve.py +30 -0
- features/interview.py +31 -0
- features/linkedin.py +30 -0
- features/newresume.py +25 -0
- features/recommend.py +28 -0
- features/review.py +26 -0
- overleaf.py +16 -0
- requirements.txt +2 -1
.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
.env
|
__pycache__/ats.cpython-39.pyc
ADDED
Binary file (3.96 kB). View file
|
|
__pycache__/docLoader.cpython-39.pyc
ADDED
Binary file (1.45 kB). View file
|
|
app.py
CHANGED
@@ -1,43 +1,103 @@
|
|
1 |
# app.py
|
|
|
2 |
import streamlit as st
|
3 |
-
import
|
4 |
-
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
st.title("Enchant your Career")
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
|
16 |
-
|
|
|
|
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
pages = pdf.pages
|
21 |
-
for page in pages:
|
22 |
-
text = page.extract_text()
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
full_text = []
|
30 |
-
for para in docx_text.paragraphs:
|
31 |
-
full_text.append(para.text)
|
32 |
-
text = "\n".join(full_text)
|
33 |
-
|
34 |
-
st.text_area("Extracted From Document",value=text)
|
35 |
-
st.session_state['doc_text'] = text
|
36 |
|
37 |
-
col1, col2, col3 = st.columns([3, 3,3])
|
38 |
-
option = st.radio("I want to use: ", ("ATS"), horizontal=True)
|
39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# app.py
|
2 |
+
import os
|
3 |
import streamlit as st
|
4 |
+
from features import (ats,
|
5 |
+
analyzer,
|
6 |
+
company_recommend,
|
7 |
+
cover_letter,
|
8 |
+
enhance,
|
9 |
+
improve,
|
10 |
+
interview,
|
11 |
+
linkedin,
|
12 |
+
newresume,
|
13 |
+
recommend,
|
14 |
+
review)
|
15 |
+
from components import docLoader
|
16 |
+
from dotenv import load_dotenv
|
17 |
+
import google.generativeai as genai
|
18 |
+
from langchain_google_genai import ChatGoogleGenerativeAI
|
19 |
|
20 |
+
load_dotenv()
|
21 |
+
|
22 |
+
class CareerEnchanter(object):
|
23 |
+
def __init__(self, title="CareerEnchanter"):
|
24 |
+
self.title = title
|
25 |
+
|
26 |
+
@staticmethod
|
27 |
+
def model():
|
28 |
+
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
29 |
+
return ChatGoogleGenerativeAI(model="gemini-pro")
|
30 |
+
|
31 |
+
enchanter = CareerEnchanter()
|
32 |
+
st.set_page_config(page_title=enchanter.title, page_icon='🤖', layout='centered')
|
33 |
|
34 |
st.title("Enchant your Career")
|
35 |
|
36 |
+
text = docLoader.load_doc()
|
37 |
+
st.session_state['doc_text'] = text
|
38 |
+
jd=st.text_area("Job Description: ",key="input")
|
39 |
+
with st.sidebar:
|
40 |
+
st.title(' :blue[_Career Enchanter_] 🤖')
|
41 |
+
option = st.radio("Select an option: ", (
|
42 |
+
"ATS Score",
|
43 |
+
"Resume Review",
|
44 |
+
"Resume Enhancements",
|
45 |
+
"Resume Improvements",
|
46 |
+
"Recommendation",
|
47 |
+
"Keywords",
|
48 |
+
"Generate Cover Letter",
|
49 |
+
"Resume Generator",
|
50 |
+
"Linkedin Profile Update",
|
51 |
+
"Posssible Interview Questions",
|
52 |
+
"Company Recommendations"
|
53 |
+
))
|
54 |
|
55 |
+
|
56 |
+
if option == "ATS Score":
|
57 |
+
calculation_method = st.radio("Choose how you want to calculate ATS Score: ", ("Using AI", "Manually (Cosine Similarity)"), horizontal=True)
|
58 |
|
59 |
+
elif option == "Recommendation":
|
60 |
+
recommendation_type = st.radio("Select the type of recommendation you want: ", ("Entire Resume", "Section Wise"), horizontal=True)
|
|
|
|
|
|
|
61 |
|
62 |
+
elif option == "Keywords":
|
63 |
+
analyz_type = st.radio("Select the type of Keywords Fucntion you want: ", ("Analyse Keywords", "Keyword Synonyms"), horizontal=True)
|
64 |
+
|
65 |
+
with st.spinner("Loading Model..."):
|
66 |
+
llm = enchanter.model()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
|
|
|
|
68 |
|
69 |
+
# Create a dictionary mapping options to functions
|
70 |
+
option_functions = {
|
71 |
+
"ATS Score": ats.run_ats,
|
72 |
+
"Resume Review": review.run_review,
|
73 |
+
"Resume Enhancements": enhance.run_enhance,
|
74 |
+
"Resume Improvements": improve.run_improve,
|
75 |
+
"Recommendation": recommend.run_recommend,
|
76 |
+
"Keywords": analyzer.run_analyzer,
|
77 |
+
"Generate Cover Letter": cover_letter.run_letter,
|
78 |
+
"Resume Generator": newresume.run_newresume,
|
79 |
+
"Linkedin Profile Update": linkedin.run_linkedin,
|
80 |
+
"Posssible Interview Questions": interview.run_interview,
|
81 |
+
"Company Recommendations": company_recommend.run_company
|
82 |
+
}
|
83 |
|
84 |
+
# Handle the selected option
|
85 |
+
if option in option_functions:
|
86 |
+
func = option_functions[option]
|
87 |
+
if option == "ATS Score":
|
88 |
+
if calculation_method == "Manually (Cosine Similarity)":
|
89 |
+
func(llm, st.session_state['doc_text'], jd, manual=True)
|
90 |
+
else:
|
91 |
+
func(llm, st.session_state['doc_text'], jd)
|
92 |
+
elif option == "Recommendation":
|
93 |
+
if recommendation_type == "Entire Resume":
|
94 |
+
func(llm, st.session_state['doc_text'], jd, section=True)
|
95 |
+
else:
|
96 |
+
func(llm, st.session_state['doc_text'], jd)
|
97 |
+
elif option == "Keywords":
|
98 |
+
if analyz_type == "Analyse Keywords":
|
99 |
+
func(llm, st.session_state['doc_text'], jd, analysis=True)
|
100 |
+
else:
|
101 |
+
func(llm, st.session_state['doc_text'], jd)
|
102 |
+
else:
|
103 |
+
func(llm, st.session_state['doc_text'], jd)
|
components/__pycache__/ats.cpython-39.pyc
ADDED
Binary file (1.03 kB). View file
|
|
components/__pycache__/docLoader.cpython-39.pyc
ADDED
Binary file (2.32 kB). View file
|
|
components/__pycache__/functions.cpython-39.pyc
ADDED
Binary file (4.22 kB). View file
|
|
components/__pycache__/prompts.cpython-39.pyc
ADDED
Binary file (22.3 kB). View file
|
|
components/docLoader.py
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pdfplumber
|
3 |
+
import docx
|
4 |
+
import pylatexenc
|
5 |
+
|
6 |
+
class docLoader():
|
7 |
+
def __init__(self):
|
8 |
+
pass
|
9 |
+
|
10 |
+
def load(self, uploaded_file):
|
11 |
+
if uploaded_file is not None:
|
12 |
+
st.write("File uploaded successfully!")
|
13 |
+
|
14 |
+
file_extension = uploaded_file.name.split(".")[-1]
|
15 |
+
|
16 |
+
load_functions = {
|
17 |
+
"pdf": self.load_pdf,
|
18 |
+
"txt": self.load_txt,
|
19 |
+
"docx": self.load_docx,
|
20 |
+
"tex": self.load_tex
|
21 |
+
}
|
22 |
+
|
23 |
+
if file_extension in load_functions:
|
24 |
+
text = load_functions[file_extension](uploaded_file)
|
25 |
+
st.text_area("Extracted From Document", value=text)
|
26 |
+
else:
|
27 |
+
st.write("Unsupported file format")
|
28 |
+
|
29 |
+
else:
|
30 |
+
text = ''
|
31 |
+
return text
|
32 |
+
|
33 |
+
def load_pdf(self, uploaded_file):
|
34 |
+
with pdfplumber.open(uploaded_file) as pdf:
|
35 |
+
pages = pdf.pages
|
36 |
+
text = ""
|
37 |
+
for page in pages:
|
38 |
+
text += page.extract_text()
|
39 |
+
return text
|
40 |
+
|
41 |
+
def load_txt(self, uploaded_file):
|
42 |
+
return uploaded_file.getvalue().decode("utf-8")
|
43 |
+
|
44 |
+
def load_docx(self, uploaded_file):
|
45 |
+
docx_text = docx.Document(uploaded_file)
|
46 |
+
full_text = [para.text for para in docx_text.paragraphs]
|
47 |
+
return "\n".join(full_text)
|
48 |
+
|
49 |
+
def load_tex(self, uploaded_file):
|
50 |
+
with open(uploaded_file.name, 'r') as tex_file:
|
51 |
+
tex_content = tex_file.read()
|
52 |
+
return pylatexenc.latex2text(tex_content)
|
53 |
+
|
54 |
+
def load_doc():
|
55 |
+
uploaded_file = st.file_uploader("Choose a document file", type=["pdf", "txt", "docx"])
|
56 |
+
loader = docLoader()
|
57 |
+
return loader.load(uploaded_file)
|
58 |
+
|
59 |
+
if __name__ == "__main__":
|
60 |
+
load_doc()
|
ats.py → components/functions.py
RENAMED
@@ -1,25 +1,24 @@
|
|
|
|
1 |
import os
|
2 |
import pyperclip
|
3 |
import streamlit as st
|
4 |
-
from dotenv import load_dotenv
|
5 |
import speech_recognition as sr
|
6 |
-
import
|
7 |
-
|
8 |
-
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
class ATS(object):
|
12 |
-
def __init__(self, title="ATS Tracking System"):
|
13 |
-
self.title = title
|
14 |
|
15 |
-
|
16 |
-
def model():
|
17 |
-
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
18 |
-
return ChatGoogleGenerativeAI(model="gemini-pro")
|
19 |
|
20 |
@staticmethod
|
21 |
def get_gemini_response(llm, input_text, doc, template, info=''):
|
22 |
-
formated_prompt = template.format(doc=doc, input_text=input_text)
|
23 |
response = llm.invoke(formated_prompt)
|
24 |
return response.content
|
25 |
# return formated_prompt
|
@@ -55,64 +54,37 @@ class ATS(object):
|
|
55 |
if isinstance(input_text, str):
|
56 |
st.session_state['input_text'] = input_text
|
57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
|
59 |
-
def run_ats(doc=''):
|
60 |
-
load_dotenv()
|
61 |
-
ats = ATS()
|
62 |
-
st.header(ats.title + " 🤖", divider='rainbow')
|
63 |
-
input_text=st.text_area("Job Description: ",key="input")
|
64 |
-
# uploaded_file=st.file_uploader("Upload your resume(PDF)...",type=["pdf"])
|
65 |
-
|
66 |
-
|
67 |
-
# if uploaded_file is not None:
|
68 |
-
# st.write("PDF Uploaded Successfully")
|
69 |
-
|
70 |
-
|
71 |
-
with st.sidebar:
|
72 |
-
st.title(' :blue[_AI Generated ATS] 🤖')
|
73 |
-
st.subheader('Parameters')
|
74 |
-
|
75 |
-
with st.spinner("Loading Model..."):
|
76 |
-
llm = ats.model()
|
77 |
-
submit1 = st.button("Tell Me About the Resume")
|
78 |
-
|
79 |
-
# submit2 = st.button("How Can I Improvise my Skills")
|
80 |
-
|
81 |
-
submit3 = st.button("Percentage match")
|
82 |
-
|
83 |
-
input_prompt1 = """
|
84 |
-
You are an experienced Technical Human Resource Manager,your task is to review the provided resume against the job description.
|
85 |
-
Please share your professional evaluation on whether the candidate's profile aligns with the role.
|
86 |
-
Highlight the strengths and weaknesses of the applicant in relation to the specified job requirements.
|
87 |
-
|
88 |
-
Job Description: {input_text}
|
89 |
-
Resume: {doc}
|
90 |
-
"""
|
91 |
-
|
92 |
-
input_prompt3 = """
|
93 |
-
You are an skilled ATS (Applicant Tracking System) scanner with a deep understanding of data science and ATS functionality,
|
94 |
-
your task is to evaluate the resume against the provided job description. give me the percentage of match if the resume matches
|
95 |
-
the job description. First the output should come as percentage and then keywords missing and last final thoughts.
|
96 |
-
|
97 |
-
Job Description: {input_text}
|
98 |
-
Resume: {doc}
|
99 |
-
"""
|
100 |
-
|
101 |
-
if submit1:
|
102 |
-
if doc is not None:
|
103 |
-
response=ats.get_gemini_response(llm=llm,template=input_prompt1,doc=doc,input_text=input_text)
|
104 |
-
st.subheader("The Repsonse is")
|
105 |
-
st.write(response)
|
106 |
-
else:
|
107 |
-
st.write("Please uplaod the resume")
|
108 |
-
|
109 |
-
elif submit3:
|
110 |
-
if doc is not None:
|
111 |
-
response=ats.get_gemini_response(llm=llm,template=input_prompt3,doc=doc,input_text=input_text)
|
112 |
-
st.subheader("The Repsonse is")
|
113 |
-
st.write(response)
|
114 |
-
else:
|
115 |
-
st.write("Please uplaod the resume")
|
116 |
-
|
117 |
-
if __name__ == "__main__":
|
118 |
-
run_ats()
|
|
|
1 |
+
#fucntions.py
|
2 |
import os
|
3 |
import pyperclip
|
4 |
import streamlit as st
|
|
|
5 |
import speech_recognition as sr
|
6 |
+
import re
|
7 |
+
import numpy as np
|
8 |
+
import numpy as np
|
9 |
+
import torch
|
10 |
+
from nltk.corpus import stopwords
|
11 |
+
from nltk.tokenize import word_tokenize
|
12 |
+
from transformers import BertTokenizer, BertModel
|
13 |
+
# from convert import ExtractPDFText
|
14 |
+
import streamlit as st
|
15 |
|
|
|
|
|
|
|
16 |
|
17 |
+
class Functions():
|
|
|
|
|
|
|
18 |
|
19 |
@staticmethod
|
20 |
def get_gemini_response(llm, input_text, doc, template, info=''):
|
21 |
+
formated_prompt = template.format(doc=doc, input_text=input_text, info=info)
|
22 |
response = llm.invoke(formated_prompt)
|
23 |
return response.content
|
24 |
# return formated_prompt
|
|
|
54 |
if isinstance(input_text, str):
|
55 |
st.session_state['input_text'] = input_text
|
56 |
|
57 |
+
@staticmethod
|
58 |
+
def calculate_ats_score(resume_data, job_description):
|
59 |
+
def preprocess_text(text):
|
60 |
+
text = text.lower()
|
61 |
+
stop_words = set(stopwords.words('english'))
|
62 |
+
word_tokens = word_tokenize(text)
|
63 |
+
filtered_text = [word for word in word_tokens if word not in stop_words]
|
64 |
+
string_text = ' '.join(filtered_text)
|
65 |
+
text = re.sub(r'[^a-zA-Z\s]', '', string_text)
|
66 |
+
return text
|
67 |
+
|
68 |
+
def get_bert_embeddings(text):
|
69 |
+
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
|
70 |
+
model = BertModel.from_pretrained('bert-base-uncased')
|
71 |
+
tokens = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
|
72 |
+
with torch.no_grad():
|
73 |
+
outputs = model(**tokens)
|
74 |
+
embeddings = outputs.last_hidden_state.mean(dim=1)
|
75 |
+
return embeddings
|
76 |
+
|
77 |
+
def calculate_cosine_similarity(embedding1, embedding2):
|
78 |
+
sim = np.dot(embedding1[0].numpy(), embedding2[0].numpy()) / (
|
79 |
+
np.linalg.norm(embedding1[0].numpy()) * np.linalg.norm(embedding2[0].numpy())
|
80 |
+
)
|
81 |
+
return sim
|
82 |
+
|
83 |
+
resume = preprocess_text(resume_data)
|
84 |
+
job_desc = preprocess_text(job_description)
|
85 |
+
resume_embeddings = get_bert_embeddings(resume)
|
86 |
+
job_desc_embeddings = get_bert_embeddings(job_desc)
|
87 |
+
similarity_score = calculate_cosine_similarity(resume_embeddings, job_desc_embeddings)
|
88 |
+
missing_keywords = [word for word in word_tokenize(job_desc) if word not in word_tokenize(resume)]
|
89 |
+
return str(round(similarity_score * 100, 2)), missing_keywords
|
90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
components/prompts.py
ADDED
@@ -0,0 +1,345 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
resume_review = """
|
2 |
+
You are an experienced Technical Human Resource Manager,your task is to review the provided resume against the job description.
|
3 |
+
Please share your professional evaluation on whether the candidate's profile aligns with the role.
|
4 |
+
Highlight the strengths and weaknesses of the applicant in relation to the specified job requirements.
|
5 |
+
|
6 |
+
Human-Like Resume Review for {info}
|
7 |
+
Job Description: {input_text}
|
8 |
+
Resume: {doc}
|
9 |
+
Format:
|
10 |
+
**Resume Review Context:**
|
11 |
+
**Detailed Evaluation:**
|
12 |
+
- **Relevance to the Field:** Assess how the candidate's experience and skills match the specific requirements of the job in [User-Specified Field].
|
13 |
+
- **Key Strengths:** Identify the strongest aspects of the candidate's resume, such as specific skills, achievements, or experiences that are particularly aligned with the job description.
|
14 |
+
- **Areas for Development:** Highlight any areas where the candidate may need further development or additional experience to fully meet the job requirements.
|
15 |
+
- **Career Progression:** Analyze the candidate's career trajectory and how it aligns with the expectations for the role.
|
16 |
+
- **Education and Certifications:** Evaluate the relevance and level of the candidate's educational background and any professional certifications.
|
17 |
+
- **Cultural Fit:** Provide insights on the candidate's potential cultural fit within the organization, based on the information in the resume.
|
18 |
+
**Skills and Experience Table:**
|
19 |
+
| Skill/Experience | Relevance to Job | Candidate's Proficiency | Notes |
|
20 |
+
| ---------------- | ---------------- | ----------------------- | ----- |
|
21 |
+
| [Skill 1] | [High/Medium/Low] | [Expert/Intermediate/Novice] | [Any specific notes] |
|
22 |
+
| [Skill 2] | [High/Medium/Low] | [Expert/Intermediate/Novice] | [Any specific notes] |
|
23 |
+
| ... | ... | ... | ... |
|
24 |
+
|
25 |
+
**Conclusion:**
|
26 |
+
- Summarize the overall suitability of the candidate for the position in [User-Specified Field]. Include recommendations for any additional qualifications or experiences that might Improve the candidate’s profile for this role.
|
27 |
+
"""
|
28 |
+
|
29 |
+
ats_resume = """
|
30 |
+
## Human-Like Resume Analysis for {info}
|
31 |
+
Job Description: {input_text}
|
32 |
+
Resume: {doc}
|
33 |
+
Format:
|
34 |
+
**Resume Analysis Context:**
|
35 |
+
**Automated Evaluation:**
|
36 |
+
- **Keyword Matching:** Identify key skills, technologies, and qualifications mentioned in the job description and evaluate the presence and frequency of these keywords in the candidate's resume.
|
37 |
+
- **Skills Assessment:** Analyze the candidate's listed skills against those required in the job description. Provide a match percentage or rating.
|
38 |
+
- **Experience Relevance:** Calculate the relevance of the candidate's previous job titles, companies, and industries in relation to the job description.
|
39 |
+
- **Education and Certifications Matching:** Match the candidate's education level and certifications with the requirements specified in the job description.
|
40 |
+
**AI-ATS Analysis Table:**
|
41 |
+
| Category | Details from Resume | Match with Job Description | Notes |
|
42 |
+
| -------- | ------------------- | -------------------------- | ----- |
|
43 |
+
| Skills | [List of skills from resume] | [Match percentage/rating] | [Any specific notes] |
|
44 |
+
| Experience | [List of experiences from resume] | [Relevance rating] | [Any specific notes] |
|
45 |
+
| Education | [Candidate's education details] | [Match/No Match] | [Any specific notes] |
|
46 |
+
| ... | ... | ... | ... |
|
47 |
+
|
48 |
+
**Conclusion:**
|
49 |
+
- Provide an overall rating or score of the candidate’s resume based on the AI/ATS analysis. Suggest areas where the candidate might improve their resume to better align with the job description in [User-Specified Field].
|
50 |
+
|
51 |
+
"""
|
52 |
+
|
53 |
+
ats_score = """
|
54 |
+
You are an skilled ATS (Applicant Tracking System) scanner with a deep understanding of data science and ATS functionality,
|
55 |
+
your task is to evaluate the resume against the provided job description. give me the percentage of match if the resume matches
|
56 |
+
the job description. First the output should come as percentage and then keywords missing.
|
57 |
+
|
58 |
+
Job Description: {input_text}
|
59 |
+
Resume: {doc}
|
60 |
+
"""
|
61 |
+
|
62 |
+
resume_improve = """
|
63 |
+
As an experienced Technical Human Resource Manager, evaluating the provided resume against the job description involves a thorough analysis of the candidate's profile, strengths, weaknesses, and alignment with the specified job requirements. Here's a structured approach to provide a professional evaluation and key points for enhancing the resume:
|
64 |
+
|
65 |
+
1. **Evaluation of Alignment:**
|
66 |
+
- Assess the candidate's qualifications, skills, and experience in relation to the job requirements outlined in the job description.
|
67 |
+
- Determine the extent to which the candidate's profile aligns with the technical aspects, HR management responsibilities, and other specified criteria.
|
68 |
+
|
69 |
+
2. **Strengths and Weaknesses Assessment:**
|
70 |
+
- Highlight the candidate's strengths that directly match the job requirements, such as relevant technical skills, HR management experience, and achievements.
|
71 |
+
- Identify any weaknesses or areas where the candidate's profile may fall short in meeting the job requirements, such as lacking specific technical skills or limited experience in certain areas.
|
72 |
+
|
73 |
+
3. **Recommendations for Resume Improvement:**
|
74 |
+
- For areas of alignment:
|
75 |
+
- Emphasize the candidate's relevant technical skills, HR management experience, and achievements prominently in the resume.
|
76 |
+
- Provide specific examples or quantifiable results to demonstrate the candidate's contributions and impact in previous roles.
|
77 |
+
- For areas needing improvement:
|
78 |
+
- Suggest adding relevant technical skills or certifications to Improve the candidate's qualifications.
|
79 |
+
- Recommend highlighting transferable skills or experiences that demonstrate adaptability and readiness to learn new technologies or processes.
|
80 |
+
- Encourage showcasing any HR management initiatives, projects, or leadership roles that align with the job requirements.
|
81 |
+
|
82 |
+
4. **Key Points for Resume Improvement:**
|
83 |
+
- Technical Skills:
|
84 |
+
- Identify and include key technical skills mentioned in the job description, such as programming languages, software tools, or platforms.
|
85 |
+
- Provide details of projects or experiences that demonstrate proficiency in these technical skills.
|
86 |
+
- HR Management Experience:
|
87 |
+
- Highlight HR management responsibilities, such as recruitment, performance evaluation, training, and employee relations.
|
88 |
+
- Showcase leadership skills, teamwork, and collaboration experiences in managing technical teams or projects.
|
89 |
+
- Achievements and Impact:
|
90 |
+
- Include quantifiable achievements, awards, or recognition received in previous roles.
|
91 |
+
- Describe specific contributions or projects that resulted in positive outcomes, cost savings, or process improvements.
|
92 |
+
|
93 |
+
5. **Stand-Out Factors:**
|
94 |
+
- Provide insights to the candidate on how to differentiate themselves by highlighting unique experiences, innovative approaches, or specialized expertise relevant to the role.
|
95 |
+
- Asses adding professional development activities, industry involvement, or contributions to open-source projects to showcase continuous learning and engagement in the field whichever5 is best based on provided resume.
|
96 |
+
|
97 |
+
|
98 |
+
|
99 |
+
Job Description: {input_text}
|
100 |
+
Resume: {doc}
|
101 |
+
"""
|
102 |
+
|
103 |
+
resume_enhance = """
|
104 |
+
You are an experienced Technical Human Resource Manager,your task is to Provide specific suggestions in bullet points to tailor the resume to the job description from the provided paragraph.
|
105 |
+
Please share your professional suggestions on what to write and how to write the given pargraph so that the candidate's profile aligns with the role.
|
106 |
+
Highlight weaknesses of the applicant in relation to the specified job requirements and provide sugestions on how to enhance it and make it strength.
|
107 |
+
|
108 |
+
Job Description: {input_text}
|
109 |
+
Resume: {doc}
|
110 |
+
paragraph: {info}
|
111 |
+
"""
|
112 |
+
|
113 |
+
resume_recommendation = """
|
114 |
+
You are an experienced Technical Human Resource Manager,your task is to Provide specific recommendations to tailor the resume to the job description.
|
115 |
+
Suggest possible next steps, certifications, courses or experiences the person could do.
|
116 |
+
Make sure the suggestions are all FACTUALLY ACCURATE given the original resume and specify
|
117 |
+
which suggestions require further action. Mention where resume is good and where resume lacks. FOR EVERY CHANGE YOU SUGGEST, PROVIDE A SIMPLE EXPLANATION
|
118 |
+
FOR WHY< Additionally include critiques on a granular level including strong word choice suggestion etc.
|
119 |
+
Output in formatted, aesthetically pleasing markdown text.
|
120 |
+
Job Description: {input_text}
|
121 |
+
Resume: {doc}
|
122 |
+
"""
|
123 |
+
|
124 |
+
recommendation_section = """
|
125 |
+
You are an experienced Technical Human Resource Manager,your task is to Provide specific recommendations to tailor the resume to the job description.
|
126 |
+
Please share your professional recommendations on what to write and how to write the given pargraph so that the candidate's profile aligns with the role.
|
127 |
+
Talk about each section of user's resume and talk good and bad points of it. Recommend how to modify it better.
|
128 |
+
|
129 |
+
Job Description: {input_text}
|
130 |
+
Resume: {doc}
|
131 |
+
"""
|
132 |
+
|
133 |
+
keyword_analysis = """
|
134 |
+
Perform keyword analysis on both the input job description and the existing resume to identify missing keywords,
|
135 |
+
Analyze the provided document for keywords related to the job description.
|
136 |
+
Return a list of relevant keywords from the document with their number of occurance.
|
137 |
+
If no pages are found containing any of the keywords return "No Matching Keywords Found".
|
138 |
+
Output as a Markdown List where missing keywords are listed along with the Keywords presnet in the resume with number of time it occured in resume.
|
139 |
+
Job Description: {input_text}
|
140 |
+
Resume: {doc}
|
141 |
+
"""
|
142 |
+
|
143 |
+
keyword_synonyms = """
|
144 |
+
Provide a list of minimum 10 synonums of the given keyword. If there are less than 10
|
145 |
+
synonyms provide as many as you can find. The output should be in a markdown numbered list format where the synonyms of the keyword are listed in numbered list,
|
146 |
+
return as many as you can provide maximum 15.
|
147 |
+
Also suggest synonyms of the keyword based on job description
|
148 |
+
Job Description: {input_text}
|
149 |
+
Resume: {doc}
|
150 |
+
Keyword: {info}
|
151 |
+
"""
|
152 |
+
|
153 |
+
resume_update = """
|
154 |
+
## Writing an Updated Resume which is ATS friendly in latex format
|
155 |
+
|
156 |
+
### Step-by-Step Guide for the Updated Resume
|
157 |
+
|
158 |
+
#### 1. Header
|
159 |
+
- **Full Name**
|
160 |
+
- **Contact Information:** Phone number, Email address, LinkedIn profile (if applicable)
|
161 |
+
- **Location:** City, State (optional, depending on privacy preferences)
|
162 |
+
|
163 |
+
#### 2. Professional Summary
|
164 |
+
- Craft a 2-3 sentence summary focusing on key qualifications and alignment with the target job description.
|
165 |
+
|
166 |
+
#### 3. Skills
|
167 |
+
- List skills that are relevant to the job description.
|
168 |
+
- Use bullet points and ensure to include keywords from the job description for ATS optimization.
|
169 |
+
|
170 |
+
#### 4. Professional Experience
|
171 |
+
- For each relevant position, include **Job Title**, **Company Name**, **Location**, and **Dates of Employment**.
|
172 |
+
- Under each role, list bullet points that detail responsibilities and achievements, emphasizing quantifiable outcomes and incorporating job description keywords.
|
173 |
+
|
174 |
+
#### 5. Education
|
175 |
+
- List degrees obtained, including **Degree Title**, **Institution Name**, **Location**, and **Graduation Date**.
|
176 |
+
- Add relevant coursework or projects if they align with the job description.
|
177 |
+
|
178 |
+
#### 6. Certifications (Optional)
|
179 |
+
- Include certifications relevant to the job description.
|
180 |
+
|
181 |
+
#### 7. Additional Sections (Optional)
|
182 |
+
- Sections like Volunteer Experience, Publications, or Awards can be added if they are relevant to the job and add value.
|
183 |
+
|
184 |
+
#### 8. ATS Compatibility and Formatting
|
185 |
+
- Ensure the resume format is simple with a standard, easy-to-read font like Arial or Times New Roman.
|
186 |
+
- Avoid complex elements like tables or columns that can confuse ATS systems.
|
187 |
+
|
188 |
+
#### 9. Final Review
|
189 |
+
- Proofread for any spelling or grammatical errors.
|
190 |
+
- Check alignment with the job description and ensure all important keywords are included.
|
191 |
+
|
192 |
+
### Conclusion:
|
193 |
+
- Provide a brief summary highlighting the key changes made to the resume and how they align with the target job description.
|
194 |
+
- Offer suggestions for any additional improvements or steps the candidate can take to further tailor their resume for similar roles in the future.
|
195 |
+
|
196 |
+
### Example
|
197 |
+
|
198 |
+
- Create a new resume in the given LaTeX format.
|
199 |
+
|
200 |
+
**Job Description:** {input_text}
|
201 |
+
|
202 |
+
**Resume data:** {doc}
|
203 |
+
|
204 |
+
The output should be first show step by step guide for updated resume after that generate new resume based on provided information
|
205 |
+
and then also add the latex format of the generated resume .
|
206 |
+
"""
|
207 |
+
|
208 |
+
#info contains company name also
|
209 |
+
cover_letter = """
|
210 |
+
## Writing a Cover Letter for {info}
|
211 |
+
Job Description: {input_text}
|
212 |
+
Resume: {doc}
|
213 |
+
### Step-by-Step Guide for the Cover Letter
|
214 |
+
#### 1. Contact Information and Date
|
215 |
+
- Include your contact information at the top: Name, Address (optional), Phone Number, Email.
|
216 |
+
- Add the date of writing the letter.
|
217 |
+
#### 2. Salutation
|
218 |
+
- If possible, address the letter to a specific person (e.g., "Dear [Hiring Manager's Name]").
|
219 |
+
- If the specific contact is not known, use a general salutation like "Dear Hiring Manager".
|
220 |
+
#### 3. Introduction
|
221 |
+
- Open with a strong, engaging sentence that captures the reader’s attention.
|
222 |
+
- Mention the job title you’re applying for and where you found the job listing.
|
223 |
+
- Briefly state why you are interested in the role and the company.
|
224 |
+
#### 4. Body of the Letter (1-2 Paragraphs)
|
225 |
+
- In the first paragraph, summarize your relevant experience and skills, aligning them with key requirements of the job description.
|
226 |
+
- In the second paragraph, provide specific examples from your past work that demonstrate your abilities and successes. Use quantifiable achievements when possible.
|
227 |
+
- Explain how your skills and experiences make you an ideal fit for the role and how you can contribute to the company.
|
228 |
+
#### 5. Conclusion
|
229 |
+
- Reiterate your enthusiasm for the position.
|
230 |
+
- Mention any attached documents (like your resume or portfolio).
|
231 |
+
- State your availability for an interview and propose the next steps or indicate your intention to follow up.
|
232 |
+
#### 6. Sign-off
|
233 |
+
- Close the letter with a professional sign-off such as "Sincerely" or "Best regards," followed by your name.
|
234 |
+
- If you’re submitting a printed letter, leave space for your handwritten signature above your typed name.
|
235 |
+
### Final Tips:
|
236 |
+
- Keep the cover letter concise, ideally not exceeding one page.
|
237 |
+
- Tailor the letter to the job and company – avoid using a generic template.
|
238 |
+
- Proofread carefully to avoid any spelling or grammatical errors.
|
239 |
+
- Use a professional tone, but allow your personality to shine through.
|
240 |
+
## Example:
|
241 |
+
- Provide an cover letter also as example
|
242 |
+
"""
|
243 |
+
|
244 |
+
linkedin_profile = """
|
245 |
+
## Comprehensive LinkedIn Profile and Headline Update
|
246 |
+
Job Description: {input_text}
|
247 |
+
Resume: {doc}
|
248 |
+
### Step-by-Step Guide for LinkedIn Update
|
249 |
+
#### 1. LinkedIn Headline
|
250 |
+
- Create a headline combining your current role or expertise, key skills from your resume, and aspects of the job you are targeting.
|
251 |
+
- Example format: “[Current Role/Expertise] with [Key Skills] | Aspiring [Target Job Title]”
|
252 |
+
#### 2. Profile Photo and Background Image
|
253 |
+
- Choose a professional profile picture and a background image that reflects your professional brand.
|
254 |
+
#### 3. About Section
|
255 |
+
- Write a summary that includes your professional background, achievements, skills, and career aspirations, tailored to align with your resume and the job description.
|
256 |
+
#### 4. Experience Section
|
257 |
+
- Update to mirror your resume, highlighting roles, responsibilities, and achievements relevant to your career goals.
|
258 |
+
- Use language and keywords from the job description to Improve alignment.
|
259 |
+
#### 5. Education
|
260 |
+
- Ensure your educational background matches your resume, including relevant courses and certifications.
|
261 |
+
#### 6. Skills & Endorsements
|
262 |
+
- Add and prioritize skills from your resume and the job description, focusing on those most relevant to your career goals.
|
263 |
+
#### 7. Recommendations
|
264 |
+
- Request recommendations that reinforce your skills and experiences, particularly those aligning with your target job.
|
265 |
+
#### 8. Licenses and Certifications
|
266 |
+
- Include any relevant certifications, aligning with both your resume and job description.
|
267 |
+
#### 9. Volunteer Experience
|
268 |
+
- Add volunteer work if it supports your professional image and career objectives.
|
269 |
+
#### 10. Accomplishments
|
270 |
+
- Include any relevant publications, patents, projects, honors, and awards.
|
271 |
+
#### 11. Customized URL
|
272 |
+
- Customize your LinkedIn URL for a professional touch.
|
273 |
+
### Final Steps:
|
274 |
+
- Review for consistency in language and tone.
|
275 |
+
- Proofread to ensure there are no errors.
|
276 |
+
- Update your profile regularly to reflect your current professional status and aspirations.
|
277 |
+
### Conclusion:
|
278 |
+
- Your LinkedIn profile should be a dynamic representation of your professional life, showcasing both your experience and personality, and aligned with your career goals and targeted job opportunities.
|
279 |
+
"""
|
280 |
+
|
281 |
+
interview = """
|
282 |
+
## Customized Interview Questions and Candidate Questions to Interviewer
|
283 |
+
Job Description: {input_text}
|
284 |
+
Resume: {doc}
|
285 |
+
Role: {info}
|
286 |
+
### Part 1: Tailored Interview Questions Based on Job Description
|
287 |
+
#### 1. Role-Specific Technical Questions
|
288 |
+
- Generate questions that assess skills and experiences directly related to the key requirements in the job description.
|
289 |
+
- Example: "Your resume mentions experience in [specific skill from resume]; can you discuss how you've applied this skill in a past project?"
|
290 |
+
#### 2. Behavioral Questions Related to Job Role
|
291 |
+
- Formulate questions based on scenarios or challenges outlined in the job description.
|
292 |
+
- Example: "The job description emphasizes teamwork. Can you share an experience where you successfully collaborated on a challenging project?"
|
293 |
+
#### 3. Scenario-Based Problem-Solving Questions
|
294 |
+
- Create questions that relate to potential challenges or tasks in the new role, as described in the job description.
|
295 |
+
- Example: "Given a scenario of [specific challenge in the job description], how would you approach solving it?"
|
296 |
+
#### 4. Questions Assessing Cultural and Company Fit
|
297 |
+
- Based on the company culture hinted at in the job description, prepare questions to evaluate the candidate's fit.
|
298 |
+
- Example: "Our company values [specific value from job description]. Can you provide an example of how you've embodied this value in your professional life?"
|
299 |
+
### Part 2: Questions for the Candidate to Ask the Interviewer
|
300 |
+
#### 1. Clarifications on Role Responsibilities
|
301 |
+
- Suggest questions that seek deeper insights into the daily responsibilities and expectations.
|
302 |
+
- Example: "Could you elaborate on the typical day-to-day tasks for someone in this position?"
|
303 |
+
#### 2. Inquiries About Team Structure and Dynamics
|
304 |
+
- Based on the team information in the job description, propose questions about team collaboration and environment.
|
305 |
+
- Example: "Can you tell me more about the team I would be working with?"
|
306 |
+
#### 3. Questions About Growth and Development Opportunities
|
307 |
+
- Encourage questions about professional development, especially in areas highlighted as important in the job description.
|
308 |
+
- Example: "What opportunities for professional growth does the company provide in [area mentioned in the job description]?"
|
309 |
+
#### 4. Queries About Success Measurement
|
310 |
+
- Suggest questions about how success is measured in the role, relating to performance indicators mentioned in the job description.
|
311 |
+
- Example: "What are the key performance indicators for this role, and how are they measured?"
|
312 |
+
### Conclusion:
|
313 |
+
- These questions are designed to provide a comprehensive understanding of the candidate's suitability for the role and to help the candidate assess whether the role aligns with their career aspirations.
|
314 |
+
- Remind candidates to use these questions as a guide and personalize them to reflect their unique experiences and interests.
|
315 |
+
"""
|
316 |
+
|
317 |
+
company_recommendations = """
|
318 |
+
## Company Recommendations Based on Candidate's Resume and Job Description
|
319 |
+
Job Description: {input_text}
|
320 |
+
Resume: {doc}
|
321 |
+
### Process for Identifying Similar Companies
|
322 |
+
#### 1. Analyze the Job Description
|
323 |
+
- Identify key industry sectors, job responsibilities, and required skills from the job description.
|
324 |
+
- Note any specific company characteristics mentioned (e.g., startup culture, large multinational, specific sector focus).
|
325 |
+
#### 2. Review the Candidate's Resume
|
326 |
+
- Look for industries, skills, and types of roles the candidate has experience in.
|
327 |
+
- Consider the candidate’s career level and preferences indicated by their work history and achievements.
|
328 |
+
#### 3. Research and List Similar Companies
|
329 |
+
- Based on the collected information, identify companies in similar industries or those that offer similar roles.
|
330 |
+
- Consider companies that align with the candidate's experience level and career aspirations.
|
331 |
+
#### 4. Provide a Diverse Range of Options
|
332 |
+
- Include a mix of large corporations, mid-size companies, and startups, if relevant.
|
333 |
+
- Ensure the list covers various sectors within the industry that align with the candidate's skills and experience.
|
334 |
+
#### 5. Additional Considerations
|
335 |
+
- Take into account the candidate’s geographical preferences or willingness to relocate, if indicated in the resume or job description.
|
336 |
+
- Consider the current market trends and the demand for the candidate’s skill set in various companies.
|
337 |
+
### Example Output:
|
338 |
+
- Based on a resume with experience in digital marketing and a job description for a Digital Marketing Manager in the tech industry, the recommendations could include:
|
339 |
+
- Tech companies with a strong online presence.
|
340 |
+
- Marketing agencies specializing in digital strategies for tech clients.
|
341 |
+
- Startups in the tech sector looking to build their digital marketing teams.
|
342 |
+
### Conclusion:
|
343 |
+
- Provide a list of recommended companies where the candidate might find similar roles to the one they are applying for.
|
344 |
+
- Encourage the candidate to research these companies further to find specific job openings that match their skills and career goals.
|
345 |
+
"""
|
features/__pycache__/analyzer.cpython-39.pyc
ADDED
Binary file (1.29 kB). View file
|
|
features/__pycache__/ats.cpython-39.pyc
ADDED
Binary file (1.21 kB). View file
|
|
features/__pycache__/company_recommend.cpython-39.pyc
ADDED
Binary file (1.04 kB). View file
|
|
features/__pycache__/cover_letter.cpython-39.pyc
ADDED
Binary file (1.09 kB). View file
|
|
features/__pycache__/enhance.cpython-39.pyc
ADDED
Binary file (1.07 kB). View file
|
|
features/__pycache__/improve.cpython-39.pyc
ADDED
Binary file (1.04 kB). View file
|
|
features/__pycache__/interview.cpython-39.pyc
ADDED
Binary file (1.09 kB). View file
|
|
features/__pycache__/linkedin.cpython-39.pyc
ADDED
Binary file (1.01 kB). View file
|
|
features/__pycache__/newresume.cpython-39.pyc
ADDED
Binary file (986 Bytes). View file
|
|
features/__pycache__/recommend.cpython-39.pyc
ADDED
Binary file (1.1 kB). View file
|
|
features/__pycache__/review.cpython-39.pyc
ADDED
Binary file (1.06 kB). View file
|
|
features/__pycache__/synonym.cpython-39.pyc
ADDED
Binary file (1.04 kB). View file
|
|
features/analyzer.py
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
from components.functions import Functions
|
3 |
+
from components.prompts import keyword_analysis, keyword_synonyms
|
4 |
+
|
5 |
+
import streamlit as st
|
6 |
+
|
7 |
+
def run_analyzer(llm, doc='', jd='', analysis=False):
|
8 |
+
load_dotenv()
|
9 |
+
analyzer = Functions()
|
10 |
+
|
11 |
+
if analysis:
|
12 |
+
message = "Suggesting Keywords to add in your Resume."
|
13 |
+
template = keyword_analysis
|
14 |
+
else:
|
15 |
+
message = "Suggesting Synonyms for Provided Keywords to add in your Resume."
|
16 |
+
keyword = st.text_input("Keyword")
|
17 |
+
if not keyword:
|
18 |
+
st.write("Please provide a keyword for synonyms.")
|
19 |
+
return
|
20 |
+
template = keyword_synonyms
|
21 |
+
|
22 |
+
st.write(message)
|
23 |
+
submit = st.button("Suggest Keywords" if analysis else "Generate Keywords")
|
24 |
+
|
25 |
+
if submit:
|
26 |
+
if doc is not None:
|
27 |
+
with st.spinner("Analyzing..."):
|
28 |
+
response = analyzer.get_gemini_response(llm=llm, template=template, doc=doc, input_text=jd, info=keyword)
|
29 |
+
st.subheader("The Keywords You Can Add:")
|
30 |
+
st.write(response)
|
31 |
+
else:
|
32 |
+
st.write("Please upload the resume")
|
33 |
+
|
34 |
+
if __name__ == "__main__":
|
35 |
+
analyzer = Functions()
|
36 |
+
run_analyzer(analyzer.model())
|
features/ats.py
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
from components.functions import Functions
|
3 |
+
from components.prompts import ats_resume, ats_score
|
4 |
+
|
5 |
+
import streamlit as st
|
6 |
+
|
7 |
+
def run_ats(llm, doc='', jd='', manual=False):
|
8 |
+
load_dotenv()
|
9 |
+
ats = Functions()
|
10 |
+
|
11 |
+
submit = st.button("Percentage match")
|
12 |
+
|
13 |
+
if submit:
|
14 |
+
if doc is not None:
|
15 |
+
with st.spinner("Calculating Score..."):
|
16 |
+
if manual:
|
17 |
+
response, keywords = ats.calculate_ats_score(resume_data=doc, job_description=jd)
|
18 |
+
st.subheader("The Keywords Missing:")
|
19 |
+
for i, keyword in enumerate(keywords):
|
20 |
+
st.caption(f"{i+1}. {keyword}")
|
21 |
+
else:
|
22 |
+
response = ats.get_gemini_response(llm=llm, template=ats_score, doc=doc, input_text=jd)
|
23 |
+
extra_response = ats.get_gemini_response(llm=llm, template=ats_resume, doc=doc, input_text=jd)
|
24 |
+
|
25 |
+
st.subheader("The ATS Score is")
|
26 |
+
st.write(response)
|
27 |
+
st.write(extra_response)
|
28 |
+
else:
|
29 |
+
st.write("Please upload the resume")
|
30 |
+
|
31 |
+
if __name__ == "__main__":
|
32 |
+
ats = Functions()
|
33 |
+
run_ats(ats.model())
|
features/company_recommend.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#company.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import company_recommendations
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_company(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
company = Functions()
|
13 |
+
st.write("Suggesting new New Job Oppertunities based your resume")
|
14 |
+
submit = st.button("Recommend New Oppertunities")
|
15 |
+
|
16 |
+
|
17 |
+
if submit:
|
18 |
+
if doc is not None:
|
19 |
+
with st.spinner("Searching..."):
|
20 |
+
response=company.get_gemini_response(llm=llm,template=company_recommendations,doc=doc,input_text=jd)
|
21 |
+
st.subheader("The Job Roles You can Apply for:")
|
22 |
+
st.write(response)
|
23 |
+
else:
|
24 |
+
st.write("Please upload the resume")
|
25 |
+
|
26 |
+
|
27 |
+
|
28 |
+
if __name__ == "__main__":
|
29 |
+
company = Functions()
|
30 |
+
run_company(company.model())
|
features/cover_letter.py
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#letter.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import cover_letter
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_letter(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
letter = Functions()
|
13 |
+
st.write("Generate a cover letter based on your resume and Provided Job Description.")
|
14 |
+
role=st.text_input("Role you want the cover letter for")
|
15 |
+
submit = st.button("Generate Cover Letter")
|
16 |
+
|
17 |
+
|
18 |
+
if submit:
|
19 |
+
if doc is not None:
|
20 |
+
with st.spinner("Generating..."):
|
21 |
+
response = letter.get_gemini_response(llm=llm,template=cover_letter,doc=doc,input_text=jd, info=role)
|
22 |
+
st.subheader("Cover Letter")
|
23 |
+
st.write(response)
|
24 |
+
else:
|
25 |
+
st.write("Please upload the resume")
|
26 |
+
|
27 |
+
|
28 |
+
|
29 |
+
if __name__ == "__main__":
|
30 |
+
letter = Functions()
|
31 |
+
run_letter(letter.model())
|
features/enhance.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#enhance.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import resume_enhance
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_enhance(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
enhance = Functions()
|
13 |
+
st.write("Providing bullet points for enhancing the given paragraph.")
|
14 |
+
bullet = st.text_input("Paragraph for bullet points")
|
15 |
+
submit = st.button("Provide Bullet Points")
|
16 |
+
|
17 |
+
if submit:
|
18 |
+
if doc is not None:
|
19 |
+
with st.spinner("Processing..."):
|
20 |
+
response=enhance.get_gemini_response(llm=llm,template=resume_enhance,doc=doc,input_text=jd, info=bullet)
|
21 |
+
st.subheader("The Repsonse is")
|
22 |
+
st.write(response)
|
23 |
+
else:
|
24 |
+
st.write("Please upload the resume")
|
25 |
+
|
26 |
+
|
27 |
+
|
28 |
+
if __name__ == "__main__":
|
29 |
+
enhance = Functions()
|
30 |
+
run_enhance(enhance.model())
|
features/improve.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#improve.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import resume_improve
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_improve(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
improve = Functions()
|
13 |
+
st.write("Suggesting new elements to add to your resume based on the existing content.")
|
14 |
+
submit = st.button("How Can I Improvise my Skills")
|
15 |
+
|
16 |
+
|
17 |
+
if submit:
|
18 |
+
if doc is not None:
|
19 |
+
with st.spinner("Generating..."):
|
20 |
+
response=improve.get_gemini_response(llm=llm,template=resume_improve,doc=doc,input_text=jd)
|
21 |
+
st.subheader("The Required Improvmemts are")
|
22 |
+
st.write(response)
|
23 |
+
else:
|
24 |
+
st.write("Please upload the resume")
|
25 |
+
|
26 |
+
|
27 |
+
|
28 |
+
if __name__ == "__main__":
|
29 |
+
improve = Functions()
|
30 |
+
run_improve(improve.model())
|
features/interview.py
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#interview.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import interview as interview_prompt
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_interview(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
interview = Functions()
|
13 |
+
st.write("Generate Customized Interview Questions.")
|
14 |
+
role=st.text_input("Role you want to know questions for")
|
15 |
+
submit = st.button("Generate Interview Questions")
|
16 |
+
|
17 |
+
|
18 |
+
if submit:
|
19 |
+
if doc is not None:
|
20 |
+
with st.spinner("Generating..."):
|
21 |
+
response = interview.get_gemini_response(llm=llm,template=interview_prompt,doc=doc,input_text=jd,info=role)
|
22 |
+
st.subheader("Customized Interview Questions")
|
23 |
+
st.write(response)
|
24 |
+
else:
|
25 |
+
st.write("Please upload the resume")
|
26 |
+
|
27 |
+
|
28 |
+
|
29 |
+
if __name__ == "__main__":
|
30 |
+
interview = Functions()
|
31 |
+
run_interview(interview.model())
|
features/linkedin.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#linkedin.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import linkedin_profile
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def run_linkedin(llm,doc='',jd=''):
|
11 |
+
load_dotenv()
|
12 |
+
linkedin = Functions()
|
13 |
+
st.write("Suggesting Comprehensive LinkedIn Profile.")
|
14 |
+
submit = st.button("Suggest Profile Details")
|
15 |
+
|
16 |
+
|
17 |
+
if submit:
|
18 |
+
if doc is not None:
|
19 |
+
with st.spinner("Creating..."):
|
20 |
+
response=linkedin.get_gemini_response(llm=llm,template=linkedin_profile,doc=doc,input_text=jd)
|
21 |
+
st.subheader("Comprehensive LinkedIn Profile")
|
22 |
+
st.write(response)
|
23 |
+
else:
|
24 |
+
st.write("Please upload the resume")
|
25 |
+
|
26 |
+
|
27 |
+
|
28 |
+
if __name__ == "__main__":
|
29 |
+
linkedin = Functions()
|
30 |
+
run_linkedin(linkedin.model())
|
features/newresume.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#newresume.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import resume_update
|
7 |
+
|
8 |
+
def run_newresume(llm,doc='',jd=''):
|
9 |
+
load_dotenv()
|
10 |
+
newresume = Functions()
|
11 |
+
st.write("Generate new resume in LateX Format.")
|
12 |
+
submit = st.button("Generate Resume")
|
13 |
+
|
14 |
+
if submit:
|
15 |
+
if doc is not None:
|
16 |
+
with st.spinner("Generating..."):
|
17 |
+
response=newresume.get_gemini_response(llm=llm,template=resume_update,doc=doc,input_text=jd)
|
18 |
+
st.subheader("Resume In LateX Format")
|
19 |
+
st.write(response)
|
20 |
+
else:
|
21 |
+
st.write("Please upload the resume")
|
22 |
+
|
23 |
+
if __name__ == "__main__":
|
24 |
+
newresume = Functions()
|
25 |
+
run_newresume(newresume.model())
|
features/recommend.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#recommend.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import resume_recommendation, recommendation_section
|
7 |
+
|
8 |
+
def run_recommend(llm,doc='',jd='', section=False):
|
9 |
+
load_dotenv()
|
10 |
+
recommend = Functions()
|
11 |
+
st.write("Recommendations To improve Your Resume.")
|
12 |
+
submit = st.button("Recommend Me!!")
|
13 |
+
|
14 |
+
if submit:
|
15 |
+
if doc is not None:
|
16 |
+
with st.spinner("Analyzing..."):
|
17 |
+
if section:
|
18 |
+
response = recommend.get_gemini_response(llm=llm,template=recommendation_section,doc=doc,input_text=jd)
|
19 |
+
else:
|
20 |
+
response = recommend.get_gemini_response(llm=llm,template=resume_recommendation,doc=doc,input_text=jd)
|
21 |
+
st.subheader("The Recommendations you can Apply in your Resume: ")
|
22 |
+
st.write(response)
|
23 |
+
else:
|
24 |
+
st.write("Please upload the resume")
|
25 |
+
|
26 |
+
if __name__ == "__main__":
|
27 |
+
recommend = Functions()
|
28 |
+
run_recommend(recommend.model())
|
features/review.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#review.py
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
from components.functions import Functions
|
5 |
+
import streamlit as st
|
6 |
+
from components.prompts import resume_review
|
7 |
+
|
8 |
+
def run_review(llm,doc='',jd=''):
|
9 |
+
load_dotenv()
|
10 |
+
review = Functions()
|
11 |
+
st.write("Get a review on how well your Resume is")
|
12 |
+
role=st.text_input("Role you want to Review for")
|
13 |
+
submit = st.button("Tell Me About the Resume")
|
14 |
+
|
15 |
+
if submit:
|
16 |
+
with st.spinner("Reviewing Your Resume..."):
|
17 |
+
if doc is not None:
|
18 |
+
response=review.get_gemini_response(llm=llm,template=resume_review,doc=doc,input_text=jd, info=role)
|
19 |
+
st.subheader("Resume Review: ")
|
20 |
+
st.write(response)
|
21 |
+
else:
|
22 |
+
st.write("Please upload the resume")
|
23 |
+
|
24 |
+
if __name__ == "__main__":
|
25 |
+
review = Functions()
|
26 |
+
run_review(review.model())
|
overleaf.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Add this code snippet after generating the resume in main.py
|
2 |
+
|
3 |
+
import webbrowser
|
4 |
+
|
5 |
+
def redirect_to_overleaf(resume):
|
6 |
+
# Assuming the Overleaf URL for templates is "https://www.overleaf.com/templates"
|
7 |
+
overleaf_url = "https://www.overleaf.com/project/new/template/34599?id=533668126&latexEngine=pdflatex&mainFile=main.tex&templateName=Northeastern+University+COS+Faculty+CV+Template&texImage=texlive-full%3A2023.1"
|
8 |
+
# Save the generated resume to a file
|
9 |
+
# with open("a.tex", "w") as file:
|
10 |
+
# file.write(resume)
|
11 |
+
# Redirect to Overleaf with the generated resume
|
12 |
+
webbrowser.open_new_tab(overleaf_url)
|
13 |
+
# webbrowser.open_new_tab("generated_resume.tex")
|
14 |
+
|
15 |
+
# Call this function after generating the resume
|
16 |
+
redirect_to_overleaf("generated_resume")
|
requirements.txt
CHANGED
@@ -8,4 +8,5 @@ python-dotenv
|
|
8 |
SpeechRecognition
|
9 |
PyAudio
|
10 |
pdfplumber
|
11 |
-
python-docx
|
|
|
|
8 |
SpeechRecognition
|
9 |
PyAudio
|
10 |
pdfplumber
|
11 |
+
python-docx
|
12 |
+
pylatexenc
|