GEM/DatasetCardForm
9
1import json2import re3 4from datetime import datetime5 6import datacards7 8from datacards import (9 considerations_page,10 considerations_summary,11 context_page,12 context_summary,13 curation_page,14 curation_summary,15 gem_page,16 gem_summary,17 overview_page,18 overview_summary,19 results_page,20 results_summary,21)22 23import streamlit as st24 25##################26## streamlit27##################28st.set_page_config(29 page_title="GEM Data Card Input Form",30 page_icon="https://avatars.githubusercontent.com/u/72612128",31 layout="wide",32 initial_sidebar_state="auto",33)34 35page_description = """36# GEM Data Card Input Form37 38This application was designed for GEM.39 40It allows users to fill out all of the information going into the data documentation when submitting a new dataset.41 42Use the left sidebar to navigate:43- "**Dataset at a Glance**" shows selected information and tracks progress44- Each of the "**Section:**" pages opens a form for a specific section of the card45- Go to "**Review and Save**" when you are done to save your data card46 47Please use **markdown** formatting for each field.48"""49 50_N_FIELDS = datacards.considerations.N_FIELDS + \51 datacards.context.N_FIELDS + \52 datacards.curation.N_FIELDS + \53 datacards.gem.N_FIELDS + \54 datacards.overview.N_FIELDS + \55 datacards.results.N_FIELDS56 57def main():58 if "save_state" not in st.session_state:59 st.session_state.save_state = {}60 61 if "card_dict" not in st.session_state:62 st.session_state.card_dict = {}63 64 st.sidebar.markdown(page_description, unsafe_allow_html=True)65 pages = {66 "Dataset at a Glance": glance_page,67 "Section: Dataset Overview": overview_page,68 "Section: Dataset Curation": curation_page,69 "Section: Dataset in GEM": gem_page,70 "Section: Previous Results": results_page,71 "Section: Considerations for Using Data": considerations_page,72 "Section: Broader Social Context": context_page,73 "Review and Save": review_page,74 }75 app_mode = st.sidebar.radio(76 label="Navigation menu:",77 options=list(pages.keys()),78 index=0,79 )80 with st.sidebar.expander("Save or Load your work"):81 # Save intermediary state82 current_date = datetime.now().strftime(83 "%m/%d/%Y, %H:%M:%S"84 )85 friendly_date = re.sub(86 r"[^\w\s]", "_", current_date87 ).replace(" ", "_").replace("__", "_").replace("-", "")88 st.download_button(89 label="Save Intermediary Card State",90 data=json.dumps(st.session_state.get("card_dict", {}), indent=2),91 file_name=f"data_card_{friendly_date}.json",92 )93 # load from file94 uploaded_file = st.file_uploader(95 label=f"Load Intermediary Card State",96 )97 if uploaded_file is not None:98 pre_card_dict = json.load(uploaded_file, encoding="utf-8")99 def save_dict_to_save_state(saved, prefix=None):100 prefix = [] if prefix is None else prefix101 if isinstance(saved, dict):102 for k, v in saved.items():103 save_dict_to_save_state(v, prefix + [k])104 else:105 if not st.session_state.save_state.get("_".join(prefix) + "_filled", False):106 st.session_state.save_state["_".join(prefix)] = saved107 # TODO: don't overwrite by default108 st.session_state.card_dict = pre_card_dict109 save_dict_to_save_state(st.session_state.card_dict)110 # TODO: delete file after use111 st.markdown("#### GEM Data Card Input Form")112 pages[app_mode]()113 114def glance_page():115 with st.expander("Dataset at a Glance", expanded=True):116 dataset_summary = ""117 dataset_summary += f"- **Dataset Website**: {st.session_state.save_state.get('overview_where_website', '*Go to `Section: Dataset Overview` to fill in*')}\n"118 dataset_summary += f"- **Dataset Contact**: {st.session_state.save_state.get('overview_where_contact-name', '*Go to `Section: Dataset Overview` to fill in*')}\n"119 dataset_summary += f"- **Dataset License**: {st.session_state.save_state.get('overview_languages_license', '*Go to `Section: Dataset Overview` to fill in*')}\n"120 dataset_summary += f"- **Multilingual Dataset**: {st.session_state.save_state.get('overview_languages_is-multilingual', '*Go to `Section: Dataset Overview` to fill in*')}\n"121 dataset_summary += f"- **Dataset Languages**: {st.session_state.save_state.get('overview_languages_language-names', '*Go to `Section: Dataset Overview` to fill in*')}\n"122 dataset_summary += f"- **Dataset Supported Task**: {st.session_state.save_state.get('overview_languages_task', '*Go to `Section: Dataset Overview` to fill in*')}\n"123 dataset_summary += f"- **Communicative Goal**: {st.session_state.save_state.get('overview_languages_communicative', '*Go to `Section: Dataset Overview` to fill in*')}\n"124 dataset_summary += f"- **Language Data Origin**: {st.session_state.save_state.get('curation_language_obtained', '*Go to `Section: Dataset Curation` to fill in*')}\n"125 dataset_summary += f"- **Annotation Data Origin**: {st.session_state.save_state.get('curation_annotations_obtained', '*Go to `Section: Dataset Curation` to fill in*')}\n"126 dataset_summary += f"- **Likelihood of PII**: {st.session_state.save_state.get('curation_pii_has-pii', '*Go to `Section: Dataset Curation` to fill in*')}\n"127 st.markdown(dataset_summary + "---\n")128 num_fields = sum([len(dct) for k in st.session_state.get("card_dict", {}) for dct in st.session_state.card_dict.get(k, {}).values()])129 st.markdown(f"You have currently filled out **{num_fields} of {_N_FIELDS} required fields** in the data card.")130 left_col, right_col = st.columns(2)131 with left_col:132 overview_summary()133 curation_summary()134 gem_summary()135 with right_col:136 results_summary()137 considerations_summary()138 context_summary()139 140def review_page():141 dataset_name = st.text_input(142 label="Enter dataset name here",143 )144 if dataset_name != "":145 friendly_name = re.sub(146 r"[^\w\s]", " ", dataset_name.lower()147 ).strip().replace(" ", "_")148 current_date = datetime.now().strftime(149 "%m/%d/%Y, %H:%M:%S"150 )151 friendly_date = re.sub(152 r"[^\w\s]", "_", current_date153 ).replace(" ", "_").replace("__", "_").replace("-", "")154 dataset_file_name = f"{friendly_name}-{friendly_date}.json"155 st.download_button(156 label=f"Download the Dataset Card below as {dataset_file_name}",157 data=json.dumps(st.session_state.get("card_dict", {}), indent=2),158 file_name=dataset_file_name,159 )160 else:161 st.markdown("##### Enter a dataset name above to be able to download the card!")162 st.markdown("---\n")163 st.write(st.session_state.get("card_dict", {}))164 # TODO add buttons to save and download165 166if __name__ == "__main__":167 main()168 