Spaces:
Running
on
Zero
Running
on
Zero
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) |