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)}%")