from typing import List, Tuple from typing_extensions import Literal import logging import pandas as pd from pandas import DataFrame, Series from utils.config import getconfig from utils.preprocessing import processingpipeline import streamlit as st from transformers import pipeline # Labels dictionary ### _lab_dict = { 'GHG':'GHG', 'NOT_GHG':'NON GHG TRANSPORT TARGET', 'NEGATIVE':'OTHERS', } @st.cache_resource def load_ghgClassifier(config_file:str = None, classifier_name:str = None): """ loads the document classifier using haystack, where the name/path of model in HF-hub as string is used to fetch the model object.Either configfile or model should be passed. 1. https://docs.haystack.deepset.ai/reference/document-classifier-api 2. https://docs.haystack.deepset.ai/docs/document_classifier Params -------- config_file: config file path from which to read the model name classifier_name: if modelname is passed, it takes a priority if not \ found then will look for configfile, else raise error. Return: document classifier model """ if not classifier_name: if not config_file: logging.warning("Pass either model name or config file") return else: config = getconfig(config_file) classifier_name = config.get('ghg','MODEL') logging.info("Loading ghg classifier") doc_classifier = pipeline("text-classification", model=classifier_name, top_k =1) return doc_classifier @st.cache_data def ghg_classification(haystack_doc:pd.DataFrame, threshold:float = 0.5, classifier_model:pipeline= None )->Tuple[DataFrame,Series]: """ Text-Classification on the list of texts provided. Classifier provides the most appropriate label for each text. It identifies if text contains 'GHG' related information or not. Params --------- haystack_doc: List of haystack Documents. The output of Preprocessing Pipeline contains the list of paragraphs in different format,here the list of Haystack Documents is used. threshold: threshold value for the model to keep the results from classifier classifiermodel: you can pass the classifier model directly,which takes priority however if not then looks for model in streamlit session. In case of streamlit avoid passing the model directly. Returns ---------- df: Dataframe """ logging.info("Working on GHG Extraction") haystack_doc['GHG Label'] = 'NA' haystack_doc['GHG Score'] = 0.0 # applying GHG Identifier to only 'Target' paragraphs. temp = haystack_doc[haystack_doc['Target Label'] == 'TARGET'] temp = temp.reset_index(drop=True) df = haystack_doc[haystack_doc['Target Label'] == 'NEGATIVE'] df = df.reset_index(drop=True) if not classifier_model: classifier_model = st.session_state['ghg_classifier'] results = classifier_model(list(temp.text)) labels_= [(l[0]['label'],l[0]['score']) for l in results] temp['GHG Label'],temp['GHG Score'] = zip(*labels_) temp['GHG Label'] = temp['GHG Label'].apply(lambda x: _lab_dict[x]) # merge back Target and non-Target dataframe df = pd.concat([df,temp]) df = df.reset_index(drop =True) df['GHG Score'] = df['GHG Score'].round(2) df.index += 1 return df