ram2001/multi-task_hierarchical_deep-learning_system
0
1import streamlit as st2import numpy as np3import pickle4from tensorflow.keras.models import load_model5from tensorflow.keras.preprocessing.sequence import pad_sequences6 7# =========================8# LOAD ARTIFACTS9# =========================10 11@st.cache_resource12def load_artifacts():13 14 model = load_model("multi_task_bilstm_attention.h5")15 16 tokenizer = pickle.load(open("tokenizer.pkl", "rb"))17 le_type = pickle.load(open("le_type.pkl", "rb"))18 le_queue = pickle.load(open("le_queue.pkl", "rb"))19 mlb = pickle.load(open("mlb.pkl", "rb"))20 21 return model, tokenizer, le_type, le_queue, mlb22 23 24model, tokenizer, le_type, le_queue, mlb = load_artifacts()25 26MAX_LEN = 12027 28# =========================29# TEXT PREPROCESS30# =========================31 32def preprocess_text(subject, body):33 text = f"{subject} {body}".lower()34 seq = tokenizer.texts_to_sequences([text])35 padded = pad_sequences(seq, maxlen=MAX_LEN, padding="post")36 return padded37 38 39# =========================40# SAFE PREDICTION FUNCTION41# =========================42 43def predict_ticket(subject, body):44 45 x = preprocess_text(subject, body)46 47 # ---- MODEL PREDICT ----48 preds = model.predict(x, verbose=0)49 50 # Map outputs correctly using layer names51 output_map = dict(zip(model.output_names, preds))52 53 # ===== TYPE =====54 type_pred = output_map[55 [k for k in output_map.keys() if "type" in k.lower()][0]56 ]57 58 type_index = np.argmax(type_pred, axis=1)[0]59 pred_type = le_type.inverse_transform([type_index])[0]60 61 # ===== QUEUE =====62 queue_pred = output_map[63 [k for k in output_map.keys() if "queue" in k.lower()][0]64 ]65 66 queue_index = np.argmax(queue_pred, axis=1)[0]67 pred_queue = le_queue.inverse_transform([queue_index])[0]68 69 # ===== TAGS =====70 tag_pred = output_map[71 [k for k in output_map.keys() if "tag" in k.lower()][0]72 ][0]73 74 TOP_K = 575 THRESHOLD = 0.35 # lower for multilingual robustness76 77 top_idx = tag_pred.argsort()[-TOP_K:][::-1]78 79 tags = [80 mlb.classes_[i]81 for i in top_idx82 if tag_pred[i] >= THRESHOLD83 ]84 85 # fallback (important)86 if len(tags) == 0:87 tags = [mlb.classes_[top_idx[0]]]88 89 return pred_type, pred_queue, tags90 91 92# =========================93# STREAMLIT UI94# =========================95 96st.title("Multilingual Ticket Classification (Hierarchical NLP Model)")97st.markdown("MESSAGE → TYPE → QUEUE → TAGS")98 99subject = st.text_input("Enter Subject")100body = st.text_area("Enter Ticket Message")101 102if st.button("Predict"):103 104 if subject.strip() == "" and body.strip() == "":105 st.warning("Please enter subject or message.")106 else:107 108 pred_type, pred_queue, tags = predict_ticket(subject, body)109 110 st.subheader("Predicted TYPE")111 st.success(pred_type)112 113 st.subheader("Predicted QUEUE")114 st.success(pred_queue)115 116 st.subheader("Predicted TAGS")117 st.write(", ".join(tags))