Alex Clefos
Update code and update requirements
5f814e7
# importing the necessary library
import re
import math
import spacy
import nltk
from nltk.tokenize import sent_tokenize
nltk.download('punkt')
import gradio as gr
from transformers import pipeline
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import BartTokenizer, BartForConditionalGeneration
# initailizing the model pipeline
model = BartForConditionalGeneration.from_pretrained("sshleifer/distilbart-cnn-12-6")
tokenizer = BartTokenizer.from_pretrained("sshleifer/distilbart-cnn-12-6")
nlp = spacy.load("en_core_web_sm")
def clean_text(text):
text = text
text = text.encode("ascii", errors="ignore").decode(
"ascii"
) # remove non-ascii, Chinese characters
text = re.sub(r"\n", " ", text)
text = re.sub(r"\n\n", " ", text)
text = re.sub(r"\t", " ", text)
text = text.strip(" ")
text = re.sub(
" +", " ", text
).strip() # get rid of multiple spaces and replace with a single
return text
# Defining a function to get the summary of the article
def final_summary(text):
# reading in the text and tokenizing it into sentence
text = text
bullet_points = 10
while (bullet_points >= 10):
chunks = []
sentences = nlp(text)
for sentence in sentences.sents:
chunks.append(str(sentence))
output = []
sentences_remaining = len(chunks)
i = 0
#looping through the sentences in an equal batch based on their length and summarizing them
while sentences_remaining > 0:
chunks_remaining = math.ceil(sentences_remaining / 10.0)
next_chunk_size = math.ceil(sentences_remaining / chunks_remaining)
sentence = "".join(chunks[i:i+next_chunk_size])
i += next_chunk_size
sentences_remaining -= next_chunk_size
inputs = tokenizer(sentence, return_tensors="pt", padding="longest")
#inputs = inputs.to(DEVICE)
original_input_length = len(inputs["input_ids"][0])
# checking if the length of the input batch is less than 150
if original_input_length < 100:
split_sentences = nlp(sentence)
for split_sentence in split_sentences.sents:
output.append(str(split_sentence).rstrip("."))
# checking if the length of the input batch is greater than 1024
elif original_input_length > 1024:
sent = sent_tokenize(sentence)
length_sent = len(sent)
j = 0
sent_remaining = math.ceil(length_sent / 2)
# going through the batch that is greater than 1024 and dividing them
while length_sent > 0:
halved_sentence = "".join(sent[j:j+sent_remaining])
halved_inputs = tokenizer(halved_sentence, return_tensors="pt")
#halved_inputs = halved_inputs.to(DEVICE)
halved_summary_ids = model.generate(halved_inputs["input_ids"])
j += sent_remaining
length_sent -= sent_remaining
# checking if the length of the output summary is less than the original text
if len(halved_summary_ids[0]) < len(halved_inputs["input_ids"][0]):
halved_summary = tokenizer.batch_decode(halved_summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
output.append(halved_summary)
else:
summary_ids = model.generate(inputs["input_ids"])
if len(summary_ids[0]) < original_input_length:
summary = tokenizer.batch_decode(summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
output.append(summary)
final_output = []
for paragraphs in output:
lines = paragraphs.split(" . ")
for line in lines:
final_output.append(line.replace(" .", "").strip())
text = ".".join(final_output)
bullet_points = len(final_output)
for i in range(len(final_output)):
final_output[i] = "* " + final_output[i] + "."
# final sentences are incoherent, so we will join them by bullet separator
summary_bullet = "\n".join(final_output)
return summary_bullet
# creating an interface for the headline generator using gradio
demo = gr.Interface(final_summary, inputs=[gr.Textbox(label="Drop your article here")],
title = "ARTICLE SUMMARIZER",
outputs=[gr.Textbox(label="Summary")],
)
# launching the app
if __name__ == "__main__":
demo.launch(debug=True)