| import tensorflow as tf |
| from tensorflow.keras.layers import Layer, Dense |
| import gradio as gr |
| import joblib |
| from tensorflow.keras.preprocessing.sequence import pad_sequences |
|
|
| |
| class BetterAttention(Layer): |
| def __init__(self, units=64, return_attention=False, **kwargs): |
| super(BetterAttention, self).__init__(**kwargs) |
| self.return_attention = return_attention |
| self.W = Dense(units) |
| self.V = Dense(1) |
|
|
| def call(self, inputs): |
| score = self.V(tf.nn.tanh(self.W(inputs))) |
| attention_weights = tf.nn.softmax(score, axis=1) |
| context_vector = attention_weights * inputs |
| context_vector = tf.reduce_sum(context_vector, axis=1) |
| return (context_vector, attention_weights) if self.return_attention else context_vector |
|
|
| |
| model = tf.keras.models.load_model("sentiment_model.keras", custom_objects={"BetterAttention": BetterAttention}) |
| tokenizer = joblib.load("tokenizer.joblib") |
|
|
| |
| max_len = 40 |
|
|
| def predict_sentiment(text): |
| seq = tokenizer.texts_to_sequences([text]) |
| padded = pad_sequences(seq, maxlen=max_len, padding='post') |
| pred = model.predict(padded)[0][0] |
| label = "Positive" if pred >= 0.5 else "Negative" |
| confidence = float(pred if pred >= 0.5 else 1 - pred) |
| return {label: confidence} |
|
|
| |
| demo = gr.Interface(fn=predict_sentiment, |
| inputs=gr.Textbox(lines=2, placeholder="Enter a tweet..."), |
| outputs=gr.Label(num_top_classes=2), |
| title="Sentiment Analysis on Tweets", |
| description="Enter a tweet and get predicted sentiment with confidence score.") |
|
|
| demo.launch() |