Spaces:
Running
Running
import streamlit as st | |
from streamlit_agraph import agraph, Node, Edge, Config | |
from streamlit_text_label import label_select | |
from app_logic import * | |
def display_entity_selections(selections): | |
"""Display entity selections in a grid layout""" | |
st.subheader("Selected Entities:") | |
# 使用columns来水平排列按钮 | |
cols = st.columns(4) # 每行4个按钮 | |
for i, entity in enumerate(selections): | |
col_idx = i % 4 | |
with cols[col_idx]: | |
if st.button( | |
f"{entity.text} ({entity.labels[0]})", | |
key=f"entity_{i}", | |
help=f"Start: {entity.start}, End: {entity.end}" | |
): | |
st.session_state.selected_entity = entity | |
def create_graph(entities, relations): | |
"""Create entity relationship graph""" | |
nodes_dict = {} | |
nodes = [] | |
for entity in entities: | |
if entity.text not in nodes_dict: | |
node = Node( | |
id=entity.text, | |
label=f"{entity.text}\n({entity.labels[0]})", | |
size=25, | |
color=get_label_color(entity.labels[0]) | |
) | |
nodes.append(node) | |
nodes_dict[entity.text] = node | |
edges = [] | |
for relation in relations: | |
if relation.source.text in nodes_dict and relation.target.text in nodes_dict: | |
edge = Edge( | |
source=relation.source.text, | |
target=relation.target.text, | |
label=relation.label, | |
color="#666666" | |
) | |
edges.append(edge) | |
config = Config( | |
width=750, | |
height=500, | |
directed=True, | |
physics=True, | |
hierarchical=False, | |
nodeHighlightBehavior=True, | |
highlightColor="#F7A7A6", | |
) | |
return agraph(nodes=nodes, edges=edges, config=config) | |
def setup_report_selection(): | |
"""Setup report selection columns and return selected report""" | |
col1, col2 = st.columns(2) | |
with col1: | |
st.subheader("Reports to Review") | |
unreviewed_reports = [ | |
report_id for report_id, content in st.session_state.reports_json.items() | |
if 'reviewed' not in content | |
] | |
selected_report = st.selectbox( | |
"Select Report", | |
unreviewed_reports, | |
key="unreviewed" | |
) | |
with col2: | |
st.subheader("Reviewed Reports") | |
reviewed_reports = [ | |
report_id for report_id, content in st.session_state.reports_json.items() | |
if content.get('reviewed', False) | |
] | |
st.selectbox( | |
"Completed Reports", | |
reviewed_reports if reviewed_reports else ['None'], | |
key="reviewed" | |
) | |
return selected_report | |
def display_report_content(report_data): | |
"""Display the report text content""" | |
st.subheader("Report Content:") | |
if isinstance(report_data, dict): | |
st.markdown(report_data['text']) | |
else: | |
st.markdown(report_data) | |
def display_entities(report_text, entities): | |
"""Setup and display entity annotation interface""" | |
st.subheader("Entity Annotation:") | |
selections = label_select( | |
body=report_text, | |
labels=list(set(e.labels[0] for e in entities)), | |
selections=entities, | |
) | |
# 显示实体选择 | |
display_entity_selections(selections) | |
return selections | |
def display_relationship_graph(entities: list[Selection], entities_data: dict): | |
"""Display the relationship graph""" | |
st.subheader("Entity Relationship Graph:") | |
relations = find_relations_with_entities(entities, entities_data) | |
create_graph(entities, relations) | |
def handle_review_submission(selected_report, selections, entities_data): | |
"""Handle the review submission process""" | |
if st.button("Mark as Reviewed"): | |
updated_entities = selection2entities(selections) | |
for entity_id, entity in updated_entities.items(): | |
if entity_id in entities_data: | |
entity['relations'] = entities_data[entity_id]['relations'] | |
st.session_state.reports_json[selected_report]['reviewed'] = { | |
'entities': updated_entities | |
} | |
file_path = 'mockedReports.json' | |
save_data(file_path, st.session_state.reports_json) | |
st.success("Review status saved!") | |
st.rerun() | |
def setup_input_selection(): | |
"""设置输入方式选择""" | |
st.subheader("Select Input Method") | |
input_method = st.radio( | |
"Select Input Method", | |
["Select from Dataset", "Manual Text Input"], | |
key="input_method" | |
) | |
if input_method == "Manual Text Input": | |
user_text = st.text_area( | |
"Please Input Radiology Report Text", | |
height=200, | |
placeholder="Enter report text here...", | |
key="user_input_text" | |
) | |
if st.button("Analyze Text"): | |
return {"type": "user_input", "text": user_text} | |
else: | |
return {"type": "dataset"} | |
return None | |