ml / app.py
indhupamula's picture
Create app.py
07de611 verified
Raw History Blame Contribute Delete
5.47 kB
import streamlit as st
import sqlite3
import hashlib
import spacy
from nltk.corpus import stopwords
import re
import docx2txt
import PyPDF2
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
DB_PATH = 'resume_assistant.db'
# Initialize NLP and stop words
nlp = spacy.load("en_core_web_sm")
stop_words = set(stopwords.words("english"))
def initialize_db():
with sqlite3.connect(DB_PATH) as conn:
cur = conn.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE,
email TEXT UNIQUE,
password_hash TEXT
)
''')
conn.commit()
def hash_password(password):
return hashlib.sha256(password.encode('utf-8')).hexdigest()
def signup_user(username, email, password):
pwd_hash = hash_password(password)
try:
with sqlite3.connect(DB_PATH) as conn:
cur = conn.cursor()
cur.execute(
"INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)",
(username, email, pwd_hash)
)
conn.commit()
return True, "Signup successful!"
except sqlite3.IntegrityError:
return False, "Username or email already exists."
def verify_login(username, password):
pwd_hash = hash_password(password)
with sqlite3.connect(DB_PATH) as conn:
cur = conn.cursor()
cur.execute("SELECT id FROM users WHERE username=? AND password_hash=?", (username, pwd_hash))
data = cur.fetchone()
return (True, data[0]) if data else (False, None)
def extract_text(file):
if not file:
return ""
if file.type == "application/pdf":
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text() or ""
return text
elif file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
return docx2txt.process(file)
elif file.type == "text/plain":
return file.getvalue().decode("utf-8")
return ""
def clean_text(text):
text = re.sub(r'[^a-zA-Z\s]', '', text.lower())
doc = nlp(text)
return set([token.lemma_ for token in doc if token.is_alpha and token.text not in stop_words and len(token.text)>2])
def ats_score(resume_text, jd_text):
vectorizer = TfidfVectorizer(stop_words='english')
tfidf = vectorizer.fit_transform([resume_text, jd_text])
return cosine_similarity(tfidf[0:1], tfidf[1:2])[0]*100
def ml_score_dummy(resume_text, jd_text):
# Dummy relevance score (just scaled ATS score)
return ats_score(resume_text, jd_text) * 0.9
def main():
initialize_db()
st.title("AI-Powered Resume Assistant")
menu = ["Login", "Signup"]
choice = st.sidebar.selectbox("Choose Action", menu)
if choice == "Signup":
st.subheader("Create New Account")
username = st.text_input("Username")
email = st.text_input("Email")
password = st.text_input("Password", type="password")
if st.button("Sign Up"):
if username and email and password:
success, msg = signup_user(username, email, password)
if success:
st.success(msg)
else:
st.error(msg)
else:
st.warning("Please enter all fields")
elif choice == "Login":
st.subheader("Login")
username = st.text_input("Username")
password = st.text_input("Password", type="password")
if st.button("Login"):
if username and password:
valid, user_id = verify_login(username, password)
if valid:
st.success(f"Welcome, {username}!")
resume_file = st.file_uploader("Upload Resume (.pdf, .docx, .txt)", type=['pdf','docx','txt'])
jd_text = st.text_area("Paste Job Description here", height=150)
if st.button("Analyze Resume"):
resume_text = extract_text(resume_file)
if not resume_text:
st.error("Failed to extract resume text.")
elif not jd_text.strip():
st.warning("Please provide job description.")
else:
ats = ats_score(resume_text, jd_text)
ml = ml_score_dummy(resume_text, jd_text)
resume_skills = clean_text(resume_text)
jd_skills = clean_text(jd_text)
matched = sorted(resume_skills & jd_skills)
missing = sorted(jd_skills - resume_skills)
st.markdown(f"**ATS Score:** {ats:.2f}%")
st.markdown(f"**ML Relevance Score:** {ml:.2f}%")
st.markdown(f"**Matched Skills:** {', '.join(matched) if matched else 'None'}")
st.markdown(f"**Missing Skills:** {', '.join(missing) if missing else 'None'}")
else:
st.error("Invalid username or password")
else:
st.warning("Please enter username and password")
if __name__ == "__main__":
main()