| import tensorflow as tf
|
| import requests
|
| from config import Config
|
| from utils import preprocess
|
| from models import ModelManager
|
|
|
| class PredictionEngine:
|
| def __init__(self, model_manager: ModelManager):
|
| self.model_manager = model_manager
|
|
|
| def predict_with_bert(self, text: str):
|
| try:
|
| inputs = self.model_manager.bert_tokenizer(
|
| text, return_tensors="tf", truncation=True, padding=True
|
| )
|
| outputs = self.model_manager.bert_model(**inputs)
|
| logits = outputs.logits.numpy()[0]
|
| prediction = int(tf.math.argmax(logits).numpy())
|
| confidence = float(tf.nn.softmax(logits)[prediction].numpy())
|
| label = Config.LABEL_MAP.get(prediction, "neutral")
|
| return prediction, label, confidence
|
| except Exception as e:
|
| print(f"β BERT prediction error: {e}")
|
| return 1, "neutral", 0.5
|
|
|
| def predict_with_naive_bayes(self, text: str):
|
| try:
|
| cleaned = preprocess(text, model_type="naive_bayes")
|
| prediction = self.model_manager.naive_bayes_model.predict([cleaned])[0]
|
| label = Config.LABEL_MAP.get(prediction, "unknown")
|
| return prediction, label, 0.85
|
| except Exception as e:
|
| print(f"β Naive Bayes prediction error: {e}")
|
| return 1, "neutral", 0.5
|
|
|
| def predict_sentiment(self, text: str, model_choice: str):
|
| if not text.strip():
|
| return self._html_message("β οΈ Please enter some text to analyze.", "warning")
|
|
|
| if model_choice == "Naive Bayes":
|
| if self.model_manager.naive_bayes_model is None:
|
| return self._html_message("Naive Bayes model not available.", "error")
|
| pred, label, conf = self.predict_with_naive_bayes(text)
|
| elif model_choice == "BERT":
|
| if self.model_manager.bert_model is None:
|
| return self._html_message("BERT model not available.", "error")
|
| pred, label, conf = self.predict_with_bert(text)
|
| else:
|
| return self._html_message("Invalid model selection.", "error")
|
|
|
| self._log_to_sheet(text, model_choice, label, conf)
|
| return self._render_result(label, model_choice, conf)
|
|
|
| def _log_to_sheet(self, text, model, sentiment, confidence):
|
| try:
|
| requests.post(Config.GOOGLE_SHEET_ENDPOINT, json={
|
| "token": Config.GOOGLE_SHEET_TOKEN,
|
| "text": text,
|
| "model_used": model,
|
| "sentiment": sentiment,
|
| "confidence": confidence
|
| })
|
| except Exception as e:
|
| print(f"β οΈ Logging failed: {e}")
|
|
|
| def _render_result(self, label, model, confidence):
|
| emoji = {"positive": "π", "negative": "π", "neutral": "π"}.get(label, "π")
|
| return f"""
|
| <div class="sentiment-result" data-sentiment="{label}">
|
| <h2 class="result-title">{emoji} Sentiment Result</h2>
|
| <p class="sentiment-label">{label.upper()}</p>
|
| <p class="model-info">Model: {model}</p>
|
| <p class="confidence-info">Confidence: {confidence:.2%}</p>
|
| </div>
|
| """
|
|
|
| def _html_message(self, msg, level):
|
| return f"<div class='sentiment-result {level}'>{msg}</div>"
|
|
|