Streamlit文本标注界面优化:实现逐次显示文本而非一次性展示
实现单条文本逐步标注的Streamlit界面
修改后的完整代码
import streamlit as st import pandas as pd st.title('Text Annotation') # 初始化会话状态,持久化标注进度与结果 if 'current_idx' not in st.session_state: st.session_state.current_idx = 0 st.session_state.annotated_texts = [] st.session_state.annotated_labels = [] # 读取数据(可直接替换为文本列表,如texts = ["文本1", "文本2"...]) df = pd.read_excel('mini_annotation.xlsx') total_texts = len(df) # 标注未完成时显示当前文本 if st.session_state.current_idx < total_texts: current_text = df.iloc[st.session_state.current_idx]['Text'] st.write(f"Text {st.session_state.current_idx + 1} out of {total_texts}") st.write("请对以下文本分类:") st.write(current_text) # 为下拉框添加唯一key,避免重复组件报错 label = st.selectbox( "分类选项:", ["HOF", "NOT", "Not Sure"], key=f"label_select_{st.session_state.current_idx}" ) if st.button("提交标注"): # 保存当前标注结果 st.session_state.annotated_texts.append(current_text) st.session_state.annotated_labels.append(label) # 切换到下一条文本并刷新页面 st.session_state.current_idx += 1 st.rerun() else: st.write("所有文本标注已完成!") # 生成并提供标注结果下载 if st.session_state.annotated_texts: df_annotated = pd.DataFrame({ 'Text': st.session_state.annotated_texts, 'Label': st.session_state.annotated_labels }) st.download_button( label="下载标注文件", data=df_annotated.to_csv(sep=";", index=False), file_name="annotated_file.csv", mime="text/csv" )
核心修改说明
- 会话状态(session_state):用来保存当前标注的索引、已标注文本和标签,解决Streamlit页面刷新后状态丢失的问题,确保每次只显示当前待标注文本。
- 单条渲染逻辑:仅在当前索引小于总文本数时渲染对应内容,标注完成后切换到完成提示与下载功能。
- 唯一组件Key:给下拉框添加带当前索引的key,避免页面刷新时出现重复组件的报错。
- 提交后即时切换:点击提交按钮后,立即保存标注结果、更新索引并刷新页面,直接显示下一条文本。
- 结果下载优化:用
st.download_button替代本地直接保存,符合Streamlit的Web交互逻辑,让用户可以自行下载标注文件。
内容的提问来源于stack exchange,提问作者Maxl Gemeinderat
相关产品推荐
相关产品推荐

