File size: 7,015 Bytes
91b4d2a
 
 
 
27521fc
611ad83
91b4d2a
6184dc4
 
 
 
 
91b4d2a
611ad83
91b4d2a
 
 
 
c7ff85c
91b4d2a
cd9c591
91b4d2a
 
27521fc
c80fe89
 
27521fc
91b4d2a
 
 
 
 
 
 
 
 
 
27521fc
6d7e8c7
27521fc
6d7e8c7
 
27521fc
 
 
6d7e8c7
 
27521fc
6d7e8c7
 
 
27521fc
6d7e8c7
 
 
 
 
 
 
 
 
 
 
 
91b4d2a
 
 
 
6d7e8c7
27521fc
6d7e8c7
 
27521fc
 
 
6d7e8c7
 
27521fc
6d7e8c7
 
 
27521fc
91b4d2a
 
 
27521fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c0d3da
27521fc
 
 
91b4d2a
 
27521fc
 
91b4d2a
 
27521fc
91b4d2a
 
 
27521fc
91b4d2a
 
 
 
 
27521fc
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
import gradio as gr
import openai
import fitz  # PyMuPDF
import torch
from transformers import pipeline, BloomForCausalLM, BloomTokenizerFast
from huggingface_hub import login

import os

hf_api_key = os.getenv("HF_API_KEY")
login(token=hf_api_key)

# Set OpenAI and Hugging Face API keys
openai.api_key = "sk-1E6ExsyFb-cdU8jPNDP1dsEq_ra_bazU-EXQZQ86pJT3BlbkFJ4zURsV0t--3qNM7A-P57NUqZIBosrL7POwzpjR5EQA"

# Initialize the Gemma model
gemma_pipe = pipeline(
    "text-generation",
    model="google/gemma-2-2b-it",
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cpu"
)

# Initialize the Bloom model
bloom_model = BloomForCausalLM.from_pretrained("bigscience/bloom-560m")
bloom_tokenizer = BloomTokenizerFast.from_pretrained("bigscience/bloom-560m")

def extract_text_from_pdf(pdf_file):
    document = fitz.open(pdf_file)
    text = ""
    for page_num in range(len(document)):
        page = document.load_page(page_num)
        text += page.get_text()
    return text

def evaluate_with_gpt(pdf_file, job_description):
    resume_text = extract_text_from_pdf(pdf_file)
   
    keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری"
   
    prompt = f"""
    به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است.
    لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید.
   
    ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن.
    شرح شغل: {job_description}
    رزومه: {resume_text}
   
    من پاسخ را در یک رشته با ساختار زیر می‌خواهم:
    {{"تطابق شرح شغل با رزومه فرد ":"%"، "تعداد کلمات کلیدی غیر منطبق  ":""، "تعداد کلمات کلیدی منطبق   ":""}}
    """
   
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": prompt}
            ],
            temperature=0
        )
        return response.choices[0].message['content']
    except Exception as e:
        return f"Error during resume evaluation: {e}"

def evaluate_with_gemma(pdf_file, job_description):
    resume_text = extract_text_from_pdf(pdf_file)

    keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری"
   
    prompt = f"""
    به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است.
    لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید.
   
    ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن.
    شرح شغل: {job_description}
    رزومه: {resume_text}
   
    من پاسخ را در یک رشته با ساختار زیر می‌خواهم:
    {{"تطابق شرح شغل با رزومه فرد ":"%"، "تعداد کلمات کلیدی غیر منطبق  ":""، "تعداد کلمات کلیدی منطبق   ":""}}
    """
   
    outputs = gemma_pipe(prompt, max_new_tokens=256)
    return outputs[0]["generated_text"].strip()

def evaluate_with_bloom(pdf_file, job_description):
    resume_text = extract_text_from_pdf(pdf_file)

    keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری"
   
    prompt = f"""
    به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است.
    لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید.
   
    ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن.
    شرح شغل: {job_description}
    رزومه: {resume_text}
   
    من پاسخ را در یک رشته با ساختار زیر می‌خواهم:
    {{"تطابق شرح شغل با رزومه فرد ":"%"، "تعداد کلمات کلیدی غیر منطبق  ":""، "تعداد کلمات کلیدی منطبق   ":""}}
    """
   
    inputs = bloom_tokenizer(prompt, return_tensors="pt")
    outputs = bloom_model.generate(inputs["input_ids"], max_length=2000)
    return bloom_tokenizer.decode(outputs[0], skip_special_tokens=True).strip()

def evaluate_all_models(pdf_file, job_description):
    gpt_result = evaluate_with_gpt(pdf_file, job_description)
    gemma_result = evaluate_with_gemma(pdf_file, job_description)
    bloom_result = evaluate_with_bloom(pdf_file, job_description)
    return f"GPT-4o Result:\n{gpt_result}\n\nGemma Result:\n{gemma_result}\n\nBloom Result:\n{bloom_result}"

iface = gr.Interface(
    fn=lambda pdf, jd, model: evaluate_with_gpt(pdf, jd) if model == "GPT-4o" else evaluate_with_gemma(pdf, jd) if model == "Gemma" else evaluate_with_bloom(pdf, jd) if model == "Bloom" else evaluate_all_models(pdf, jd),
    inputs=[
        gr.File(label="Upload Resume PDF"),
        gr.Textbox(lines=10, label="Job Description"),
        gr.Radio(choices=["GPT-4o", "Gemma", "Bloom", "All"], label="Choose Model")
    ],
    outputs="text",
    title="Resume Evaluator"
)

iface.launch()