|
import gradio as gr |
|
import pandas as pd |
|
import numpy as np |
|
|
|
|
|
df = None |
|
|
|
current_row = 0 |
|
|
|
def load_csv(file): |
|
global df |
|
global current_row |
|
|
|
df = pd.read_csv(file.name, dtype={'id':int, 'hs': str, 'cs': str, 'topic': str, 'tone': str, 'isCSContextuallyRelevant': str, 'isToneMatch': str}) |
|
current_row = 0 |
|
row_dict = df.iloc[current_row].to_dict() |
|
return row_dict['id'], row_dict['hs'], row_dict['cs'], row_dict['topic'], row_dict['tone'], row_dict['isCSContextuallyRelevant'], row_dict['isToneMatch'] |
|
|
|
def annotate_row(isCSContextuallyRelevant, isToneMatch): |
|
global df |
|
global current_row |
|
|
|
df.at[current_row, 'isCSContextuallyRelevant'] = isCSContextuallyRelevant |
|
df.at[current_row, 'isToneMatch'] = isToneMatch |
|
|
|
if current_row < len(df) - 1: |
|
current_row += 1 |
|
else: |
|
current_row = 0 |
|
df.to_csv('annotated_data.csv', index=False) |
|
|
|
row_dict = df.iloc[current_row].to_dict() |
|
return row_dict['id'], row_dict['hs'], row_dict['cs'], row_dict['topic'], row_dict['tone'], row_dict['isCSContextuallyRelevant'], row_dict['isToneMatch'], 'annotated_data.csv' |
|
|
|
def navigate(direction): |
|
global current_row |
|
if direction == "Previous": |
|
current_row = max(0, current_row - 1) |
|
elif direction == "Next": |
|
current_row = min(len(df) - 1, current_row + 1) |
|
elif direction == "First Unlabeled": |
|
unlabeled_row = df[df['isCSContextuallyRelevant'].isna()].index.min() |
|
if not np.isnan(unlabeled_row): |
|
current_row = int(unlabeled_row) |
|
|
|
row_dict = df.iloc[current_row].to_dict() |
|
return row_dict['id'], row_dict['hs'], row_dict['cs'], row_dict['topic'], row_dict['tone'], row_dict['isCSContextuallyRelevant'], row_dict['isToneMatch'] |
|
|
|
with gr.Blocks(theme=gr.themes.Soft()) as annotator: |
|
gr.Markdown("## Data Annotation") |
|
|
|
with gr.Row(): |
|
gr.Markdown("### Upload CSV") |
|
file_upload = gr.File() |
|
btn_load = gr.Button("Load CSV") |
|
|
|
with gr.Row(): |
|
gr.Markdown("### Current Row") |
|
with gr.Row(): |
|
idx = gr.Number(label='Index') |
|
hs = gr.Textbox(label='HS') |
|
cs = gr.Textbox(label='CS') |
|
|
|
with gr.Row(): |
|
topic = gr.Textbox(label='Topic') |
|
tone = gr.Textbox(label='Tone') |
|
|
|
with gr.Row(): |
|
isCSContextuallyRelevant = gr.Radio(["1", "0"], label="Contextually Relevant?") |
|
isToneMatch = gr.Radio(["1", "0"], label="Tone Match?") |
|
btn_annotate = gr.Button("Annotate") |
|
|
|
with gr.Row(): |
|
btn_previous = gr.Button("Previous") |
|
btn_next = gr.Button("Next") |
|
btn_first_unlabeled = gr.Button("First Unlabeled") |
|
|
|
with gr.Row(): |
|
gr.Markdown("### Annotated Data File Download") |
|
file_download = gr.File() |
|
|
|
btn_load.click(load_csv, inputs=[file_upload], outputs=[idx, hs, cs, topic, tone, isCSContextuallyRelevant, isToneMatch], scroll_to_output=True) |
|
btn_annotate.click(annotate_row, inputs=[isCSContextuallyRelevant, isToneMatch], outputs=[idx, hs, cs, topic, tone, isCSContextuallyRelevant, isToneMatch, file_download]) |
|
btn_previous.click(navigate, inputs=gr.Textbox("Previous", visible=False), outputs=[idx, hs, cs, topic, tone, isCSContextuallyRelevant, isToneMatch]) |
|
btn_next.click(navigate, inputs=gr.Textbox("Next", visible=False), outputs=[idx, hs, cs, topic, tone, isCSContextuallyRelevant, isToneMatch]) |
|
btn_first_unlabeled.click(navigate, inputs=gr.Textbox("First Unlabeled", visible=False), outputs=[idx, hs, cs, topic, tone, isCSContextuallyRelevant, isToneMatch]) |
|
|
|
annotator.launch() |