import streamlit as st
st.set_page_config(
layout="wide", # Can be "centered" or "wide". In the future also "dashboard", etc.
initial_sidebar_state="auto", # Can be "auto", "expanded", "collapsed"
page_title='ZShot', # String or None. Strings get appended with "• Streamlit".
page_icon='./logo_zshot.png', # String, anything supported by st.image, or None.
)
import os
import sys
import warnings
import spacy
from zshot.linker import LinkerSMXM, LinkerTARS, LinkerRegen
from zshot.utils.data_models import Entity
from zshot.mentions_extractor import MentionsExtractorSpacy
from zshot.mentions_extractor.utils import ExtractorType
from zshot import PipelineConfig, displacy
sys.path.append(os.path.abspath('./'))
import streamlit_apps_config as config
warnings.simplefilter('ignore')
## Marking down NER Style
st.markdown(config.STYLE_CONFIG, unsafe_allow_html=True)
########## To Remove the Main Menu Hamburger ########
hide_menu_style = """
"""
st.markdown(hide_menu_style, unsafe_allow_html=True)
########## Side Bar ########
## loading logo(newer version with href)
import base64
@st.cache_data()
def get_base64_of_bin_file(bin_file):
with open(bin_file, 'rb') as f:
data = f.read()
return base64.b64encode(data).decode()
@st.cache_data()
def get_img_with_href(local_img_path, target_url, size='big'):
img_format = os.path.splitext(local_img_path)[-1].replace('.', '')
bin_str = get_base64_of_bin_file(local_img_path)
height = '90%' if size == 'big' else '45%'
width = '90%' if size == 'big' else '45%'
html_code = f'''
'''
return html_code
logo_html = get_img_with_href('./logo.png', 'https://www.ibm.com/')
st.sidebar.markdown(logo_html, unsafe_allow_html=True)
logo_html = get_img_with_href('./logo_zshot.png', 'https://github.com/IBM/zshot', size='small')
st.sidebar.markdown(logo_html, unsafe_allow_html=True)
# sidebar info
linkers = ["REGEN", "SMXM", "TARS"]
st.sidebar.title("Linker to test")
selected_model = st.sidebar.selectbox("", linkers)
######## Main Page #########
if selected_model == "REGEN":
app_title = "REGEN Linker"
app_description = "REGEN is a T5 implementation of GENRE. It performs retrieval generating the unique entity name conditioned on the input text using constrained beam search to only generate valid identifiers."
st.title(app_title)
st.markdown("
" + app_description + "
", unsafe_allow_html=True)
elif selected_model == "SMXM":
app_title = "SMXM Linker"
app_description = "SMXM model uses the description of the entities to give the model information about the entities."
st.title(app_title)
st.markdown("" + app_description + "
", unsafe_allow_html=True)
elif selected_model == "TARS":
app_title = "TARS Linker"
app_description = "TARS doesn't need the descriptions of the entities, so if you can't provide the descriptions of the entities maybe this is the approach you're looking for."
st.title(app_title)
st.markdown("" + app_description + "
", unsafe_allow_html=True)
st.subheader("")
if 'entities' not in st.session_state:
st.session_state['entities'] = [
Entity(name="company", description="The name of a company"),
Entity(name="location", description="A physical location"),
Entity(name="chemical compound", description="Any substance composed of identical molecules consisting of atoms of two or more chemical elements.")
]
def add_ent():
st.session_state['entities'].append(Entity(name=st.session_state["name"], description=st.session_state["description"]))
st.session_state['name'] = ""
st.session_state['description'] = ''
st.write(st.session_state["name"])
st.write(st.session_state["description"])
for i, entity in enumerate(st.session_state['entities']):
col1, col2, col3 = st.columns([2, 5, 1])
with col1:
st.text(entity.name)
with col2:
st.text(entity.description)
with col3:
b = st.button('Remove', key=f"ent_{i}")
if b:
st.session_state['entities'].pop(i)
st.experimental_rerun() # This causes the app to rerun
with st.form(key="form"):
col1, col2, col3 = st.columns([2, 5, 1])
with col1:
st.text_input("Entity Name", key="name")
with col2:
st.text_input("Entity Description", key="description")
with col3:
st.form_submit_button('Add', on_click=add_ent)
st.markdown("________")
text = st.text_input("Type here your text and press enter to run:",
value="CH2O2 is a chemical compound similar to Acetamide used in International Business "
"Machines Corporation (IBM) to create new materials that act like PAGs.")
def build_pipeline(model_name=selected_model):
nlp = spacy.blank('en')
mentions_extractor = None
if model_name == "REGEN":
linker = LinkerRegen()
nlp = spacy.load('en_core_web_sm')
mentions_extractor = MentionsExtractorSpacy(ExtractorType.NER)
elif model_name == "TARS":
linker = LinkerTARS()
elif model_name == "SMXM":
linker = LinkerSMXM()
config = PipelineConfig(
entities=st.session_state['entities'],
mentions_extractor=mentions_extractor,
linker=linker
)
nlp.add_pipe("zshot", config=config, last=True)
return nlp
predict = st.button("Run ZShot")
if predict:
# placeholder for warning
placeholder = st.empty()
placeholder.info("Processing...")
nlp = build_pipeline()
doc = nlp(text)
placeholder.empty()
ent_html = displacy.render(doc, style="ent", jupyter=False) # Display the entity visualization in the browser:
st.markdown(ent_html, unsafe_allow_html=True)
st.sidebar.info("""See more:
- Check ZShot Github [here](https://github.com/IBM/zshot)
- Check ZShot documentation [here](https://ibm.github.io/zshot/)""")