#Fast APi Packages from fastapi import FastAPI,File, UploadFile from pydantic import BaseModel import json from typing_extensions import Annotated #SkillExtraction Packages import PyPDF2 from PyPDF2 import PdfReader import psycopg2 from psycopg2 import sql import pandas as pd from datetime import date import numpy as np import spacy import re from sentence_transformers import SentenceTransformer, util from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity from io import StringIO from spacy.matcher import PhraseMatcher from skillNer.general_params import SKILL_DB from skillNer.skill_extractor_class import SkillExtractor from psycopg2.extensions import register_adapter, AsIs register_adapter(np.int64, AsIs) import warnings warnings.filterwarnings('ignore') from io import BytesIO import requests #Custom Classes for endpoints from DbConnection import DbConnection from UploadFile import UploadOpenFile from SkillExtract import SkillExtractorDetails import os os.environ['HF_HOME'] = '/hug/cache/' app = FastAPI() class FileDetails(BaseModel): filecontents: str filename: str fileid: str message: str class SkillDetails(BaseModel): skillid: int requiredSkills: str softSkills: str goodToHaveSkills: str class FileResponse(BaseModel): fileid: int message: str nlp = spacy.load("en_core_web_lg") # init skill extractor skill_extractor = SkillExtractor(nlp, SKILL_DB, PhraseMatcher) @app.get("/") async def root(): return {"SkillAPI":"SkillAPi Version 0.05"} #https://vaibhav84-resumeapi.hf.space/docs db_params = DbConnection.GetDbConnection() def parse_csv(df): res = df.to_json(orient="records") parsed = json.loads(res) return parsed @app.get("/ProfileMatch") def ProfileMatchResults(): dbQuery = "select * from profilematch" conn = psycopg2.connect(**db_params) df = pd.read_sql_query(dbQuery, conn) return parse_csv(df) @app.post("/UploadFile/") def UploadFileDetails(file_data: FileDetails): returnID = UploadOpenFile.uploadFile(file_data.filecontents,file_data.filename,db_params) file_data.filecontents = "" file_data.fileid = str(returnID) file_data.message = "File Uploaded Successfully!" return file_data @app.post("/ExtractSkills/") def ExtractSkills(skill_data: SkillDetails): returnSkills = SkillExtractorDetails.SkillExtract(db_params,skill_extractor,skill_data.skillid) details = returnSkills.split('@') skill_data.requiredSkills = details[0] skill_data.softSkills = details[1] skill_data.goodToHaveSkills = details[1] return skill_data @app.post("/uploadJobDescription/") def create_upload_file(file: bytes = File(...)): content = file.decode('utf-8') lines = content.split('\n') return {"content": lines} @app.post("/uploadJobDescriptionPDF/") def upload_PDF(file: UploadFile = File(...)): try: contents = file.file.read() with open(file.filename, 'wb') as f: f.write(contents) except Exception: return {"message": "There was an error uploading the file"} finally: file.file.close() return {"message": f"Successfully uploaded {contents}"} @app.post("/uploadJobDescriptionPDF2/") def process_pdf_file(file: bytes = File(...)): # Save file locally for processing contents = file.read() with open(file.filename, 'wb') as f: f.write(contents) # Process saved file return process_pdf(file.filename, is_local_file=True) def process_pdf(pdf_source, is_local_file=False): # Process the PDF from URL or local file file = BytesIO(requests.get(pdf_source).content) if not is_local_file else open(pdf_source, 'rb') # Extract text from PDF pdf_reader = PyPDF2.PdfFileReader(file) text = "" for page in range(pdf_reader.numPages): text += pdf_reader.getPage(page).extractText() if is_local_file: file.close() return {"content": text}