Home > Blockchain >  Streamlit: Display Text after text, not all at once
Streamlit: Display Text after text, not all at once

Time:01-26

I want to build a data annotation interface. I read in an excel file, where only a text column is relevant. So "df" could also be replaced by a list of texts. This is my code:

import streamlit as st
import pandas as pd
import numpy as np

st.title('Text Annotation')

df = pd.read_excel('mini_annotation.xlsx')

for i in range(len(df)):
    text = df.iloc[i]['Text']

    st.write(f"Text {i} out of {len(df)}")
    st.write("Please classify the following text:")
    st.write("")
    st.write(text)

    text_list = []
    label_list = []

    label = st.selectbox("Classification:", ["HOF", "NOT","Not Sure"])
    if st.button("Submit"):
        text_list.append(text)
        label_list.append(label)

    df_annotated = pd.DataFrame(columns=['Text', 'Label'])
    df_annotated["Text"] = text_list
    df_annotated["Label"] = label_list

df_annotated.to_csv("annotated_file.csv", sep=";")

The interface looks like this: enter image description here

However, I want the interface to display just one text, e.g. the first text of my dataset. After the user has submitted his choice via the "Submit" button, I want the first text to be gone and the second text should be displayed. This process should continue until the last text of the dataset is reached. How do I do this? (I am aware of the Error message, for this I just have to add a key to the selectbox, but I am not sure if this is needed in the end)

CodePudding user response:

This task is solved with the help of the session state. U can read about it here: session state

import streamlit as st
import pandas as pd
import numpy as np

st.title('Text Annotation')

df = pd.DataFrame(['Text 1', 'Text 2', 'Text 3', 'Text 4'], columns=['Text'])

if st.session_state.get('count') is None:
    st.session_state.count = 0
    st.session_state.label_list = []

with st.form("my_form"):
    st.write("Progress: ", st.session_state.count, "/", len(df))
    if st.session_state.count < len(df):
        st.write(df.iloc[st.session_state.count]['Text'])
        label = st.selectbox("Classification:", ["HOF", "NOT","Not Sure"])
        submitted = st.form_submit_button("Submit")
        if submitted:
            st.session_state.label_list.append(label)
            st.session_state.count  = 1
    else:
        st.write("All done!")
        submitted = st.form_submit_button("Submit")
        if submitted:
            st.write(st.session_state.label_list)
  • Related