使用Streamlit构建多标签数据集标注界面遇异常求助
Streamlit多标签标注界面问题修复思路
问题根源
- 状态未持久化:Streamlit每次交互都会重新执行整个脚本,你没有把「当前选中的标签」「已标注数据」存入
st.session_state,导致每次点击多选框时,选中状态丢失,脚本重跑后出现类似跳转下一条记录的错误表现。 - 标注逻辑错误:
annotated_data是每次脚本重跑时新建的空列表,无法累积标注数据;点击Save时先切换记录再处理标注,导致当前标签未被正确保存。 - Session State初始化不全:初始只初始化了剩余记录和当前记录,缺少已标注数据、当前选中标签的初始化。
修复方案
把所有需要跨交互保留的状态存入st.session_state,调整标注流程为「选标签→点击Save保存并切换记录」,具体修改如下:
import pandas as pd import streamlit as st def save_data(data): # 补充你的保存逻辑,比如存储为pickle文件 pd.DataFrame(data).to_pickle("annotated.pkl") # 初始化Session State:所有需要持久化的状态都在这里 if "remaining_records" not in st.session_state: df = pd.read_pickle("unlabeled.pkl") st.session_state.remaining_records = df.to_dict("records") st.session_state.current_record = st.session_state.remaining_records[0] if st.session_state.remaining_records else None st.session_state.annotated_data = [] st.session_state.selected_labels = [] # 保存当前选中的标签 if st.session_state.current_record: # 提取当前记录的内容 available_labels = st.session_state.current_record["labels"] example = st.session_state.current_record["example"] text = st.session_state.current_record["text"] # 渲染展示内容 demo = "\n".join([f"- {ee}" for ee in example]) st.write(f"# Example\n{demo}\n# Output\n- {text}") # 多选框:从Session State读取当前选中的标签,确保状态保留 st.session_state.selected_labels = st.multiselect( label="Select Labels", options=available_labels, default=st.session_state.selected_labels # 默认值设为之前选中的标签 ) st.write('You Selected:', st.session_state.selected_labels) # 点击Save时的逻辑:先保存标注,再切换记录 if st.button("Save"): # 将当前记录和选中标签存入已标注数据 st.session_state.annotated_data.append({ **st.session_state.current_record, "label": st.session_state.selected_labels }) # 移除当前记录,切换到下一条 st.session_state.remaining_records.remove(st.session_state.current_record) st.session_state.current_record = st.session_state.remaining_records[0] if st.session_state.remaining_records else None # 清空当前选中标签,准备下一条标注 st.session_state.selected_labels = [] # 每50条保存一次 if len(st.session_state.annotated_data) % 50 == 0: save_data(st.session_state.annotated_data) # 脚本结束时保存所有已标注数据(避免中途丢失) if st.session_state.annotated_data: save_data(st.session_state.annotated_data)
关键改动说明
- 新增
remaining_records存储剩余未标注记录,避免直接修改原始列表导致的状态混乱。 - 用
st.session_state.selected_labels持久化当前选中的标签,多选框默认值设为该状态,确保交互时选中状态不丢失。 - 调整
Save按钮逻辑:先保存当前标注,再切换记录,最后清空选中标签状态。 - 把
annotated_data存入Session State,确保标注数据可以跨交互累积。
内容的提问来源于stack exchange,提问作者Mr.Robot
相关产品推荐
相关产品推荐

