import gradio as gr import pandas as pd import numpy as np # Global variable to store the DataFrame df = None # Global variable to keep track of the current row index current_row = 0 def load_csv(file): global df global current_row # import the csv and set the data types to be int, string, string, string, string, string, string 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]) 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()