File size: 2,975 Bytes
5ea17e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import io
import os
import PyPDF2
from gradio.components import File, Textbox
from langchain_openai import ChatOpenAI
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain import PromptTemplate
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

def extract_text_from_pdf_binary(pdf_binary):
    """Extracts text from a PDF file binary."""
    text = ""
    pdf_data = io.BytesIO(pdf_binary)
    reader = PyPDF2.PdfReader(pdf_data)
    for page in reader.pages:
        page_text = page.extract_text()
        if page_text:
            text += page_text
    return text

def calculate_resume_score(resume_text, job_description):
    """
    Calculates the relevance score of the resume to the job description using cosine similarity.
    
    Parameters:
    - resume_text (str): Text of the resume.
    - job_description (str): Text of the job description.
    
    Returns:
    - score (float): Similarity score between the resume and job description.
    """
    vectorizer = TfidfVectorizer()
    tfidf_matrix = vectorizer.fit_transform([resume_text, job_description])
    score = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])[0][0]
    return score

def format_resume_to_yaml(api_key, file_content, job_description):
    """Formats the content of a resume PDF file to YAML and calculates its relevance to a job description."""
    if not file_content:
        raise ValueError("The uploaded file is empty.")

    os.environ['OPENAI_API_KEY'] = api_key
    resume_text = extract_text_from_pdf_binary(file_content)

    # Additional step to calculate the resume score relative to the job description.
    resume_score = calculate_resume_score(resume_text, job_description)
    
    # Formatting the resume to YAML (the existing implementation continues here)...
    # Assume llm_chain.predict and other logic here as before.

    # For demonstration, return both formatted resume (in real use, integrate this properly) and score.
    return "Formatted Resume in YAML (placeholder)", resume_score

def main():
    """Main function to launch the Gradio interface with job description input."""
    iface = gr.Interface(
        fn=format_resume_to_yaml,
        inputs=[
            Textbox(label="Enter your OpenAI API Key"),
            File(label="Upload your PDF resume", type="binary"),
            Textbox(label="Paste the Job Description here", lines=10)
        ],
        outputs=[
            Textbox(label="Formatted Resume in YAML"),
            Textbox(label="Resume Score")
        ],
        title="Resume to YAML Formatter with ATS Scoring",
        description="Upload a PDF resume, paste the job description, and enter your OpenAI API key to get the resume formatted to a YAML template and score its relevance to the job."
    )
    iface.launch(debug=True, share=True)

if __name__ == "__main__":
    main()