Spaces:
Sleeping
Sleeping
| import torch | |
| import torch.nn as nn | |
| from transformers import AutoTokenizer, BertModel, BertPreTrainedModel, BertConfig | |
| from pathlib import Path | |
| import logging | |
| # Konfigurasi logging untuk menampilkan pesan error yang jelas | |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
| # Definisi pemetaan (bisa juga diletakkan di sini agar terpusat) | |
| ASPECT_MAP = { | |
| 0: 'Fasilitas', 1: 'Harga', 2: 'Hotel', 3: 'Kamar', 4: 'Kolam Renang', | |
| 5: 'Layanan', 6: 'Lokasi', 7: 'Makanan', 8: 'Sarapan', 9: 'Staf' | |
| } | |
| SENTIMENT_MAP = {0: 'Negative', 1: 'Positive'} | |
| # Definisi kelas model, sama seperti sebelumnya | |
| class IndoBERTABSA(BertPreTrainedModel): | |
| def __init__(self, config): | |
| super().__init__(config) | |
| self.num_aspect_labels = len(ASPECT_MAP) | |
| self.num_sentiment_labels = len(SENTIMENT_MAP) | |
| self.bert = BertModel(config) | |
| self.dropout = nn.Dropout(config.hidden_dropout_prob) | |
| self.aspect_classifier = nn.Linear(config.hidden_size, self.num_aspect_labels) | |
| self.sentiment_classifier = nn.Linear(config.hidden_size, self.num_sentiment_labels) | |
| self.init_weights() | |
| def forward(self, input_ids=None, attention_mask=None, token_type_ids=None): | |
| outputs = self.bert( | |
| input_ids, | |
| attention_mask=attention_mask, | |
| token_type_ids=token_type_ids, | |
| ) | |
| pooled_output = outputs[1] | |
| pooled_output = self.dropout(pooled_output) | |
| aspect_logits = self.aspect_classifier(pooled_output) | |
| sentiment_logits = self.sentiment_classifier(pooled_output) | |
| return aspect_logits, sentiment_logits | |
| def load_model_and_tokenizer(): | |
| """ | |
| Fungsi terpusat untuk memuat tokenizer dan model. | |
| Mengembalikan (model, tokenizer) jika berhasil, atau (None, None) jika gagal. | |
| """ | |
| device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
| logging.info(f"Menggunakan perangkat: {device}") | |
| try: | |
| tokenizer = AutoTokenizer.from_pretrained("indobenchmark/indobert-base-p2") | |
| logging.info("Tokenizer berhasil dimuat.") | |
| except Exception as e: | |
| logging.error(f"GAGAL memuat tokenizer: {e}") | |
| return None, None | |
| try: | |
| config = BertConfig.from_pretrained("indobenchmark/indobert-base-p2") | |
| logging.info("Konfigurasi BERT berhasil dimuat.") | |
| except Exception as e: | |
| logging.error(f"GAGAL memuat konfigurasi BERT: {e}") | |
| return None, None | |
| model = IndoBERTABSA(config) | |
| model_save_path = Path('absa_indobert_model_75.pth') | |
| if not model_save_path.exists(): | |
| logging.error(f"File model tidak ditemukan di '{model_save_path}'") | |
| return None, None | |
| try: | |
| model.load_state_dict(torch.load(model_save_path, map_location=device)) | |
| model.to(device) | |
| model.eval() | |
| logging.info(f"Model berhasil dimuat dari {model_save_path} dan disetel ke mode evaluasi.") | |
| return model, tokenizer | |
| except Exception as e: | |
| logging.error(f"GAGAL memuat bobot model dari {model_save_path}: {e}") | |
| return None, None |