File size: 3,347 Bytes
1f0dd44
 
 
 
 
9b9dee3
4289365
9b9dee3
 
 
1f0dd44
 
9b9dee3
1f0dd44
 
 
9b9dee3
7edccf8
 
1f0dd44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import pipeline
import spacy
from docx import Document
import tempfile
import os
import torch
try:
    nlp = spacy.load('en_core_web_sm')
except IOError:
    import subprocess
    subprocess.run(["python", "-m", "spacy", "download", "en_core_web_sm"])
    nlp = spacy.load('en_core_web_sm')

#nlp = spacy.load('en_core_web_sm')
# Load models quietly
#nlp = spacy.load('en_core_web_sm')
device = 0 if torch.cuda.is_available() else -1
fill_mask = pipeline("fill-mask", model="bert-base-uncased", device=device)  # Use GPU if available

# Cell 3: Define functions
def extract_text_from_docx(file_path):
    try:
        doc = Document(file_path)
        return '\n'.join([para.text for para in doc.paragraphs])
    except:
        return ""

def save_updated_resume(text):
    try:
        temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.docx')
        doc = Document()
        for line in text.split('\n'):
            doc.add_paragraph(line)
        doc.save(temp_file.name)
        return temp_file.name
    except:
        return None

def bert_suggest_replacements(text):
    suggestions = []
    improved_text = text
    doc = nlp(text)

    for token in doc:
        if token.is_stop or not token.is_alpha or len(token.text) <= 3:
            continue

        masked_sentence = improved_text.replace(token.text, "[MASK]", 1)
        try:
            predictions = fill_mask(masked_sentence)
            best_suggestion = predictions[0]['token_str']

            if best_suggestion != token.text.lower():
                improved_text = improved_text.replace(token.text, best_suggestion, 1)
                suggestions.append(f"• Replace '{token.text}' with '{best_suggestion}'")
        except:
            continue

    return improved_text, suggestions

def process_resume(file):
    if file is None:
        return "Please upload a resume file.", "No suggestions yet.", None

    try:
        resume_text = extract_text_from_docx(file.name)
        if not resume_text:
            return "Could not read the resume. Please ensure it's a valid .docx file.", "No suggestions available.", None

        updated_text, suggestions = bert_suggest_replacements(resume_text)
        output_file_path = save_updated_resume(updated_text)

        suggestions_text = "Suggested Improvements:\n" + '\n'.join(suggestions) if suggestions else "No improvements suggested. Your resume looks good!"

        return updated_text, suggestions_text, output_file_path
    except:
        return "An error occurred. Please try again with a different file.", "No suggestions available.", None

# Cell 4: Create and launch Gradio interface
iface = gr.Interface(
    fn=process_resume,
    inputs=gr.File(label="Upload Your Resume (.docx only)", file_types=[".docx"]),
    outputs=[
        gr.Textbox(label="Optimized Resume Text", lines=10),
        gr.Textbox(label="ATS Improvement Suggestions", lines=10),
        gr.File(label="Download Optimized Resume")
    ],
    title="ATS Resume Optimizer",
    description="Upload your .docx resume for ATS optimization. We'll suggest improvements and provide an updated version.",
    theme="default",
    css="""
        .gradio-container {max-width: 800px; margin: auto;}
        .output-markdown {white-space: pre-wrap;}
    """
)

iface.launch(share=True)