Yousif22's picture
Upload folder using huggingface_hub
49dead4 verified
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 # Static confidence
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>"