You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit标注问卷应用问题:食材对标注逻辑不符合预期

食材配对标注Streamlit应用修复方案

问题根源

Streamlit是脚本式执行机制,默认循环会一次性跑完所有迭代,不会等待用户交互,导致所有配对同时渲染,大数据量下体验崩溃。必须用st.session_state持久化状态,实现分步交互。

完整实现代码

import streamlit as st
import itertools
import pandas as pd
import matplotlib.pyplot as plt

# 食材样本数据
ingredients = ["鸡蛋", "番茄", "黄瓜", "牛肉", "土豆", "青椒"]

# 初始化Session State状态
if "pairings" not in st.session_state:
    st.session_state.pairings = list(itertools.combinations(ingredients, 2))
if "current_idx" not in st.session_state:
    st.session_state.current_idx = 0
if "annotations" not in st.session_state:
    st.session_state.annotations = []

total_pairings = len(st.session_state.pairings)

# 标注流程控制
if st.session_state.current_idx < total_pairings:
    current_pair = st.session_state.pairings[st.session_state.current_idx]
    st.subheader(f"标注配对 {st.session_state.current_idx + 1}/{total_pairings}")
    st.write(f"食材组合:{current_pair[0]} + {current_pair[1]}")
    
    # 标注选项(可根据需求自定义)
    label = st.selectbox(
        "请选择配对适配程度",
        ["完全不适合", "不太适合", "一般", "比较适合", "非常适合"],
        key=f"label_{st.session_state.current_idx}"
    )
    
    col1, col2 = st.columns(2)
    with col1:
        if st.button("保存并进入下一组"):
            st.session_state.annotations.append({
                "食材1": current_pair[0],
                "食材2": current_pair[1],
                "标注结果": label
            })
            st.session_state.current_idx += 1
            st.rerun()  # 刷新页面加载下一组
    with col2:
        if st.button("跳过当前组"):
            st.session_state.current_idx += 1
            st.rerun()

# 标注完成后展示结果
else:
    st.success("所有配对标注完成!")
    df = pd.DataFrame(st.session_state.annotations)
    
    # 展示标注数据
    st.subheader("标注结果详情")
    st.dataframe(df)
    
    # 提供CSV下载
    csv = df.to_csv(index=False).encode("utf-8")
    st.download_button(
        label="下载标注数据",
        data=csv,
        file_name="食材配对标注结果.csv",
        mime="text/csv"
    )
    
    # 生成统计图表
    st.subheader("标注结果统计")
    fig, ax = plt.subplots()
    df["标注结果"].value_counts().plot(kind="bar", ax=ax)
    ax.set_xlabel("适配程度")
    ax.set_ylabel("配对数量")
    ax.set_title("食材配对适配度分布")
    st.pyplot(fig)

关键功能说明

  • 状态持久化:通过st.session_state保存配对列表、当前标注位置、已标注数据,避免每次交互丢失进度
  • 分步标注:仅渲染当前需要标注的配对,完成后更新索引并刷新页面,保证页面简洁
  • 结果导出:将标注数据转为CSV格式提供下载,方便后续分析
  • 可视化统计:用柱状图展示各适配程度的配对数量,直观呈现标注结果

内容的提问来源于stack exchange,提问作者PeCaDe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:10:08