File size: 4,941 Bytes
cbcd78b
1ea874c
be195b7
 
4530b74
be195b7
 
 
 
cbcd78b
be195b7
 
 
1ea874c
be195b7
 
 
 
 
 
1ea874c
be195b7
 
67df231
3fac692
67df231
cbcd78b
67df231
0a5100e
67df231
 
9d03f28
3fac692
67df231
3fac692
 
67df231
3fac692
cbcd78b
 
 
67df231
 
9d03f28
67df231
 
 
 
a025564
511d4e8
a025564
 
 
 
 
 
 
be195b7
a025564
 
 
 
 
 
 
 
 
 
 
 
511d4e8
67df231
9d32e7a
 
 
c00c984
80cfb3b
67df231
 
 
 
be195b7
 
 
67df231
 
1ea874c
 
be195b7
67df231
be195b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67df231
be195b7
67df231
a025564
67df231
 
 
 
 
c00c984
67df231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cbcd78b
511d4e8
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
from transformers import pipeline
import pandas as pd
import spaces

# Load dataset
from datasets import load_dataset
ds = load_dataset('ZennyKenny/demo_customer_nps')
df = pd.DataFrame(ds['train'])

# Initialize model pipeline
from huggingface_hub import login
import os

# Login using the API key stored as an environment variable
hf_api_key = os.getenv("API_KEY")
login(token=hf_api_key)

classifier = pipeline("text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english")
generator = pipeline("text2text-generation", model="google/flan-t5-base")

# Function to classify customer comments
@spaces.GPU
def classify_comments(categories):
    sentiments = []
    assigned_categories = []
    for comment in df['customer_comment']:
        # Classify sentiment
        sentiment = classifier(comment)[0]['label']
        # Generate category
        category_str = ', '.join(categories)
        prompt = f"What category best describes this comment? '{comment}' Please answer using only the name of the category: {category_str}."
        category = generator(prompt, max_length=30)[0]['generated_text']
        assigned_categories.append(category)
        sentiments.append(sentiment)
    df['comment_sentiment'] = sentiments
    df['comment_category'] = assigned_categories
    return df[['customer_comment', 'comment_sentiment', 'comment_category']].to_html(index=False)

# Gradio Interface
with gr.Blocks() as nps:
    # State to store categories
    categories = gr.State([])

    # Function to add a category
    def add_category(categories, new_category):
        if new_category.strip() != "" and len(categories) < 5:  # Limit to 5 categories
            categories.append(new_category.strip())
        return categories, "", f"**Categories:**\n" + "\n".join([f"- {cat} πŸ—‘οΈ" for cat in categories])

    # Function to remove a category
    def remove_category(categories, category_to_remove):
        if category_to_remove in categories:
            categories.remove(category_to_remove)
        return categories, f"**Categories:**\n" + "\n".join([f"- {cat} πŸ—‘οΈ" for cat in categories])

    # Function to display categories with remove buttons
    def display_categories(categories):
        category_rows = []
        for cat in categories:
            with gr.Row():
                gr.Markdown(f"- {cat}")
                remove_btn = gr.Button("πŸ—‘οΈ", elem_id=f"remove_{cat}")
                remove_btn.click(
                    fn=remove_category,
                    inputs=[categories, gr.State(cat)],
                    outputs=[categories, category_status]
                )
            category_rows.append(gr.Row())
        return category_rows

    # UI for adding categories
    with gr.Row():
        category_input = gr.Textbox(label="New Category", placeholder="Enter category name")
        add_category_btn = gr.Button("Add Category")
        category_status = gr.Markdown("**Categories:**\n- None")

    # Display added categories
    category_display = gr.Column(visible=False)

    # File upload and template buttons
    uploaded_file = gr.File(label="Upload CSV", type="filepath")
    template_btn = gr.Button("Use Template")
    gr.Markdown("# NPS Comment Categorization")

    # Classify button
    classify_btn = gr.Button("Classify Comments")
    output = gr.HTML()

    # Function to load data from uploaded CSV
    def load_data(file):
        if file is not None:
            file.seek(0)  # Reset file pointer
            if file.name.endswith('.csv'):
                custom_df = pd.read_csv(file, encoding='utf-8')
            else:
                return "Error: Uploaded file is not a CSV."
            if 'customer_comment' not in custom_df.columns:
                return "Error: Uploaded CSV must contain a column named 'customer_comment'"
            global df
            df = custom_df
            return "Custom CSV loaded successfully!"
        else:
            return "No file uploaded."

    # Function to use template categories
    def use_template():
        template_categories = ["Product Experience", "Customer Support", "Price of Service", "Other"]
        return template_categories, f"**Categories:**\n" + "\n".join([f"- {cat} πŸ—‘οΈ" for cat in template_categories])

    # Event handlers
    add_category_btn.click(
        fn=add_category,
        inputs=[categories, category_input],
        outputs=[categories, category_input, category_status]
    )
    categories.change(
        fn=display_categories,
        inputs=categories,
        outputs=category_display
    )
    uploaded_file.change(
        fn=load_data,
        inputs=uploaded_file,
        outputs=output
    )
    template_btn.click(
        fn=use_template,
        outputs=[categories, category_status]
    )
    classify_btn.click(
        fn=classify_comments,
        inputs=categories,
        outputs=output
    )

nps.launch(share=True)