|
import spaces |
|
import gradio as gr |
|
import numpy as np |
|
import pandas as pd |
|
import time |
|
|
|
css=""" |
|
#col-left { |
|
margin: 0 auto; |
|
max-width: 640px; |
|
} |
|
#col-right { |
|
margin: 0 auto; |
|
max-width: 640px; |
|
} |
|
.grid-container { |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
gap:10px |
|
} |
|
|
|
.image { |
|
width: 128px; |
|
height: 128px; |
|
object-fit: cover; |
|
} |
|
|
|
.text { |
|
font-size: 16px; |
|
} |
|
""" |
|
emotion_columns = ['admiration', 'amusement', 'anger', 'annoyance', 'approval', |
|
'caring', 'confusion', 'curiosity', 'desire', 'disappointment', |
|
'disapproval', 'disgust', 'embarrassment', 'excitement', 'fear', |
|
'gratitude', 'grief', 'joy', 'love', 'nervousness', 'optimism', |
|
'pride', 'realization', 'relief', 'remorse', 'sadness', 'surprise','neutral'] |
|
|
|
def load_text(text_path: str) -> str: |
|
with open(text_path, 'r', encoding='utf-8') as f: |
|
text = f.read() |
|
|
|
return text |
|
|
|
def select_checkbox(name): |
|
if name =="All": |
|
return gr.CheckboxGroup(value=emotion_columns) |
|
elif name =="None": |
|
return [] |
|
elif name =="Positive": |
|
return ["admiration","amusement","approval","caring","curiosity","desire","excitement","gratitude","joy","love","optimism","pride","relief"] |
|
elif name =="Negative": |
|
return ["anger","annoyance","disappointment","disapproval","disgust","fear","grief","embarrassment","remorse","sadness"] |
|
else: |
|
return ["confusion","nervousness","neutral","realization","surprise"] |
|
def process_datas(checked_emotions,mode="filter",max_data=100,skip_data=0): |
|
checked_emotions = sorted(checked_emotions) |
|
|
|
df = pd.read_parquet("hf://datasets/google-research-datasets/go_emotions/raw/train-00000-of-00001.parquet") |
|
|
|
|
|
def filter_emotions(emotions): |
|
unchecked = emotion_columns.copy() |
|
condition_checked = np.all(df[emotions] == 1, axis=1) |
|
for emotion in checked_emotions: |
|
unchecked.remove(emotion) |
|
condition_unchecked = np.all(df[unchecked] == 0, axis=1) |
|
filtered_df = df[condition_checked & condition_unchecked] |
|
return filtered_df |
|
|
|
def df_to_text(df): |
|
df = df.iloc[skip_data:] |
|
if len(filtered_df) == 0: |
|
return "" |
|
texts=(df.head(max_data)[['text']].to_string(index=False,max_colwidth=None)) |
|
trimmed_texts = [line.strip() for line in texts.split('\n')[1:] if line.strip()] |
|
return "\n".join(trimmed_texts) |
|
|
|
if mode == "filter": |
|
filtered_df = filter_emotions(checked_emotions) |
|
count = (len(filtered_df)) |
|
trimmed_texts = df_to_text(filtered_df) |
|
|
|
last_count = min(count,(skip_data+max_data)) |
|
label = f"{skip_data+1} - {last_count} of {count}" |
|
|
|
label_texts = [f"[{emotion}]" for emotion in checked_emotions] |
|
|
|
output_text = "+".join(label_texts)+"\n"+trimmed_texts |
|
output_label = label |
|
else: |
|
max_data = max(1,int(max_data/len(checked_emotions))) |
|
text_arrays = [] |
|
for emotion in checked_emotions: |
|
text_arrays.append(f"[{emotion}]") |
|
filtered_df = filter_emotions([emotion]) |
|
trimmed_texts = df_to_text(filtered_df) |
|
text_arrays.append(trimmed_texts) |
|
text_arrays.append("\n") |
|
print(text_arrays) |
|
output_text = "\n".join(text_arrays) |
|
output_label = f"{len(checked_emotions)} x {max_data}" |
|
|
|
|
|
return output_text,output_label,",".join(checked_emotions) |
|
|
|
|
|
with gr.Blocks(css=css, elem_id="demo-container") as demo: |
|
with gr.Column(): |
|
gr.HTML(load_text("demo_header.html")) |
|
gr.HTML(load_text("demo_tools.html")) |
|
with gr.Row(): |
|
with gr.Column(): |
|
with gr.Row(equal_height=True): |
|
mode_group = gr.Radio(choices=["filter","list"],label="Mode",value="filter") |
|
selection_name = gr.Dropdown(label="Select",choices=["All","None","Positive","Negative","Neutral"],value="All") |
|
selection_btn= gr.Button("Update Selection") |
|
checkbox_group = gr.CheckboxGroup(choices=emotion_columns,label="Emotions",value=["love"]) |
|
btn= gr.Button("View Data",variant="primary") |
|
with gr.Row(): |
|
max_data = gr.Slider( |
|
label="Max Data", |
|
minimum=0, |
|
maximum=540, |
|
step=10, |
|
value=50,info="returning large data is heavy action,if you need more copy the space") |
|
skip_data = gr.Slider( |
|
label="Skip Data", |
|
minimum=0, |
|
maximum=100000, |
|
step=1, |
|
value=0) |
|
with gr.Column(): |
|
with gr.Row(): |
|
data_size = gr.Textbox(label="Data Count",scale=1) |
|
checked_size = gr.Textbox(label="Checked",scale=2) |
|
|
|
text_out = gr.TextArea(label="Output", elem_id="output-text") |
|
|
|
btn.click(fn=process_datas, inputs=[checkbox_group,mode_group,max_data,skip_data], outputs =[text_out,data_size,checked_size], api_name='infer') |
|
selection_btn.click(fn=select_checkbox,inputs=[selection_name],outputs=[checkbox_group]) |
|
gr.Examples( |
|
examples=[ |
|
|
|
], |
|
inputs=[], |
|
|
|
) |
|
gr.HTML( |
|
gr.HTML(load_text("demo_footer.html")) |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |