Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import tensorflow as tf | |
| from transformers import BertTokenizer, TFBertForSequenceClassification | |
| import numpy as np | |
| import os | |
| # --- Page Configuration --- | |
| st.set_page_config( | |
| page_title="Disaster Tweet Classifier", | |
| page_icon="π¨", | |
| layout="centered" | |
| ) | |
| # --- Title and Description --- | |
| st.title("π¨ Disaster Tweet Classifier") | |
| st.markdown(""" | |
| This AI application determines whether a tweet is about a **real disaster** (e.g., earthquake, fire) | |
| or just uses **metaphorical language** (e.g., 'This movie was a disaster'). | |
| \n**Powered by:** BERT (Bidirectional Encoder Representations from Transformers) | |
| """) | |
| # --- Model Loading Logic --- | |
| def load_model(): | |
| # model files are now in the same folder as this script (src/) | |
| model_path = "src/" | |
| try: | |
| tokenizer = BertTokenizer.from_pretrained(model_path) | |
| model = TFBertForSequenceClassification.from_pretrained(model_path, from_pt=False) | |
| return tokenizer, model | |
| except Exception as e: | |
| st.error(f"β Error loading model: {e}") | |
| st.info("Make sure config.json, tf_model.h5, vocab.txt and tokenizer files are in the same folder.") | |
| return None, None | |
| # Load model | |
| with st.spinner("Loading AI Model... Please wait..."): | |
| tokenizer, model = load_model() | |
| # --- Prediction Logic --- | |
| def predict_tweet(text, tokenizer, model, max_len=80): | |
| encoded = tokenizer.encode_plus( | |
| text, | |
| add_special_tokens=True, | |
| max_length=max_len, | |
| padding='max_length', | |
| return_attention_mask=True, | |
| truncation=True | |
| ) | |
| input_ids = tf.convert_to_tensor([encoded['input_ids']]) | |
| attention_mask = tf.convert_to_tensor([encoded['attention_mask']]) | |
| # Forward pass | |
| outputs = model([input_ids, attention_mask]) | |
| logits = outputs.logits | |
| # Softmax | |
| probs = tf.nn.softmax(logits, axis=1).numpy()[0] | |
| pred_class = int(np.argmax(probs)) | |
| confidence = float(probs[pred_class]) | |
| return pred_class, confidence | |
| # --- User Interface --- | |
| st.divider() | |
| user_input = st.text_area("Enter a tweet below:", height=100, placeholder="Example: The forest fire is spreading rapidly!") | |
| col1, col2 = st.columns([1, 2]) | |
| with col1: | |
| analyze_button = st.button("Analyze Tweet", type="primary", use_container_width=True) | |
| if analyze_button: | |
| if not user_input.strip(): | |
| st.warning("β οΈ Please enter some text first.") | |
| elif model is None: | |
| st.error("Model failed to load.") | |
| else: | |
| pred_class, confidence = predict_tweet(user_input, tokenizer, model) | |
| st.divider() | |
| if pred_class == 1: | |
| st.error(f"### π¨ Prediction: REAL DISASTER") | |
| st.write(f"Confidence Score: **%{confidence * 100:.2f}**") | |
| st.progress(int(confidence * 100)) | |
| else: | |
| st.success(f"### π Prediction: NOT A DISASTER") | |
| st.write(f"Confidence Score: **%{confidence * 100:.2f}**") | |
| st.progress(int(confidence * 100)) |