File size: 4,218 Bytes
ebc6394
 
df6a94f
 
 
 
 
ebc6394
882d1dd
273b099
80d4bd4
ebc6394
 
 
 
 
882d1dd
ebc6394
 
882d1dd
 
 
df6a94f
ebc6394
 
 
 
 
 
 
df6a94f
 
ebc6394
 
882d1dd
ebc6394
 
 
 
 
 
df6a94f
ebc6394
 
 
882d1dd
ebc6394
 
 
df6a94f
 
 
 
 
 
 
 
 
 
 
 
 
ebc6394
df6a94f
 
 
 
 
 
 
ebc6394
df6a94f
 
 
 
 
 
 
ebc6394
df6a94f
 
882d1dd
df6a94f
 
 
 
 
 
882d1dd
df6a94f
 
 
 
 
 
 
882d1dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import streamlit as st
from transformers import pipeline
import nltk
import numpy as np

# Download NLTK data for sentence tokenization
nltk.download('punkt')

# Load the Hugging Face pipelines
classifier = pipeline("zero-shot-classification", model="MoritzLaurer/DeBERTa-v3-base-mnli-fever-anli")
sentiment_analyzer = pipeline("sentiment-analysis", model="SarahMakk/CustomModel_amazon_sentiment_moshew_128_10k")

# Define the categories for customer feedback
CATEGORIES = ["Pricing", "Feature", "Customer Service", "Delivery", "Quality"]

# Streamlit app UI
st.title("Customer Feedback Categorization with Sentiment Analysis")
st.markdown(
    """
    This app uses Hugging Face models to detect the topics and intent of customer feedback
    and determine the sentiment (positive or negative) for each relevant category.
    A single feedback may belong to multiple categories, such as Pricing, Feature, and Customer Service.
    The feedback is split into sentences, and each sentence is categorized and analyzed for sentiment.
    """
)

# Input text box for customer feedback
feedback_input = st.text_area(
    "Enter customer feedback:",
    placeholder="Type your feedback here...",
    height=200,
    value="I was shocked to see the price tag on this new gadget—it’s way too expensive for what it offers, especially compared to competitors! Despite the issues I faced with my order, the customer service team's effort to rectify the situation was commendable, though their follow-up could have used some improvement for full satisfaction."
)

# Confidence threshold for zero-shot classification
threshold = st.slider(
    "Confidence Threshold",
    min_value=0.0,
    max_value=1.0,
    value=0.2,
    step=0.05,
    help="Categories with confidence scores above this threshold will be displayed."
)

# Classify button
if st.button("Classify Feedback"):
    if not feedback_input.strip():
        st.error("Please provide valid feedback text.")
    else:
        # Split the feedback into sentences
        sentences = nltk.sent_tokenize(feedback_input)
        if not sentences:
            st.error("Could not split feedback into sentences.")
            st.stop()

        # Dictionary to store results for each category
        category_results = {category: [] for category in CATEGORIES}

        # Process each sentence
        for sentence in sentences:
            # Perform zero-shot classification on the sentence
            classification_result = classifier(sentence, CATEGORIES, multi_label=True)

            # Get categories with scores above the threshold
            for label, score in zip(classification_result["labels"], classification_result["scores"]):
                if score >= threshold:
                    # Perform sentiment analysis on the sentence
                    sentiment_result = sentiment_analyzer(sentence)
                    sentiment_label = sentiment_result[0]["label"]
                    sentiment_score = round(sentiment_result[0]["score"], 4)

                    # Store the result for the category
                    category_results[label].append({
                        "sentence": sentence,
                        "confidence": round(score, 4),
                        "sentiment": sentiment_label,
                        "sentiment_score": sentiment_score
                    })

        # Display the results
        st.subheader("Categorized Feedback with Sentiment Analysis")

        # Flag to check if any categories were found
        found_categories = False

        for category, results in category_results.items():
            if results:  # If the category has any sentences
                found_categories = True
                st.write(f"### **{category}**")
                for result in results:
                    st.write(f"- **Sentence**: {result['sentence']}")
                    st.write(f"  - Confidence: {result['confidence']}")
                    st.write(f"  - Sentiment: {result['sentiment']} (Score: {result['sentiment_score']})")
                st.write("")  # Add a blank line for readability

        if not found_categories:
            st.warning("No categories matched the selected confidence threshold.")