import nltk import streamlit as st import validators from transformers import pipeline from validators import ValidationFailure from Summarizer import Summarizer def main() -> None: nltk.download('punkt') st.markdown('# Terms & conditions summarization :pencil:') st.markdown('Do you also take the time out of your day to thoroughly read every word of the Terms & Conditions before signing up for a new app? :thinking_face:
' 'No?
' 'Well have we got a demo for you!', unsafe_allow_html=True) st.markdown('Just copy-paste the lengthy Terms & Conditions text or provide a URL to the text and let our fancy NLP algorithm do the rest! :brain:
' 'You will see both an extractive summary (the most important sentences will be highlighted) and an abstractive summary (an actual summary)', unsafe_allow_html=True) st.markdown('Want to find out more?
' 'For details about the extractive part :point_right: https://en.wikipedia.org/wiki/Latent_semantic_analysis
' 'For details about the abstractive part :point_right: https://huggingface.co/ml6team/distilbart-tos-summarizer-tosdr', unsafe_allow_html=True) @st.cache(allow_output_mutation=True, suppress_st_warning=True, show_spinner=False) def create_pipeline(): with st.spinner('Please wait for the model to load...'): terms_and_conditions_pipeline = pipeline( task='summarization', model='ml6team/distilbart-tos-summarizer-tosdr', tokenizer='ml6team/distilbart-tos-summarizer-tosdr' ) return terms_and_conditions_pipeline def display_abstractive_summary(summary) -> None: st.subheader("Abstractive Summary") st.markdown('#####') st.markdown(summary) def display_extractive_summary(terms_and_conditions_sentences: list, summary_sentences: list) -> None: st.subheader("Extractive Summary") st.markdown('#####') terms_and_conditions = " ".join(sentence for sentence in terms_and_conditions_sentences) replaced_text = terms_and_conditions for sentence in summary_sentences: replaced_text = replaced_text.replace(sentence, f"{sentence}") st.write(replaced_text, unsafe_allow_html=True) def is_valid_url(url: str) -> bool: result = validators.url(url) if isinstance(result, ValidationFailure): return False return True summarizer: Summarizer = Summarizer(create_pipeline()) if 'tc_text' not in st.session_state: st.session_state['tc_text'] = '' if 'sentences_length' not in st.session_state: st.session_state['sentences_length'] = Summarizer.DEFAULT_EXTRACTED_ARTICLE_SENTENCES_LENGTH st.write('', unsafe_allow_html=True) st.header("Input") with st.form(key='terms-and-conditions'): sentences_length_input = st.number_input( label='Number of sentences to be extracted:', min_value=1, value=st.session_state.sentences_length ) tc_text_input = st.text_area( value=st.session_state.tc_text, label='Terms & conditions content or specify an URL:', height=240 ) submit_button = st.form_submit_button(label='Summarize') if submit_button: if is_valid_url(tc_text_input): (all_sentences, extract_summary_sentences) = summarizer.extractive_summary_from_url(tc_text_input, sentences_length_input) else: (all_sentences, extract_summary_sentences) = summarizer.extractive_summary_from_text(tc_text_input, sentences_length_input) extract_summary = " ".join([sentence for sentence in extract_summary_sentences]) abstract_summary = summarizer.abstractive_summary(extract_summary) display_extractive_summary(all_sentences, extract_summary_sentences) display_abstractive_summary(abstract_summary) if __name__ == "__main__": main()