#Fast APi Packages from fastapi import FastAPI,File, UploadFile from pydantic import BaseModel import json from typing_extensions import Annotated from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse #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 import docx2txt from sentence_transformers import SentenceTransformer, util from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity import io 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 SkillData(BaseModel): filename: 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.post("/uploadJobDescription/") def uploadJobDescription(file: bytes = File(...), FileName: str = "sample.pdf"): # Save file locally for processing text ='' print(text) if FileName.endswith("pdf"): reserve_pdf_on_memory = io.BytesIO(file) load_pdf = PyPDF2.PdfReader(reserve_pdf_on_memory) for page in load_pdf.pages: text += page.extract_text() elif FileName.endswith("doc") or FileName.endswith("docx"): text = docx2txt.process(file) text = text.read() else: text = file.decode('utf-8') returnID = UploadOpenFile.uploadFile(text,FileName,db_params) returnSkills = SkillExtractorDetails.SkillExtract(db_params,skill_extractor,returnID) details = returnSkills.split('@') responseData = 'Required Skills : ' + details[0] +'

' responseData = responseData + 'Soft Skills : ' + details[1] +'

' responseData = responseData + 'Good to have Skills : ' + details[2] return {"SkillDetails": responseData} @app.get("/AllProfileMatchResults") 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 from datetime import datetime from typing import Union class Item(BaseModel): title: str ='Test' description: str = 'Desc' @app.post("/getProfileMatchResultsByName/{id}") def getProfileMatchResultsByName(id: str): item: Item item.title ='test' item.description = 'desc' json_compatible_item_data = jsonable_encoder(item) return JSONResponse(content=json_compatible_item_data)