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 : | |
gr.Warning(f"Wrong format for input id : {article_id}") | |
return None, None, None, None | |
elif output["article_sections"] is None or output["filtered_sections"] is None: | |
gr.Warning(f"Could not retrieve text for id {article_id} (id not found in database or abstract/fulltext unavailable on PubMed/PMC)") | |
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() | |