|
|
from enum import Enum |
|
|
import time |
|
|
import traceback |
|
|
import uuid |
|
|
from werkzeug.exceptions import InternalServerError |
|
|
from config.logger import CustomLogger,request_id_var |
|
|
import torch |
|
|
from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer |
|
|
import os |
|
|
import sys |
|
|
import nltk |
|
|
from nltk.tokenize.punkt import PunktSentenceTokenizer |
|
|
|
|
|
try: |
|
|
if getattr(sys, 'frozen', False): |
|
|
application_path = sys._MEIPASS |
|
|
else: |
|
|
application_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..') |
|
|
log=CustomLogger() |
|
|
log.info(f"application_path : {application_path}") |
|
|
log.info("before loading model") |
|
|
|
|
|
device = "cuda" |
|
|
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") |
|
|
log.info(f"device : {device}") |
|
|
gpu=0 if torch.cuda.is_available() else -1 |
|
|
|
|
|
|
|
|
pipeline_kwargs={"return_token_type_ids": False,"max_length": 512,"truncation": True,"batch_size": 1} |
|
|
gibberishModel = AutoModelForSequenceClassification.from_pretrained(os.path.join(application_path, "models/gibberish")).to(device) |
|
|
gibberishTokenizer = AutoTokenizer.from_pretrained(os.path.join(application_path, "models/gibberish")) |
|
|
|
|
|
request_id_var.set("Startup") |
|
|
log_dict={} |
|
|
log.info("model loaded") |
|
|
|
|
|
except Exception as e: |
|
|
log.error(f"Exception: {e}") |
|
|
log.error(f"Exception: {str(traceback.extract_tb(e.__traceback__)[0].lineno),e}") |
|
|
|
|
|
|
|
|
|
|
|
class MatchType(Enum): |
|
|
SENTENCE = "sentence" |
|
|
FULL = "full" |
|
|
|
|
|
def get_inputs(self, prompt: str) -> list[str]: |
|
|
if self == MatchType.SENTENCE: |
|
|
pk = PunktSentenceTokenizer() |
|
|
return pk.sentences_from_text(text=prompt) |
|
|
return [prompt] |
|
|
|
|
|
|
|
|
class Gibberish: |
|
|
|
|
|
def scan(self,payload): |
|
|
log.info("inside gibberish_check") |
|
|
id=uuid.uuid4().hex |
|
|
request_id_var.set(id) |
|
|
log_dict[request_id_var.get()]=[] |
|
|
try: |
|
|
st = time.time() |
|
|
text=payload['text'] |
|
|
gibberish_labels = payload['labels'] |
|
|
nlp = pipeline(task="text-classification", model=gibberishModel, tokenizer=gibberishTokenizer, device=device,model_kwargs=pipeline_kwargs) |
|
|
match_type = MatchType(MatchType.FULL) |
|
|
results_all = nlp(match_type.get_inputs(text)) |
|
|
log.debug(f"Gibberish detection finished :{results_all}") |
|
|
output={} |
|
|
res=[] |
|
|
for result in results_all: |
|
|
score = round( |
|
|
result["score"] if result["label"] in gibberish_labels else 1 - result["score"], |
|
|
2, |
|
|
) |
|
|
output['gibberish_label'] = result["label"] |
|
|
output['gibberish_score'] = score |
|
|
|
|
|
res.append(output) |
|
|
|
|
|
del nlp |
|
|
er=log_dict[request_id_var.get()] |
|
|
logobj = {"_id":id,"error":er} |
|
|
if len(er)!=0: |
|
|
log.debug(str(logobj)) |
|
|
del log_dict[id] |
|
|
return {"result":res,"time_taken":str(round(time.time()-st,3))+"s"} |
|
|
|
|
|
except Exception as e: |
|
|
log.error("Error occured in gibberish_check") |
|
|
log.error(f"Exception: {str(traceback.extract_tb(e.__traceback__)[0].lineno),e}") |
|
|
log_dict[request_id_var.get()].append({"Line number":str(traceback.extract_tb(e.__traceback__)[0].lineno),"Error":str(e), |
|
|
"Error Module":"Failed at gibberish_check call"}) |
|
|
raise InternalServerError() |