|
|
|
|
|
import gradio as gr |
|
import re |
|
|
|
|
|
positive_keywords = [] |
|
classification_history = [] |
|
|
|
def parse_rule(rule_text): |
|
""" |
|
Parse the comma-separated string of positive words, e.g. "amazing, good". |
|
Store them in a global list as lowercase. |
|
""" |
|
global positive_keywords |
|
|
|
if rule_text.strip(): |
|
words = [w.strip().lower() for w in rule_text.split(',')] |
|
positive_keywords = words |
|
else: |
|
positive_keywords = [] |
|
|
|
def rule_based_classify(text, positive_words): |
|
""" |
|
If the text contains ANY of the words in positive_words, |
|
classify as Positive; otherwise Negative. |
|
""" |
|
lowered = text.lower() |
|
for word in positive_words: |
|
if word in lowered: |
|
return "Positive" |
|
return "Negative" |
|
|
|
def classify_with_rule(rule_input, statement): |
|
""" |
|
1) Parse the user-defined rule (comma-separated keywords). |
|
2) Classify the statement with the updated rule. |
|
3) Append to classification history and return an HTML table. |
|
""" |
|
global classification_history |
|
|
|
|
|
parse_rule(rule_input) |
|
|
|
|
|
if statement.strip(): |
|
label = rule_based_classify(statement, positive_keywords) |
|
classification_history.append((statement, label)) |
|
else: |
|
|
|
label = None |
|
|
|
|
|
html_table = """ |
|
<table style="border-collapse: collapse;"> |
|
<tr> |
|
<th style="border:1px solid #ccc; padding:8px;">Statement</th> |
|
<th style="border:1px solid #ccc; padding:8px;">Classification</th> |
|
</tr> |
|
""" |
|
for stmt, cls in classification_history: |
|
color = "green" if cls == "Positive" else "red" |
|
html_table += f""" |
|
<tr> |
|
<td style="border:1px solid #ccc; padding:8px;">{stmt}</td> |
|
<td style="border:1px solid #ccc; padding:8px; color:{color};"><b>{cls}</b></td> |
|
</tr> |
|
""" |
|
html_table += "</table>" |
|
|
|
explanation = """ |
|
<br> |
|
<h4>Discussion (Rule-Based AI):</h4> |
|
<ul> |
|
<li><b>Pros:</b> You decide the keywords. If they're present, it's "Positive." Otherwise "Negative."</li> |
|
<li><b>Cons:</b> If your sentence doesn't contain <i>exactly</i> those keywords, it gets classified incorrectly. |
|
Real-world language has many synonyms and nuances that this rule won't catch.</li> |
|
</ul> |
|
""" |
|
|
|
|
|
return html_table + explanation |
|
|
|
|
|
demo = gr.Interface( |
|
fn=classify_with_rule, |
|
inputs=[ |
|
gr.Textbox(label="Define Rule (comma-separated positive words)", lines=1), |
|
gr.Textbox(label="Statement to Classify", lines=2) |
|
], |
|
outputs=gr.HTML(label="Classification History"), |
|
title="Traditional Rule-Based AI Demo", |
|
css="footer{display:none !important}", |
|
description=( |
|
"1) In the first box, type comma-separated words you consider 'positive'.\n" |
|
"2) In the second box, type a statement to classify.\n" |
|
"Click 'Submit' to see how the statement is labeled.\n\n" |
|
"You'll see a growing table of all statements you've classified so far." |
|
) |
|
) |
|
|
|
|
|
demo.launch() |
|
|