Spaces:
Running
Running
File size: 5,498 Bytes
e2bc856 4d5c1ca 59b9f80 e2bc856 59b9f80 7c2f6fa 59b9f80 7c2f6fa 59b9f80 7c2f6fa 59b9f80 4d5c1ca 59b9f80 4d5c1ca 59b9f80 4d5c1ca 59b9f80 4d5c1ca 59b9f80 4d5c1ca 59b9f80 4d5c1ca 59b9f80 84af80e 1c3f6d1 6cb2796 59b9f80 4d5c1ca 59b9f80 b6fb7ca 59b9f80 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
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
@st.cache_resource
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)}%")
|