netherformer / app.py
Yeb Havinga
Update demo
3476db4
import streamlit as st
import os
from transformers import AutoTokenizer
from transformers import AutoModelForSeq2SeqLM
from transformers import pipeline
from transformers import set_seed
debug = False
MODEL = "flax-community/t5-base-dutch-demo"
#MODEL: str = "."
DEFAULT_TEXT: str = """Bij meerdere dijken in gemeenten langs de Maas in de veiligheidsregio Limburg-Noord zijn lekkages ontstaan. Dat vertelde burgemeester van Venlo Antoin Scholten - tevens voorzitter van de veiligheidsregio - zaterdagmiddag op een persconferentie. Een bedrijventerrein aan de Prins Willem Alexanderhaven in Roermond wordt om die reden ontruimd. Scholten vraagt Nederlanders de komende dagen weg te blijven uit de regio.
"We zien dat zwakke plekken zich voordoen", aldus Scholten. "De situatie is nog onzeker. Het water is ongelofelijk grillig." Volgens hem is het onzeker of de dijken langs de Prins Willem Alexanderhaven het gaan houden. Daar zou al water doorheen sijpelen.
Vanuit Defensie staat een interventieteam paraat om hulp te bieden als het ergens onverhoopt toch misgaat. Scholten prijst ook de vele vrijwilligers die klaarstaan voor Limburg. "De vele handjes zijn hartverwarmend. Vanuit de dorpen, de kernen, de wijken."
Ook vanuit elders in Europa is hulp aangeboden, weet Scholten. "Men weet ons spontaan te vinden, zonder dat wij ook een oproep hebben gedaan om hulp."
De burgemeester riep alle ramptoeristen er opnieuw toe op nog even weg te blijven. Dat kan volgens hem tot gevaarlijke situaties leiden en de ramptoeristen lopen bovendien hulpdiensten in de weg, aldus Scholten. Jos Teeuwen, bestuurslid van Waterschap Limburg, beaamt dat er gevaarlijke situaties kunnen ontstaan. "De dijken zijn door het vocht en de grote hoeveelheden water verzwakt."
"""
generator_kwargs_beam = {
"max_length": 175,
"min_length": 30,
"no_repeat_ngram_size": 2,
"early_stopping": True,
"num_beams": 5,
"length_penalty": 1.5,
"num_return_sequences": 1,
}
generator_kwargs_top_k = {
"max_length": 175,
"min_length": 30,
"no_repeat_ngram_size": 2,
"do_sample": True,
"top_k": 60,
"top_p": 0.95,
"num_return_sequences": 1,
}
class TextSummarizer:
def __init__(self):
self.tokenizer = None
self.model = None
self.generator = None
# set_seed(42)
def load(self):
os.environ["TOKENIZERS_PARALLELISM"] = "false"
self.tokenizer = AutoTokenizer.from_pretrained(MODEL)
self.model = AutoModelForSeq2SeqLM.from_pretrained(MODEL)
self.generator = pipeline(
"text2text-generation", model=self.model, tokenizer=self.tokenizer
)
def summarize(self, input_text, generate_kwargs) -> str:
if not self.generator:
self.load()
return self.generator(
input_text, return_tensors=False, return_text=True, **generate_kwargs
)[0].get("generated_text")
@st.cache(allow_output_mutation=True)
def instantiate_generator():
summarizer = TextSummarizer()
return summarizer
def main():
st.set_page_config( # Alternate names: setup_page, page, layout
page_title="Netherformer", # String or None. Strings get appended with "β€’ Streamlit".
# layout="", # Can be "centered" or "wide". In the future also "dashboard", etc.
initial_sidebar_state="expanded", # Can be "auto", "expanded", "collapsed"
page_icon="πŸ“°", # String, anything supported by st.image, or None.
)
with open("style.css") as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
generator = instantiate_generator()
st.markdown(
"""# Netherformer πŸ“°
This demo uses [T5 Dutch finetuned on CNN DM](https://huggingface.co/flax-community/t5-base-dutch-demo)
to generate summaries of a news story
"""
)
input_text = st.text_area("Enter a Dutch news text", DEFAULT_TEXT)
if st.button("Generate summary"):
if debug:
response = """Een bedrijventerrein aan de Prins Willem Alexanderhaven in Roermond heeft de komende dagen weg te blijven uit de regio. De burgemeester van Roermond roept alle ramptoeristen er opnieuw toe op meer dan 10.00 uur weg."""
else:
response = generator.summarize(input_text, generator_kwargs_beam)
st.header("Summary:")
st.markdown(response)
if __name__ == "__main__":
main()