ServiceNowMTTR / app.py
xeroISB's picture
Update app.py
3759ad1 verified
import gradio as gr
import numpy as np
import pandas as pd
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from sklearn.preprocessing import LabelEncoder, StandardScaler
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk
import torch
# Download VADER lexicon for sentiment analysis
nltk.download('vader_lexicon')
# Load model and tokenizer from Hugging Face
tokenizer = AutoTokenizer.from_pretrained("xeroISB/ServiceNowMTTR")
model = AutoModelForSequenceClassification.from_pretrained("xeroISB/ServiceNowMTTR")
# Move model to GPU if available
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
# Initialize LabelEncoders
label_encoders = {
'impact': LabelEncoder(),
'priority': LabelEncoder(),
'category': LabelEncoder(),
'urgency': LabelEncoder()
}
# Function to preprocess input data
def preprocess_input(short_description, impact, priority, category, urgency):
# Encode categorical features
input_data = pd.DataFrame({
'short_description': [short_description],
'impact': [impact],
'priority': [priority],
'category': [category],
'urgency': [urgency]
})
for column in ['impact', 'priority', 'category', 'urgency']:
input_data[column] = label_encoders[column].fit_transform(input_data[column])
short_description = input_data['short_description'].iloc[0].lower()
# Tokenize text data using the new tokenizer
inputs = tokenizer(short_description, return_tensors='pt', padding='max_length', truncation=True, max_length=50)
inputs = {k: v.to(device) for k, v in inputs.items()}
# Feature engineering: Add sentiment score
sid = SentimentIntensityAnalyzer()
input_data['sentiment_score'] = input_data['short_description'].apply(lambda x: sid.polarity_scores(x)['compound'])
# Normalize numerical features
numerical_features = input_data[['impact', 'priority', 'category', 'urgency', 'sentiment_score']]
scaler = StandardScaler()
scaled_numerical_features = scaler.fit_transform(numerical_features)
return inputs, scaled_numerical_features
# Function to make predictions
def predict(short_description, impact, priority, category, urgency):
inputs, scaled_numerical_features = preprocess_input(short_description, impact, priority, category, urgency)
# Make prediction
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
predicted_label = torch.argmax(logits, axis=1).item()
sentiment_score = scaled_numerical_features[0][-1]
return predicted_label, sentiment_score
# Define Gradio interface
inputs = [
gr.components.Textbox(lines=2, placeholder="Enter short description...", label="Short Description"),
gr.components.Textbox(lines=1, placeholder="Enter impact...", label="Impact (e.g., '2 - Medium')"),
gr.components.Textbox(lines=1, placeholder="Enter priority...", label="Priority (e.g., '2 - Medium')"),
gr.components.Textbox(lines=1, placeholder="Enter category...", label="Category (e.g., 'Network')"),
gr.components.Textbox(lines=1, placeholder="Enter urgency...", label="Urgency (e.g., '1 - High')")
]
outputs = [
gr.components.Textbox(label="Predicted Duration Bin 0 : 1-2 hours, 1: 3-4 hours, 2: 4-8 hours, 3: More than 8 hours"),
gr.components.Textbox(label="Sentiment Score")
]
interface = gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title="Incident Duration Predictor", description="Predict the duration bin and sentiment score based on issue description and related features.")
# Launch the interface
interface.launch()