import gradio as gr from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline import pandas as pd import util import folium # Model names (replace with your actual Hugging Face repo names) MODEL_NAMES = { "BioBERT": "nattkorat/biobert-base-uncased-ner", "SciBERT": "nattkorat/scibert-base-uncased-ner", "BERT": "nattkorat/bert-base-uncased-ner" } # Cache loaded models to avoid reloading every time loaded_models = {} def load_model(model_key): model_name = MODEL_NAMES[model_key] if model_name not in loaded_models: tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForTokenClassification.from_pretrained(model_name) ner = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="average") loaded_models[model_name] = ner return loaded_models[model_name] def extract_entities(model_choice, text): ner = load_model(model_choice) entities = ner(text) if not entities: return pd.DataFrame(columns=["outbreak", "cases", "deaths", "date", "location", "latitude", "longtitude"]) data = {} for ent in entities: if ent['entity_group'] == 'VIRUS': data['outbreak'] = ent['word'] elif ent['entity_group'] == 'CASES': data['cases'] = ent['word'] elif ent['entity_group'] == 'DEATHS': data['deaths'] = ent['word'] elif ent['entity_group'] == 'DATE': data['date'] = util.parse_date(ent['word']) elif ent['entity_group'] == 'COUNTRY': location_info = util.get_location(ent['word']) data['location'] = location_info['name'] data['latitude'] = location_info['latitude'] data['longtitude'] = location_info['longitude'] m = None if 'latitude' in data: m = folium.Map(location=[data['latitude'], data['longtitude']]) info = f"""

Outbreak Information

Location: {data.get('location', 'N/A')}
Outbreak: {data.get('outbreak', 'N/A')}
Cases: {data.get('cases', 'N/A')}
Deaths: {data.get('deaths', 'N/A')}
Date: {data.get('date', 'N/A')}
Location: {data.get('location', 'N/A')} """ folium.Marker( location=[data['latitude'], data['longtitude']], popup=info, icon=folium.Icon(icon="warning", color="red"), ).add_to(m) return pd.DataFrame([data]), m._repr_html_() # Sample example texts for testing examples = [ ["Outbreak of Ebola occurred in Congo on 2007-09-11, with confirmed 372 cases and 166 deaths."], ["Outbreak of Avian influenza occurred in The Netherlands on 2010-12-09, with confirmed 1 cases and 141 deaths."], ["Cholera occurred in Mozambique on 1998-08-14, with confirmed 26783 cases and 619 deaths."] ] # Gradio Interface with gr.Blocks() as demo: gr.Markdown("## Outbreak Extraction DEMO") gr.Markdown("Select a model, enter text, and see extracted entities below:") with gr.Row(): model_dropdown = gr.Dropdown(choices=list(MODEL_NAMES.keys()), label="Select Model", value="BioBERT") text_input = gr.Textbox(label="Input Text", placeholder="Enter your sentence here...", lines=4) gr.Examples( examples=examples, inputs=[text_input], label="Try Examples", ) run_button = gr.Button("Extract Entities") output_table = gr.Dataframe(headers=["outbreak", "cases", "deaths", "date", "location", "latitude", "longtitude"], interactive=False) output_map = gr.HTML(label="Map") run_button.click(fn=extract_entities, inputs=[model_dropdown, text_input], outputs=[output_table, output_map]) demo.launch()