Spaces:
Running
Running
import streamlit as st | |
from transformers import pipeline | |
from bert_score import score | |
import torch | |
import numpy as np | |
from sentence_transformers import SentenceTransformer | |
from sklearn.metrics.pairwise import cosine_similarity | |
from rouge import Rouge | |
# Load the model once at app startup | |
def load_embedding_model(): | |
return SentenceTransformer('all-MiniLM-L6-v2') | |
embedding_model = load_embedding_model() | |
rouge = Rouge() | |
# 还有我们自己的模型 | |
# 在fine-tuned model上传到huggingface后,可以用pipeline来加载模型 | |
# pipeline = pipeline(model="your_username/your_model_name") | |
# 之后我们可以继续用pipeline来直接调用模型得到prediction, 详见后 | |
# Just using F1 for simplicity now | |
def calculate_bert_score(candidate, reference): | |
# Make sure inputs are in list format as required by BERTScore | |
if isinstance(candidate, str): | |
candidate = [candidate] | |
if isinstance(reference, str): | |
reference = [reference] | |
# Calculate the score | |
P, R, F1 = score(candidate, reference, lang="en", return_hash=False) | |
# Return F1 as a float (converting from tensor) | |
return F1.item() | |
# Function to calculate cosine similarity | |
def calculate_cosine_similarity(text1, text2): | |
# Get embeddings | |
embedding1 = embedding_model.encode([text1])[0] | |
embedding2 = embedding_model.encode([text2])[0] | |
# Reshape for sklearn's cosine_similarity | |
embedding1 = embedding1.reshape(1, -1) | |
embedding2 = embedding2.reshape(1, -1) | |
# Calculate similarity | |
similarity = cosine_similarity(embedding1, embedding2)[0][0] | |
return similarity | |
# Function to calculate ROUGE scores | |
def calculate_rouge_scores(candidate, reference): | |
try: | |
scores = rouge.get_scores(candidate, reference)[0] | |
return { | |
'rouge-1': scores['rouge-1']['f'], | |
'rouge-l': scores['rouge-l']['f'] | |
} | |
except: | |
# Handle empty strings or other issues | |
return {'rouge-1': 0, 'rouge-l': 0} | |
# UI | |
st.title("ResumeTailor") | |
st.write("Optimize your resume for specific job descriptions") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.header("Inputs") | |
resume_text = st.text_area( | |
"Paste your resume work experience here", | |
height=300, | |
placeholder="Describe your work experience..." | |
) | |
job_description = st.text_area( | |
"Paste the job description here", | |
height=300, | |
placeholder="Paste the job description..." | |
) | |
if st.button("Refine Resume", type="primary"): | |
# 在这里调用模型 | |
# prediction = pipeline(resume_text, job_description) | |
refined_resume = "This would be the refined resume after model processing" # 现在这个是hard code的prediction | |
refined_score = 0.85 # Example hardcoded score | |
# 其实最终应该是下面的算法 | |
# original_bertscore = calculate_bert_score(resume_text, job_description) | |
# refined_bertscore = calculate_bert_score(refined_resume, job_description) | |
# delta_bertscore = refined_score - original_score | |
# original_cosine_sim = calculate_cosine_similarity(resume_text, job_description) | |
# refined_cosine_sim = calculate_cosine_similarity(refined_resume, job_description) | |
# delta_cosine_sim = refined_cosine_sim - original_cosine_sim | |
# original_rouge = calculate_rouge_scores(resume_text, job_description) | |
# refined_rouge = calculate_rouge_scores(refined_resume, job_description) | |
# delta_rouge1 = refined_rouge['rouge-1'] - original_rouge['rouge-1'] | |
# delta_rougel = refined_rouge['rouge-l'] - original_rouge['rouge-l'] | |
with col2: | |
st.header("Results") | |
st.text_area("Refined Work Experience", value=refined_resume, height=300) | |
st.subheader("Similarity Score") | |
# Below are just hardcoded for now | |
# Use 2 x 2 matrix to show the scores | |
a, b = st.columns(2) | |
with a: | |
st.metric("BERT Score (F1)", value=f"{refined_score:.2f}", delta=f"{refined_score - 0.85:.2f}") | |
st.metric("Cosine Similarity", value=f"{0.90:.2f}", delta=f"{0.90 - 0.85:.2f}") | |
with b: | |
st.metric("ROUGE-1 (F1)", value=f"{0.88:.2f}", delta=f"{0.88 - 0.85:.2f}") | |
st.metric("ROUGE-L (F1)", value=f"{0.87:.2f}", delta=f"{0.87 - 0.85:.2f}") | |
# 其实应该是 | |
# st.metric("BERT Score (F1)", value=f"{refined_bertscore:.2f}", delta=f"{delta_score:.2f}") | |
# st.metric("Cosine Similarity", value=f"{refined_cosine_sim:.2f}", delta=f"{delta_cosine_sim:.2f}") | |
# st.metric("ROUGE-1 (F1)", value=f"{refined_rouge['rouge-1']:.2f}", delta=f"{delta_rouge1:.2f}") | |
# st.metric("ROUGE-L (F1)", value=f"{refined_rouge['rouge-l']:.2f}", delta=f"{delta_rougel:.2f}") | |
# Below is a demo code to use hot-dog classification model | |
# from PIL import Image | |
# pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog") | |
# st.title("Hot Dog? Or Not?") | |
# file_name = st.file_uploader("Upload a hot dog candidate image") | |
# if file_name is not None: | |
# col1, col2 = st.columns(2) | |
# image = Image.open(file_name) | |
# col1.image(image, use_column_width=True) | |
# predictions = pipeline(image) | |
# col2.header("Probabilities") | |
# for p in predictions: | |
# col2.subheader(f"{ p['label'] }: { round(p['score'] * 100, 1)}%") | |