uas-nlp / app.py
ElizabethSrgh's picture
Update app.py
23345b6 verified
raw
history blame
2.08 kB
import torch
import torch.nn as nn
from transformers import AutoTokenizer, AutoModel
import gradio as gr
class MultiTaskModel(nn.Module):
def __init__(self, base_model_name, num_topic_classes, num_sentiment_classes):
super(MultiTaskModel, self).__init__()
self.encoder = AutoModel.from_pretrained(base_model_name)
hidden_size = self.encoder.config.hidden_size
self.topik_classifier = nn.Linear(hidden_size, num_topic_classes)
self.sentiment_classifier = nn.Linear(hidden_size, num_sentiment_classes)
def forward(self, input_ids, attention_mask, token_type_ids=None):
outputs = self.encoder(
input_ids=input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids
)
pooled_output = outputs.last_hidden_state[:, 0]
topik_logits = self.topik_classifier(pooled_output)
sentimen_logits = self.sentiment_classifier(pooled_output)
return topik_logits, sentimen_logits
tokenizer = AutoTokenizer.from_pretrained("tokenizer")
model = MultiTaskModel("indobenchmark/indobert-base-p1", num_topic_classes=5, num_sentiment_classes=3)
model.load_state_dict(torch.load("model.pt", map_location=torch.device("cpu")))
model.eval()
topik_labels = ["Produk", "Layanan", "Pengiriman", "Pembatalan", "Lainnya"]
sentimen_labels = ["Negatif", "Netral", "Positif"]
def klasifikasi(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
topik_logits, sentimen_logits = model(**inputs)
topik_idx = torch.argmax(topik_logits, dim=-1).item()
sentimen_idx = torch.argmax(sentimen_logits, dim=-1).item()
topik = topik_labels[topik_idx]
sentimen = sentimen_labels[sentimen_idx]
ringkasan = f"Pelanggan: {text}\nCS: Kami senang dapat membantu Anda."
return f"HASIL ANALISIS\nTopik: {topik}\nSentimen: {sentimen}\nRingkasan: {ringkasan}"
demo = gr.Interface(fn=klasifikasi, inputs="text", outputs="text", title="Klasifikasi Topik dan Sentimen Pelanggan")
demo.launch()