import streamlit as st # 存储标注信息 if "annotations" not in st.session_state: st.session_state.annotations = [] # 添加标注 def add_annotation(selected_text, label): start_idx = text.find(selected_text) if start_idx != -1: end_idx = start_idx + len(selected_text) st.session_state.annotations.append( {"text": selected_text, "label": label, "start": start_idx, "end": end_idx}) # 移除标注 def remove_annotation(annotation): st.session_state.annotations = [ ann for ann in st.session_state.annotations if ann != annotation ] # 生成带按钮的高亮文本 def render_highlighted_text(text, annotations): annotated_text = [] last_idx = 0 for idx, ann in enumerate(sorted(annotations, key=lambda x: x["start"])): # 添加非标注的部分 annotated_text.append(text[last_idx:ann["start"]]) # 添加标注的按钮 if st.button(f"{ann['text']} ({ann['label']})", key=f"annotation-{idx}"): st.session_state.clicked_annotation = ann last_idx = ann["end"] # 添加剩余的部分 annotated_text.append(text[last_idx:]) return "".join(annotated_text) # 主界面 st.title("文本标注工具") st.write("输入文本并对其中的部分内容进行标注。") # 输入文本 text = st.text_area("输入文本:", height=200) # 文本选择与标注 if text: st.write("选中文字并进行标注:") col1, col2 = st.columns([3, 1]) # 输入标注的标签 with col1: selected_text = st.text_input("选中的文本:") with col2: label = st.text_input("标签:") if st.button("添加标注"): if selected_text and label and selected_text in text: add_annotation(selected_text, label) else: st.warning("请选择有效的文本并输入标签!") # 渲染高亮文本 st.markdown(render_highlighted_text(text, st.session_state.annotations)) # 点击标注的文本 if "clicked_annotation" in st.session_state: clicked_annotation = st.session_state.clicked_annotation st.write( f"你点击了: **{clicked_annotation['text']}** (标签: {clicked_annotation['label']})") if st.button("删除标注", key="delete"): remove_annotation(clicked_annotation) del st.session_state.clicked_annotation