| import re | |
| import gradio as gr | |
| import spaces | |
| # ============================================================ | |
| # RULE-BASED SENTIMENT WORDS | |
| # ============================================================ | |
| POSITIVE_WORDS = { | |
| "good", | |
| "great", | |
| "excellent", | |
| "amazing", | |
| "awesome", | |
| "happy", | |
| "love", | |
| "like", | |
| "wonderful", | |
| "fantastic", | |
| "best", | |
| "beautiful", | |
| "perfect", | |
| "nice", | |
| "enjoy", | |
| "enjoyed", | |
| "helpful", | |
| "successful", | |
| "success", | |
| "brilliant", | |
| "positive", | |
| "thank", | |
| "thanks" | |
| } | |
| NEGATIVE_WORDS = { | |
| "bad", | |
| "terrible", | |
| "awful", | |
| "horrible", | |
| "sad", | |
| "hate", | |
| "dislike", | |
| "worst", | |
| "poor", | |
| "ugly", | |
| "wrong", | |
| "disappointing", | |
| "disappointed", | |
| "failure", | |
| "fail", | |
| "failed", | |
| "negative", | |
| "angry", | |
| "boring", | |
| "problem", | |
| "problems", | |
| "difficult", | |
| "useless", | |
| "slow", | |
| "broken" | |
| } | |
| # ============================================================ | |
| # SENTIMENT ANALYZER | |
| # ============================================================ | |
| # ZeroGPU requires a @spaces.GPU function to be registered | |
| # with the Gradio event system. | |
| # | |
| # This application does NOT actually perform GPU computation. | |
| # The decorator is only required because this Space is using | |
| # ZeroGPU hardware. | |
| # ============================================================ | |
| def sentiment_analyzer(text): | |
| # -------------------------------------------------------- | |
| # Check empty input | |
| # -------------------------------------------------------- | |
| if not text or not text.strip(): | |
| return "β οΈ Please enter a sentence." | |
| # -------------------------------------------------------- | |
| # Convert text to lowercase | |
| # -------------------------------------------------------- | |
| text = text.lower() | |
| # -------------------------------------------------------- | |
| # Extract words | |
| # -------------------------------------------------------- | |
| words = re.findall(r"\b\w+\b", text) | |
| # -------------------------------------------------------- | |
| # Find positive words | |
| # -------------------------------------------------------- | |
| positive_matches = [ | |
| word | |
| for word in words | |
| if word in POSITIVE_WORDS | |
| ] | |
| # -------------------------------------------------------- | |
| # Find negative words | |
| # -------------------------------------------------------- | |
| negative_matches = [ | |
| word | |
| for word in words | |
| if word in NEGATIVE_WORDS | |
| ] | |
| # -------------------------------------------------------- | |
| # Count sentiment words | |
| # -------------------------------------------------------- | |
| positive_count = len(positive_matches) | |
| negative_count = len(negative_matches) | |
| # -------------------------------------------------------- | |
| # Sentiment decision | |
| # -------------------------------------------------------- | |
| if positive_count > negative_count: | |
| sentiment = "π Positive" | |
| elif negative_count > positive_count: | |
| sentiment = "π Negative" | |
| else: | |
| sentiment = "π Neutral" | |
| # -------------------------------------------------------- | |
| # Create result | |
| # -------------------------------------------------------- | |
| result = f""" | |
| Sentiment: {sentiment} | |
| Positive words detected: {positive_count} | |
| Negative words detected: {negative_count} | |
| Positive matches: | |
| {", ".join(positive_matches) if positive_matches else "None"} | |
| Negative matches: | |
| {", ".join(negative_matches) if negative_matches else "None"} | |
| """ | |
| return result | |
| # ============================================================ | |
| # GRADIO INTERFACE | |
| # ============================================================ | |
| with gr.Blocks( | |
| title="Rule-Based Sentiment Analysis" | |
| ) as app: | |
| # -------------------------------------------------------- | |
| # Header | |
| # -------------------------------------------------------- | |
| gr.Markdown( | |
| """ | |
| # π Rule-Based Sentiment Analysis | |
| Analyze the sentiment of a sentence using | |
| **manually defined rules and keywords**. | |
| ### Sentiment Categories | |
| π **Positive** | |
| π **Negative** | |
| π **Neutral** | |
| --- | |
| **How it works** | |
| The application checks the words in your sentence | |
| against predefined positive and negative word lists. | |
| **No AI model β’ No API β’ No Machine Learning** | |
| """ | |
| ) | |
| # -------------------------------------------------------- | |
| # Text input | |
| # -------------------------------------------------------- | |
| text_input = gr.Textbox( | |
| label="Enter your sentence", | |
| placeholder="Example: I really love this application!", | |
| lines=4 | |
| ) | |
| # -------------------------------------------------------- | |
| # Analyze button | |
| # -------------------------------------------------------- | |
| analyze_button = gr.Button( | |
| "Analyze Sentiment", | |
| variant="primary" | |
| ) | |
| # -------------------------------------------------------- | |
| # Output | |
| # -------------------------------------------------------- | |
| output = gr.Textbox( | |
| label="Analysis Result", | |
| lines=10, | |
| interactive=False | |
| ) | |
| # -------------------------------------------------------- | |
| # Button event | |
| # -------------------------------------------------------- | |
| analyze_button.click( | |
| fn=sentiment_analyzer, | |
| inputs=text_input, | |
| outputs=output | |
| ) | |
| # -------------------------------------------------------- | |
| # Clear button | |
| # -------------------------------------------------------- | |
| gr.ClearButton( | |
| components=[ | |
| text_input, | |
| output | |
| ], | |
| value="Clear" | |
| ) | |
| # ============================================================ | |
| # LAUNCH | |
| # ============================================================ | |
| if __name__ == "__main__": | |
| app.launch() |