Spaces:
Sleeping
Sleeping
| import json | |
| import gradio as gr | |
| from outcome_switch import OutcomeSwitchingDetector, get_sections_text | |
| from outcome_switch.visual import ( | |
| get_article_markdown, | |
| get_highlighted_text, | |
| get_registry_dataframe, | |
| get_sankey_diagram, | |
| ) | |
| _CALCULATED_COSINE_THRESHOLD = 0.44 | |
| _app_description = open("front/app-description.md").read() | |
| _article_id_examples = json.load(open("front/examples.json")) | |
| _pmcid_start_value = _article_id_examples[0] | |
| config = json.load(open('./config.json', 'r')) | |
| # Load Detector (ner and sim model) | |
| osd = OutcomeSwitchingDetector( | |
| config["ner_path"], | |
| config["sim_path"], | |
| config["ner_label2id"] | |
| ) | |
| def controller(article_id:str): | |
| # clean input and run detection | |
| article_id = str(article_id).strip() | |
| output = osd.detect(article_id) | |
| # init outputs | |
| article_markdown=None | |
| article_highlighted_text=None | |
| registry_df=None | |
| similarity_diagram=None | |
| # check whether article markdown can be displayed | |
| if output["db"] is None : | |
| raise gr.Error(f"Wrong format for input id : {article_id}",duration=5, visible=True) | |
| return None, None, None, None | |
| elif output["article_sections"] is None or output["filtered_sections"] is None: | |
| raise gr.Error(f"Could not retrieve text for id {article_id} (id not found in database or abstract/fulltext unavailable on PubMed/PMC)",duration=5, visible=True) | |
| return None, None, None, None | |
| else : | |
| article_markdown = get_article_markdown(article_id, output["article_sections"], output["filtered_sections"]) | |
| # check whether annotations can be displayed | |
| if output["raw_entities"] is not None and output["filtered_sections"] is not None: | |
| original_text = get_sections_text(output["filtered_sections"]) | |
| article_highlighted_text = get_highlighted_text(output["raw_entities"], original_text) | |
| else : | |
| gr.Warning("Could not extract any outcomes entities in article text") | |
| # check whether registry outcomes can be displayed | |
| if output["ctgov_outcomes"] is not None: | |
| registry_df = get_registry_dataframe(output["ctgov_outcomes"]) | |
| else: | |
| gr.Warning("ClinicalTrials.Gov outcomes were not found (either no NCTID detected or no outcomes declared in registry)") | |
| return article_markdown, article_highlighted_text, registry_df, similarity_diagram | |
| # check whether similarity diagram can be displayed | |
| if (output["connections"] is not None and output["raw_entities"] is not None and | |
| output["ctgov_outcomes"] is not None and output["article_outcomes"] is not None): | |
| registry_outcomes_tup = [(outcome["type"], outcome["measure"] + " , " + outcome["timeFrame"]) | |
| for outcome in output["ctgov_outcomes"]] | |
| similarity_diagram = get_sankey_diagram( | |
| registry_outcomes_tup, | |
| output["article_outcomes"], | |
| output["connections"], | |
| output["raw_entities"], | |
| _CALCULATED_COSINE_THRESHOLD | |
| ) | |
| else: | |
| gr.Warning("Could not compute similarity diagram (missing registry or article outcomes)") | |
| return article_markdown, article_highlighted_text, registry_df, similarity_diagram | |
| def clean(): | |
| return None, None, None, None | |
| with gr.Blocks() as blocks: | |
| with gr.Column(): | |
| gr.Markdown('# Outcome Switching Detection \n' + _app_description ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| with gr.Row(): | |
| pmid_input = gr.Textbox(value=_pmcid_start_value, label="PMID or PMCID (PMCID must be preceded by 'PMC' prefix)") | |
| with gr.Row(): | |
| clear_button = gr.ClearButton() | |
| detect_button = gr.Button(value="Detect", variant="primary") | |
| gr.Examples(examples = _article_id_examples, inputs=pmid_input) | |
| gr.Markdown("## Results \n") | |
| with gr.Tabs(): | |
| with gr.TabItem("Article Useful Sections"): | |
| filtered_article = gr.Markdown() | |
| with gr.TabItem("Article Detected Outcomes"): | |
| ner_output = gr.HighlightedText( | |
| color_map={"primary": "lightcoral", "secondary": "lightgreen"}, | |
| show_legend=True, | |
| combine_adjacent=True, | |
| ) | |
| with gr.TabItem("Registry Outcomes"): | |
| ctgov_output = gr.DataFrame() | |
| with gr.TabItem("Similarity"): | |
| similarity_output = gr.Plot(show_label=False) | |
| # OUTPUTS AND BUTTONS | |
| outputs = [filtered_article, ner_output, ctgov_output, similarity_output] | |
| clear_button.add([pmid_input]+outputs) | |
| detect_button.click(fn=controller, inputs=pmid_input, outputs=outputs) | |
| blocks.launch() | |