diff --git a/ML_Experiments.ipynb b/ML_Experiments.ipynb new file mode 100644 index 0000000..7e3ae2c --- /dev/null +++ b/ML_Experiments.ipynb @@ -0,0 +1,39 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "authorship_tag": "ABX9TyOZnVW7CAWe+5PLnWXxx9iF", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NTIEyVwmLTBP" + }, + "outputs": [], + "source": [] + } + ] +} \ No newline at end of file diff --git a/summary_be/archive/utils/lstm_bi25/fingerprint.pb b/summary_be/archive/utils/lstm_bi25/fingerprint.pb new file mode 100644 index 0000000..70f8498 --- /dev/null +++ b/summary_be/archive/utils/lstm_bi25/fingerprint.pb @@ -0,0 +1 @@ +ȺƃXӍѹŰ ꋨW(؂猰(2 \ No newline at end of file diff --git a/summary_be/archive/utils/lstm_bi25/keras_metadata.pb b/summary_be/archive/utils/lstm_bi25/keras_metadata.pb new file mode 100644 index 0000000..e7d0857 --- /dev/null +++ b/summary_be/archive/utils/lstm_bi25/keras_metadata.pb @@ -0,0 +1,11 @@ + +-root"_tf_keras_sequential*-{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "bidirectional_input"}}, {"class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 2}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 3}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}}, "merge_mode": "concat"}}, {"class_name": "TimeDistributed", "config": {"name": "time_distributed", "trainable": true, "dtype": "float32", "layer": {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}}}]}, "shared_object_id": 11, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 768]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null, 768]}, "float32", "bidirectional_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null, 768]}, "float32", "bidirectional_input"]}, "keras_version": "2.12.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "bidirectional_input"}, "shared_object_id": 0}, {"class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 2}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 3}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 5}, "merge_mode": "concat"}, "shared_object_id": 6}, {"class_name": "TimeDistributed", "config": {"name": "time_distributed", "trainable": true, "dtype": "float32", "layer": {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}}, "shared_object_id": 10}]}}, "training_config": {"loss": "binary_crossentropy", "metrics": [[{"class_name": "SensitivityAtSpecificity", "config": {"name": "sensitivity_at_specificity", "dtype": "float32", "class_id": null, "num_thresholds": 1, "specificity": 0.5}, "shared_object_id": 13}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Custom>Adam", "config": {"name": "Adam", "weight_decay": null, "clipnorm": null, "global_clipnorm": null, "clipvalue": null, "use_ema": false, "ema_momentum": 0.99, "ema_overwrite_frequency": null, "jit_compile": true, "is_legacy_optimizer": false, "learning_rate": 0.0010000000474974513, "beta_1": 0.9, "beta_2": 0.999, "epsilon": 1e-07, "amsgrad": false}}}}2 + root.layer_with_weights-0"_tf_keras_layer* {"name": "bidirectional", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Bidirectional", "config": {"name": "bidirectional", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "layer": {"class_name": "LSTM", "config": {"name": "lstm", "trainable": true, "dtype": "float32", "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 2}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 3}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 5}, "merge_mode": "concat"}, "shared_object_id": 6, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 14}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 768]}}2 + root.layer_with_weights-1"_tf_keras_layer* {"name": "time_distributed", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "TimeDistributed", "config": {"name": "time_distributed", "trainable": true, "dtype": "float32", "layer": {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 50]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 15}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 50]}}2 + 'root.layer_with_weights-0.forward_layer"_tf_keras_rnn_layer* {"name": "forward_lstm", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "LSTM", "config": {"name": "forward_lstm", "trainable": true, "dtype": "float32", "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "time_major": false, "zero_output_for_mask": true, "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 17}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 18}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 20, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 21}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 768]}}2 + (root.layer_with_weights-0.backward_layer"_tf_keras_rnn_layer* {"name": "backward_lstm", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "LSTM", "config": {"name": "backward_lstm", "trainable": true, "dtype": "float32", "return_sequences": true, "return_state": false, "go_backwards": true, "stateful": false, "unroll": false, "time_major": false, "zero_output_for_mask": true, "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 23}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 24}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 26, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null, 768]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}, "shared_object_id": 27}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 768]}}2 +root.layer_with_weights-1.layer"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 50}}, "shared_object_id": 28}}2 + L,root.layer_with_weights-0.forward_layer.cell"_tf_keras_layer*{"name": "lstm_cell_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "LSTMCell", "config": {"name": "lstm_cell_1", "trainable": true, "dtype": "float32", "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 17}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 18}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 19, "build_input_shape": {"class_name": "__tuple__", "items": [null, 768]}}2 + U-root.layer_with_weights-0.backward_layer.cell"_tf_keras_layer*{"name": "lstm_cell_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "LSTMCell", "config": {"name": "lstm_cell_2", "trainable": true, "dtype": "float32", "units": 25, "activation": "tanh", "recurrent_activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "recurrent_initializer": {"class_name": "Orthogonal", "config": {"gain": 1.0, "seed": null}, "shared_object_id": 23}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 24}, "unit_forget_bias": true, "kernel_regularizer": null, "recurrent_regularizer": null, "bias_regularizer": null, "kernel_constraint": null, "recurrent_constraint": null, "bias_constraint": null, "dropout": 0.0, "recurrent_dropout": 0.0, "implementation": 2}, "shared_object_id": 25, "build_input_shape": {"class_name": "__tuple__", "items": [null, 768]}}2 +froot.keras_api.metrics.0"_tf_keras_metric*{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 29}2 +groot.keras_api.metrics.1"_tf_keras_metric*{"class_name": "SensitivityAtSpecificity", "name": "sensitivity_at_specificity", "dtype": "float32", "config": {"name": "sensitivity_at_specificity", "dtype": "float32", "class_id": null, "num_thresholds": 1, "specificity": 0.5}, "shared_object_id": 13}2 \ No newline at end of file diff --git a/summary_be/archive/utils/lstm_bi25/saved_model.pb b/summary_be/archive/utils/lstm_bi25/saved_model.pb new file mode 100644 index 0000000..18a6483 Binary files /dev/null and b/summary_be/archive/utils/lstm_bi25/saved_model.pb differ diff --git a/summary_be/archive/utils/lstm_bi25/variables/variables.data-00000-of-00001 b/summary_be/archive/utils/lstm_bi25/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000..6b33d28 Binary files /dev/null and b/summary_be/archive/utils/lstm_bi25/variables/variables.data-00000-of-00001 differ diff --git a/summary_be/archive/utils/lstm_bi25/variables/variables.index b/summary_be/archive/utils/lstm_bi25/variables/variables.index new file mode 100644 index 0000000..6d795c1 Binary files /dev/null and b/summary_be/archive/utils/lstm_bi25/variables/variables.index differ diff --git a/summary_be/archive/utils/summarization.py b/summary_be/archive/utils/summarization.py index ad87934..0cfd021 100644 --- a/summary_be/archive/utils/summarization.py +++ b/summary_be/archive/utils/summarization.py @@ -1,248 +1,50 @@ -# Actual summarization logic - -import nltk -import re -import math -from nltk.stem import WordNetLemmatizer -from nltk.tokenize import sent_tokenize, word_tokenize -from nltk.corpus import stopwords - -nltk.data.path.append("/opt/python/nltk_data") - -INVALID = r"[^a-zA-Z\s]" -STOP_WORDS = set(stopwords.words("english")) -lemmatizer = WordNetLemmatizer() - -""" - Function to clean and tokenize a chunk of text into words. - - Parameters - ---------- - text : string - - block of text to process - - Returns - ------- - lemmatized_words : [] - - array of valid words -""" - - -def preprocess(text): - # Remove invalid characters and digits - text = re.sub(INVALID, "", text) - - # Remove stop words + convert to lower case - words = word_tokenize(text) - words = [word.lower() for word in words] - stop_words_removed = [word for word in words if word not in STOP_WORDS] - - # Remove one character words - valid_words = [word for word in stop_words_removed if len(word) > 1] - - # Lemmatize words, aka "builds" becomes "build" etc. - lemmatized_words = [lemmatizer.lemmatize(word) for word in valid_words] - - return lemmatized_words - - -""" - Function to get frequency of words. - - Parameters - ---------- - words : [] - - array of words - - Returns - ------- - word_freq : {} - - dictionary of word frequencies - - key is a string - - val is an int -""" - - -def get_word_freq(words): - dict = {} - unique_words = [] - for word in words: - if word not in unique_words: - unique_words.append(word) - for word in unique_words: - dict[word] = words.count(word) - return dict - - -""" - Function to return sum of tf-idf score of words in a sentence. - - Parameters - ---------- - sent : string - - sentence containing word - sentences : [] - - array of sentences in text - - Returns - ------- - score : float - - tf-idf score of sentence -""" - - -def tf_idf_score(sent, sentences): - sent = re.sub(INVALID, "", sent) - sent_len = len(word_tokenize(sent)) - words_in_given_sent = preprocess(sent) - word_freq = get_word_freq(words_in_given_sent) - - score = 0 - for word in words_in_given_sent: - tf = tf_score(word_freq[word], sent_len) - idf = idf_score(word, sentences) - tf_idf = tf * idf - score += tf_idf - - return score - - -""" - Function to return term frequency score of a word. - - Parameters - ---------- - freq : int - - frequency of word in given sentence - sent_len : int - - total number of words in sentence - - Returns - ------- - tf_score : float - - tf score of word -""" - - -def tf_score(freq, sent_len): - return freq / sent_len - - -""" - Function to return inverse document frequency of a word. - - Parameters - ---------- - word : string - - word to compute score - setences : [] - - array of sentences in text - - Returns - ------- - score : float - - idf score of word -""" - - -def idf_score(word, sentences): - num_sent_containing_word = 0 - for sent in sentences: - words = preprocess(sent) - if word in words: - num_sent_containing_word += 1 - return math.log10(len(sentences) / num_sent_containing_word) - - -""" - Function to return sentence weights based on tf-idf score - - Parameters - ---------- - sentences : [] - - array of sentences in text - - Returns - ------- - sentence_weight : {} - - dictionary of sentence weights - - key is index of sentence in sentences - - val is tf-idf score -""" - - -def get_sentence_weights(sentences): - sentence_weight = {} - for x in range(len(sentences)): - sentence = sentences[x] - importance = tf_idf_score(sentence, sentences) - sentence_weight[x] = importance - sentence_weight = dict( - sorted(sentence_weight.items(), key=lambda item: item[1], reverse=True) - ) - return sentence_weight - - -""" - Function to return indices of top scoring sentences - - Parameters - ---------- - sentence_weight: {} - - dictionary of sentence weights - num_sent: int - - number of top scoring sentences to return - - Returns - ------- - sentence_idx : [] - - indices of top scoring sentences -""" - - -def get_top_scoring_sent(sentence_weight, num_sent): - curr_num_sentences = 0 - sentence_idx = [] - for key in sentence_weight: - if key == 0: - continue - if curr_num_sentences < num_sent - 1: - sentence_idx.append(key) - curr_num_sentences += 1 - else: - break - sentence_idx.sort() - return sentence_idx - - -""" - Function to summarize a given text. - - Parameters - ---------- - text : string - - text to summarize - num_sentences : int - - number of sentences to include in summary - - Returns - ------- - summary : string - - extractive summary of text -""" - - -def summarize(text, num_sentences): - if num_sentences < 1: - raise Exception("Summary must have at least one sentence.") - sentences = sent_tokenize(text) - sentence_weight = get_sentence_weights(sentences) - sentence_idx = get_top_scoring_sent(sentence_weight, num_sentences) - - summary = sentences[0] - for x in range(len(sentences)): - if x in sentence_idx: - summary += " " - summary += sentences[x] - - return summary +import pandas as pd +import numpy as np +import spacy +from spacy.language import Language +import tensorflow as tf +from tensorflow import keras +from sentence_transformers import SentenceTransformer + +model = tf.keras.models.load_model('/lstm_bi25') + +def preprocess(text, + nlp = spacy.load("en_core_web_sm"), + embedder = SentenceTransformer('distilbert-base-nli-mean-tokens'), + min_len = 2): + @Language.component("custom_sentencizer") + def custom_sentencizer(doc): + for i, token in enumerate(doc[:-2]): + # Define sentence start if it occurs after "\n\n" or "\n" + if token.text == "\n\n" or token.text == "\n": + doc[i + 1].is_sent_start = True + return doc + nlp = spacy.load("en_core_web_sm") + nlp.add_pipe("custom_sentencizer", before="parser") + text = nlp(text) + sents = list(text.sents) + + # remove sentences with length below threshold + sents_clean = [sent.text for sent in sents if len(sent) > min_len] + sents_clean = [sent for sent in sents_clean if len(sent)!=0] + + # calculate sentence embeddings + sents_embedding= np.array(embedder.encode(sents_clean, convert_to_tensor=True)) + return sents_clean, sents_embedding + +def summarize(text): + sentences, embeddings = preprocess(text) + + reshape_func = lambda x: x.reshape(1, x.shape[0], x.shape[1]) + x = reshape_func(embeddings) + + y_pred = model.predict(x, verbose=0) + idx = np.argsort(y_pred.flatten())[-3:] + idx = sorted(idx) + pred_summary = "" + for i in idx: + pred_summary += ' ' + pred_summary += sentences[i] + pred_summary.strip() + + return pred_summary \ No newline at end of file diff --git a/summary_be/archive/utils/summarization_old.py b/summary_be/archive/utils/summarization_old.py new file mode 100644 index 0000000..ad87934 --- /dev/null +++ b/summary_be/archive/utils/summarization_old.py @@ -0,0 +1,248 @@ +# Actual summarization logic + +import nltk +import re +import math +from nltk.stem import WordNetLemmatizer +from nltk.tokenize import sent_tokenize, word_tokenize +from nltk.corpus import stopwords + +nltk.data.path.append("/opt/python/nltk_data") + +INVALID = r"[^a-zA-Z\s]" +STOP_WORDS = set(stopwords.words("english")) +lemmatizer = WordNetLemmatizer() + +""" + Function to clean and tokenize a chunk of text into words. + + Parameters + ---------- + text : string + - block of text to process + + Returns + ------- + lemmatized_words : [] + - array of valid words +""" + + +def preprocess(text): + # Remove invalid characters and digits + text = re.sub(INVALID, "", text) + + # Remove stop words + convert to lower case + words = word_tokenize(text) + words = [word.lower() for word in words] + stop_words_removed = [word for word in words if word not in STOP_WORDS] + + # Remove one character words + valid_words = [word for word in stop_words_removed if len(word) > 1] + + # Lemmatize words, aka "builds" becomes "build" etc. + lemmatized_words = [lemmatizer.lemmatize(word) for word in valid_words] + + return lemmatized_words + + +""" + Function to get frequency of words. + + Parameters + ---------- + words : [] + - array of words + + Returns + ------- + word_freq : {} + - dictionary of word frequencies + - key is a string + - val is an int +""" + + +def get_word_freq(words): + dict = {} + unique_words = [] + for word in words: + if word not in unique_words: + unique_words.append(word) + for word in unique_words: + dict[word] = words.count(word) + return dict + + +""" + Function to return sum of tf-idf score of words in a sentence. + + Parameters + ---------- + sent : string + - sentence containing word + sentences : [] + - array of sentences in text + + Returns + ------- + score : float + - tf-idf score of sentence +""" + + +def tf_idf_score(sent, sentences): + sent = re.sub(INVALID, "", sent) + sent_len = len(word_tokenize(sent)) + words_in_given_sent = preprocess(sent) + word_freq = get_word_freq(words_in_given_sent) + + score = 0 + for word in words_in_given_sent: + tf = tf_score(word_freq[word], sent_len) + idf = idf_score(word, sentences) + tf_idf = tf * idf + score += tf_idf + + return score + + +""" + Function to return term frequency score of a word. + + Parameters + ---------- + freq : int + - frequency of word in given sentence + sent_len : int + - total number of words in sentence + + Returns + ------- + tf_score : float + - tf score of word +""" + + +def tf_score(freq, sent_len): + return freq / sent_len + + +""" + Function to return inverse document frequency of a word. + + Parameters + ---------- + word : string + - word to compute score + setences : [] + - array of sentences in text + + Returns + ------- + score : float + - idf score of word +""" + + +def idf_score(word, sentences): + num_sent_containing_word = 0 + for sent in sentences: + words = preprocess(sent) + if word in words: + num_sent_containing_word += 1 + return math.log10(len(sentences) / num_sent_containing_word) + + +""" + Function to return sentence weights based on tf-idf score + + Parameters + ---------- + sentences : [] + - array of sentences in text + + Returns + ------- + sentence_weight : {} + - dictionary of sentence weights + - key is index of sentence in sentences + - val is tf-idf score +""" + + +def get_sentence_weights(sentences): + sentence_weight = {} + for x in range(len(sentences)): + sentence = sentences[x] + importance = tf_idf_score(sentence, sentences) + sentence_weight[x] = importance + sentence_weight = dict( + sorted(sentence_weight.items(), key=lambda item: item[1], reverse=True) + ) + return sentence_weight + + +""" + Function to return indices of top scoring sentences + + Parameters + ---------- + sentence_weight: {} + - dictionary of sentence weights + num_sent: int + - number of top scoring sentences to return + + Returns + ------- + sentence_idx : [] + - indices of top scoring sentences +""" + + +def get_top_scoring_sent(sentence_weight, num_sent): + curr_num_sentences = 0 + sentence_idx = [] + for key in sentence_weight: + if key == 0: + continue + if curr_num_sentences < num_sent - 1: + sentence_idx.append(key) + curr_num_sentences += 1 + else: + break + sentence_idx.sort() + return sentence_idx + + +""" + Function to summarize a given text. + + Parameters + ---------- + text : string + - text to summarize + num_sentences : int + - number of sentences to include in summary + + Returns + ------- + summary : string + - extractive summary of text +""" + + +def summarize(text, num_sentences): + if num_sentences < 1: + raise Exception("Summary must have at least one sentence.") + sentences = sent_tokenize(text) + sentence_weight = get_sentence_weights(sentences) + sentence_idx = get_top_scoring_sent(sentence_weight, num_sentences) + + summary = sentences[0] + for x in range(len(sentences)): + if x in sentence_idx: + summary += " " + summary += sentences[x] + + return summary diff --git a/summary_be/lambda_handlers/summary.py b/summary_be/lambda_handlers/summary.py index 93a79ab..a6c99d9 100644 --- a/summary_be/lambda_handlers/summary.py +++ b/summary_be/lambda_handlers/summary.py @@ -16,7 +16,7 @@ def get_summary(event, context): } try: - result = summarize(text, num_sentences) + result = summarize(text) num_words = len(result.split(" ")) return { "statusCode": 200, diff --git a/summary_be/ml_notebook/dynamic_chunking.ipynb b/summary_be/ml_notebook/dynamic_chunking.ipynb deleted file mode 100644 index 7f3d88f..0000000 --- a/summary_be/ml_notebook/dynamic_chunking.ipynb +++ /dev/null @@ -1,634 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "authorship_tag": "ABX9TyNORzkxfdxKKcNI5yqF1enI", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Dynamic Chunking\n", - "This notebook implements dynamic chunking of text into semantically distinct paragraphs.\n", - "\n", - "* [SBERT](https://www.sbert.net/) is used to extract semantic feature vectors in sentences\n", - "* Vectors can be compared to find sentences of similar meaning\n", - "\n", - "Dynamic chunking solves the following problems:\n", - "\n", - "\n", - "* Summarization of long texts\n", - "* Preservation of detail in the overall summary\n", - "\n", - "**TODO**\n", - "* This notebook is not complete, missing examples and explanations\n", - "* Compare time for each method\n" - ], - "metadata": { - "id": "dTHsgGOLa8Vr" - } - }, - { - "cell_type": "code", - "source": [ - "!pip install sentence_transformers" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "QewF-0LpSq1L", - "outputId": "6a7b403a-e3ad-45e5-8d7b-7cbb71e0f7fe" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Requirement already satisfied: sentence_transformers in /usr/local/lib/python3.7/dist-packages (2.2.2)\n", - "Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (4.64.1)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.13.1+cu113)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.7.3)\n", - "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.0.2)\n", - "Requirement already satisfied: nltk in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (3.7)\n", - "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.1.97)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (4.24.0)\n", - "Requirement already satisfied: huggingface-hub>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (0.10.1)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.21.6)\n", - "Requirement already satisfied: torch>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from sentence_transformers) (1.12.1+cu113)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (4.13.0)\n", - "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (21.3)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (3.8.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (6.0)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (4.1.1)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (2.28.1)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=20.9->huggingface-hub>=0.4.0->sentence_transformers) (3.0.9)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (2022.6.2)\n", - "Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /usr/local/lib/python3.7/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.13.2)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->huggingface-hub>=0.4.0->sentence_transformers) (3.10.0)\n", - "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from nltk->sentence_transformers) (1.2.0)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from nltk->sentence_transformers) (7.1.2)\n", - "Requirement already satisfied: charset-normalizer<3,>=2 in /usr/local/lib/python3.7/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (2.1.1)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (2.10)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (2022.9.24)\n", - "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (1.24.3)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->sentence_transformers) (3.1.0)\n", - "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /usr/local/lib/python3.7/dist-packages (from torchvision->sentence_transformers) (7.1.2)\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import math\n", - "import nltk\n", - "nltk.download('punkt')\n", - "from nltk import sent_tokenize\n", - "from tqdm import tnrange\n", - "from sentence_transformers import SentenceTransformer\n", - "from sklearn.metrics.pairwise import cosine_similarity\n", - "import seaborn as sns\n", - "from scipy.signal import argrelextrema\n", - "import matplotlib.pyplot as plt" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "q0VfRJ_sTNQ6", - "outputId": "f4b03fce-2903-42b6-94f3-96a7d6d388fc" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "[nltk_data] Downloading package punkt to /root/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "MODEL = 'all-MiniLM-L6-v2'\n", - "model = SentenceTransformer(MODEL)" - ], - "metadata": { - "id": "ouSiySJaTOnJ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "TEXT = \"\"\"Elon Musk sold $3.95 billion worth of Tesla stock since completing his purchase of Twitter late last month. \n", - " Musk’s Tesla stock sales, totaling 19.5 million shares, have been widely anticipated ever since the Tesla CEO\n", - " reached a deal to buy Twitter for $44 billion. Musk had sold blocks of Tesla shares worth a total of $15.4 billion\n", - " earlier this year since his deal to buy Twitter was announced. Twitter confirmed Musk bought the social media company\n", - " October 27, but he waited until November 4 to start selling additional Tesla shares. He also sold blocks of Tesla \n", - " stock on Monday and Tuesday this week, according to filings to the Securities and Exchange Commission late Tuesday night. \n", - " It’s not clear if the money Musk raised went toward the Twitter purchase, or to support losses at Twitter since he \n", - " took over. Musk disclosed last week that Twitter has seen a “massive drop in revenue,” as a growing number of advertisers \n", - " pause spending on the platform in the wake of his takeover of the company. He blamed “activist groups” pressuring \n", - " advertisers for the loss of ad dollars. He has announced plans to charge users $8 a month to have verified accounts, \n", - " and also announced deep staff cuts. This is not the best time to be selling Tesla shares, which have lost 46% of their \n", - " value so far this year on disappointing sales caused by supply chain problems. Musk received an average price of $202.52 \n", - " for the Tesla shares he sold since the Twitter deal closed, which is down 10% just since he closed on his deal to buy \n", - " Twitter. Shares of Tesla fell 0.7% in after-hours trading Tuesday. The company is facing growing competition in the \n", - " electric vehicle market from established automakers such as Volkswagen, Ford and General Motors. And some investors \n", - " have expressed concerns that Musk will be too distracted by his purchase of Twitter to give enough attention to \n", - " addressing Tesla’s problems.\"\"\"" - ], - "metadata": { - "id": "F8ko-i59hK24" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "sns.set(rc={\"figure.dpi\":100, 'savefig.dpi':100})\n", - "sns.set_context('notebook')\n", - "sns.set_style(\"ticks\")" - ], - "metadata": { - "id": "l89kojjIX6MI" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Cosine-similarity matrix\n", - "Sentence embeddings are compared using cosine-similarity to find similar sentences.\n", - "\n", - "The closer the value is to 1, the smaller the angle between the vectors and the more similar the sentences are to each other." - ], - "metadata": { - "id": "iRwO2n5cd38_" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "n3r4ygRHSVn-" - }, - "outputs": [], - "source": [ - "def embed_sentences(text):\n", - " sent_embeddings = sent_tokenize(text)\n", - " for i in range (len(sent_embeddings)):\n", - " sent_embeddings[i] = model.encode(sent_embeddings[i])\n", - " return sent_embeddings\n", - "\n", - "def create_similarity_matrix(sent_embeddings):\n", - " similarity_matrix = cosine_similarity(sent_embeddings)\n", - " return similarity_matrix" - ] - }, - { - "cell_type": "code", - "source": [ - "similarity_matrix = create_similarity_matrix(embed_sentences(TEXT))\n", - "sns.set(rc={'figure.figsize':(6.25, 5)})\n", - "sns.heatmap(similarity_matrix).set_title('Cosine-Similarity Matrix')\n", - "plt.show()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 465 - }, - "id": "UFThhjjUZcFR", - "outputId": "4274585d-f2a7-4eb5-8229-0c87915d23cc" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Dynamic Chunking While Preserving Order\n", - "\n", - "This approach exploits the existing structure of a news article, which groups topics together into sequential chunks.\n", - "\n", - "We are concerned with finding **where** the \"topic\" changes, and inserting a breakpoint. Once these chunks are discovered, we can use parallel processing to generate summaries of each chunk and concatenate them together." - ], - "metadata": { - "id": "ZCP0b-bLjaRt" - } - }, - { - "cell_type": "code", - "source": [ - "def rev_sigmoid(x):\n", - " return (1 / (1 + math.exp(0.5*x)))\n", - "\n", - "def find_splitting_points(similarity_matrix):\n", - " size = 14\n", - " x = np.linspace(-10, 10, size)\n", - " y = np.vectorize(rev_sigmoid)\n", - " activation_weights = np.pad(y(x), (0, similarity_matrix.shape[0] - size))\n", - " diagonals = [similarity_matrix.diagonal(each) for each in range(0, similarity_matrix.shape[0])]\n", - " diagonals = [np.pad(each, (0, similarity_matrix.shape[0]-len(each))) for each in diagonals]\n", - " diagonals = np.stack(diagonals)\n", - " diagonals = diagonals * activation_weights.reshape(-1, 1)\n", - " weighted_sum = np.sum(diagonals, axis = 0)\n", - " return weighted_sum" - ], - "metadata": { - "id": "mIWC6EU_ZP20" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "activated_similarities = find_splitting_points(similarity_matrix)\n", - "fig, ax = plt.subplots()\n", - "minmimas = argrelextrema(activated_similarities, np.less, order=2)\n", - "sns.set(rc={'figure.figsize':(6.5, 5)})\n", - "sns.lineplot(y=activated_similarities, x=range(len(activated_similarities)), ax=ax).set_title('Relative Minimas')\n", - "plt.vlines(x=minmimas, ymin=min(activated_similarities), ymax=max(activated_similarities), colors='purple', ls='--', lw=1, label='vline_multiple - full height')\n", - "plt.show()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 389 - }, - "id": "lraBzbhFZpu-", - "outputId": "9913530d-d403-4464-bea3-12cd1ba7f968" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Clustering by Topic\n", - "\n", - "We can also group sentences together by semantic meaning.\n", - "\n", - "This approach allows us to keep track of \"topics\" that are most prevalent in the text, which is an indicator of relevance. Advantages include being able to adjust the length of a text summary while having control over which topics appear in the summary. For example, if the client requests a short summary, we could choose to summarize and concatenate only sentences that embody the most prevalent topics.\n" - ], - "metadata": { - "id": "udc_SEtXozeE" - } - }, - { - "cell_type": "code", - "source": [ - "sentences = sent_tokenize(TEXT)\n", - "sentences = [sentence.strip() for sentence in sentences]\n", - "data = pd.DataFrame(sentences)" - ], - "metadata": { - "id": "AfwdNfxX3bAd" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "def get_sentence_embeddings(sentence):\n", - " embedding = model.encode([sentence])\n", - " return embedding[0]" - ], - "metadata": { - "id": "wOWEcyZf2k-M" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "from nltk.cluster import KMeansClusterer\n", - "def cluster(NUM_CLUSTERS = 3):\n", - " data.columns=['sentence']\n", - " data['embeddings']=data['sentence'].apply(get_sentence_embeddings)\n", - "\n", - " iterations=25\n", - " X = np.array(data['embeddings'].tolist())\n", - " kclusterer = KMeansClusterer(\n", - " NUM_CLUSTERS, distance=nltk.cluster.util.cosine_distance,\n", - " repeats=iterations,avoid_empty_clusters=True)\n", - " assigned_clusters = kclusterer.cluster(X, assign_clusters=True)\n", - " data['cluster']=assigned_clusters\n", - " return data" - ], - "metadata": { - "id": "tDMweRUzqZgv" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "cluster()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 488 - }, - "id": "VksPKXrEzxSp", - "outputId": "9b8ee58f-79ad-4884-cf58-3a1e356ee83b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " sentence \\\n", - "0 Elon Musk sold $3.95 billion worth of Tesla st... \n", - "1 Musk’s Tesla stock sales, totaling 19.5 millio... \n", - "2 Musk had sold blocks of Tesla shares worth a t... \n", - "3 Twitter confirmed Musk bought the social media... \n", - "4 He also sold blocks of Tesla \\n stock... \n", - "5 It’s not clear if the money Musk raised went t... \n", - "6 Musk disclosed last week that Twitter has seen... \n", - "7 He blamed “activist groups” pressuring \\n ... \n", - "8 He has announced plans to charge users $8 a mo... \n", - "9 This is not the best time to be selling Tesla ... \n", - "10 Musk received an average price of $202.52 \\n ... \n", - "11 Shares of Tesla fell 0.7% in after-hours tradi... \n", - "12 The company is facing growing competition in t... \n", - "13 And some investors \\n have expressed ... \n", - "\n", - " embeddings cluster \n", - "0 [0.015738262, 0.049773764, 0.039228562, -0.002... 1 \n", - "1 [0.0046068756, 0.010958798, 0.06972741, 0.0108... 1 \n", - "2 [-0.014365158, 0.05811444, 0.053490557, 0.0085... 1 \n", - "3 [0.0058419057, -0.014379907, 0.07404005, 0.016... 1 \n", - "4 [-0.054390516, 0.033562854, -0.004229972, 0.01... 0 \n", - "5 [0.007103605, 0.03970247, 0.091158584, -0.0287... 1 \n", - "6 [0.017648496, 0.047859456, 0.077083685, -0.027... 2 \n", - "7 [0.0009142382, 0.03492736, -0.017508835, 0.071... 2 \n", - "8 [-0.04066035, -0.04515377, 0.045038592, -0.019... 2 \n", - "9 [-0.02830206, 0.01951779, 0.061164685, 0.02635... 0 \n", - "10 [0.035062186, 0.0321538, 0.091064826, 0.036340... 1 \n", - "11 [-0.007510837, 0.034629587, 0.07932933, 0.1395... 0 \n", - "12 [0.009982399, -0.004768099, 0.020714289, 0.011... 0 \n", - "13 [0.05617005, 0.018335959, 0.07072651, 0.013934... 1 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sentenceembeddingscluster
0Elon Musk sold $3.95 billion worth of Tesla st...[0.015738262, 0.049773764, 0.039228562, -0.002...1
1Musk’s Tesla stock sales, totaling 19.5 millio...[0.0046068756, 0.010958798, 0.06972741, 0.0108...1
2Musk had sold blocks of Tesla shares worth a t...[-0.014365158, 0.05811444, 0.053490557, 0.0085...1
3Twitter confirmed Musk bought the social media...[0.0058419057, -0.014379907, 0.07404005, 0.016...1
4He also sold blocks of Tesla \\n stock...[-0.054390516, 0.033562854, -0.004229972, 0.01...0
5It’s not clear if the money Musk raised went t...[0.007103605, 0.03970247, 0.091158584, -0.0287...1
6Musk disclosed last week that Twitter has seen...[0.017648496, 0.047859456, 0.077083685, -0.027...2
7He blamed “activist groups” pressuring \\n ...[0.0009142382, 0.03492736, -0.017508835, 0.071...2
8He has announced plans to charge users $8 a mo...[-0.04066035, -0.04515377, 0.045038592, -0.019...2
9This is not the best time to be selling Tesla ...[-0.02830206, 0.01951779, 0.061164685, 0.02635...0
10Musk received an average price of $202.52 \\n ...[0.035062186, 0.0321538, 0.091064826, 0.036340...1
11Shares of Tesla fell 0.7% in after-hours tradi...[-0.007510837, 0.034629587, 0.07932933, 0.1395...0
12The company is facing growing competition in t...[0.009982399, -0.004768099, 0.020714289, 0.011...0
13And some investors \\n have expressed ...[0.05617005, 0.018335959, 0.07072651, 0.013934...1
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 185 - } - ] - } - ] -} \ No newline at end of file diff --git a/summary_be/ml_notebook/fastBART.ipynb b/summary_be/ml_notebook/fastBART.ipynb deleted file mode 100644 index cb25e73..0000000 --- a/summary_be/ml_notebook/fastBART.ipynb +++ /dev/null @@ -1,1022 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9it0AqXuPR3Y" - }, - "source": [ - "# fastBART\n", - "Adaptation of [fastT5](https://github.com/Ki6an/fastT5) for BART text summarization.\n", - "\n", - "* BART is converted to ONNX format and quantized\n", - "* Model is \"flattened\" into a directed graph with nodes being operators\n", - "* Quantization truncates floating point model weights to 8-bit integers\n", - "* We should expect a significant decrease in model size and inference time\n", - "\n", - "**Work in progress**\n", - "* The ONNX model does not have the same outputs as the PyTorch model -> bug\n", - "* ONNX did not increase inference speed as much as expected -> possibly related to bug above\n", - "* CoLab keeps crashing during quantization" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Transformers architecture\n", - "![picture](https://drive.google.com/uc?export=view?&id=1pEr3mTnWSdLAzCfnDYC0G3lg2jZPZiBU)" - ], - "metadata": { - "id": "C8xyZZU4qQZD" - } - }, - { - "cell_type": "markdown", - "source": [ - "### Decoder inefficiencies\n", - "\n", - "* Note in **Figure 1** that the encoder output is fed as the input to the decoder. This output is called a hidden state, and the same hidden state is used for each subsequent computation in the decoder.\n", - "* The encoder output can be computed once, saved, and reused for each subsequent step.\n", - "* The generic Transformers class in PyTorch does not automatically save the encoder output, so the encoder recomputes hidden states during each decoder timestep.\n" - ], - "metadata": { - "id": "2Er0jnSWOfPc" - } - }, - { - "cell_type": "markdown", - "source": [ - "### Token embedding inefficiencies\n", - "\n", - "\n", - "* **Figure 2** illustrates how the embedding of a decoded token depends only on the previous token decoded before it.\n", - "* Caching can be applied to prevent unnecessary computation, shown in **Figure 3**.\n", - "* Seperating the encoder and decoder allows us to control the input/output, ensuring cached values are being passed and only computations related to updating the last token are computed.\n", - "\n", - "\"drawing\"" - ], - "metadata": { - "id": "phu_5Nc6mcl4" - } - }, - { - "cell_type": "markdown", - "source": [ - "### HuggingFace optimizations\n", - "Understanding these optimization strategies is important, because HuggingFace applies them to our PyTorch BART model. We need to ensure that these optimizations are carried over correctly to the ONNX model!" - ], - "metadata": { - "id": "HNMq_cb97WR3" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "VdLLk7_ywD-Q" - }, - "outputs": [], - "source": [ - "!pip install -q torch==1.12.1+cpu -f https://download.pytorch.org/whl/torch_stable.html\n", - "!pip install -q -U transformers==4.4.2 onnx==1.8.1 onnxruntime==1.6.0\n", - "import torch" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Creating classes to specify input and ouput of the ONNX model\n", - "\n", - "Caching is used to speed up generation during decoding:\n", - "\n", - "\n", - "* BART has an auto-regressive decoder, which means that future generation steps depend on the same output token hidden state. We will avoid recomputation of the hidden state by saving it.\n", - "* ```past_key_values``` is returned when ```use_cache``` is True, and contains pre-computed hidden states to speed up decoding.\n", - "\n", - "**Problem**: ```past_key_values``` is a tuple, and must be flattened in the ONNX model. However, the decoder of ```BartForConditionalGeneration``` expects a tuple input.\n", - "\n", - "**Solution**: ```past_key_values``` is represented as a list, and ```DecoderWithLMhead``` will create a tuple from the flattened ```past_key_values``` input. The tuple is then passed to the decoder as normal.\n" - ], - "metadata": { - "id": "WKn3wWwxyevA" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EaLgIRvpSnAm" - }, - "outputs": [], - "source": [ - "class BartEncoder(torch.nn.Module):\n", - " \"\"\" Creation of a class to output only the last hidden state from the encoder \"\"\"\n", - " # The last hidden state is the sequence of hidden states at the output of the last layer,\n", - " # which is fed as the input to the decoder. In other words, it's the only one we care about.\n", - "\n", - " def __init__(self, encoder):\n", - " super().__init__()\n", - " self.encoder = encoder\n", - "\n", - " def forward(self, *input, **kwargs):\n", - " return self.encoder(*input, **kwargs)[0]\n", - "\n", - "class DecoderWithLMhead(torch.nn.Module):\n", - " \"\"\" Creation of a class to combine the decoder and the lm head \"\"\"\n", - " # lm_head specifies what the model will be doing. In this case, we want our model to do language\n", - " # modelling, so we combine the decoder with a Language Modelling head.\n", - "\n", - " def __init__(self, decoder, lm_head, final_logits_bias, config):\n", - " super().__init__()\n", - " self.decoder = decoder\n", - " self.lm_head = lm_head\n", - " # BART uses final_logits_bias unlike T5\n", - " self.final_logits_bias = final_logits_bias\n", - " self.config = config\n", - "\n", - " def forward(self, *inputs):\n", - "\n", - " input_ids, attention_mask, encoder_hidden_states = inputs[:3]\n", - " # Creating a tuple for past_key_values from flattened list\n", - " list_pkv = inputs[3:]\n", - " past_key_values = tuple(list_pkv[i : i + 4] for i in range(0, len(list_pkv), 4))\n", - "\n", - " decoder_output = self.decoder(\n", - " input_ids=input_ids, # decoder_input_ids\n", - " encoder_attention_mask=attention_mask,\n", - " encoder_hidden_states=encoder_hidden_states,\n", - " past_key_values=past_key_values,\n", - " )\n", - "\n", - " lm_head_out = self.lm_head(decoder_output[0]) + self.final_logits_bias\n", - "\n", - " return lm_head_out, decoder_output[1]" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Initial decoder\n", - "\n", - "The very first time that the decoder receives an input from the encoder (per decoding step), there is no need to use caching. This input is called the \"initial hidden state\". Subsequent recurrent decoding steps rely on the same input hidden states, and hence will use ```DecoderWithLMHead```." - ], - "metadata": { - "id": "gzcjpHccTZOV" - } - }, - { - "cell_type": "code", - "source": [ - "class DecoderWithLMheadInitial(torch.nn.Module):\n", - " \"\"\" Creation of a class to combine the decoder and the lm head \"\"\"\n", - "\n", - " def __init__(self, decoder, lm_head, final_logits_bias, config):\n", - " super().__init__()\n", - " self.decoder = decoder\n", - " self.lm_head = lm_head\n", - " self.final_logits_bias = final_logits_bias\n", - " self.config = config\n", - "\n", - " def forward(self, input_ids, attention_mask, encoder_hidden_states):\n", - " decoder_output = self.decoder(\n", - " input_ids=input_ids,\n", - " encoder_attention_mask=attention_mask,\n", - " encoder_hidden_states=encoder_hidden_states,\n", - " )\n", - "\n", - " return (\n", - " self.lm_head(decoder_output[0]) + self.final_logits_bias,\n", - " decoder_output[1],\n", - " )" - ], - "metadata": { - "id": "wJHI7RZCTYbj" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "y1iZ0uSlP8aj" - }, - "source": [ - "## Converting Model to ONNX\n", - "\n", - "Since BART is an encoder-decoder seq2seq model, the encoder and decoder have to be split and converted seperately. Specifically, the encoder, initial decoder, and decoder are converted into three seperate ONNX models." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "a4nFb3naUeU-" - }, - "outputs": [], - "source": [ - "from transformers import (\n", - " AutoConfig,\n", - " AutoTokenizer,\n", - " BartTokenizerFast,\n", - " BartForConditionalGeneration,\n", - ")\n", - "import functools\n", - "import operator\n", - "from pathlib import Path\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "KYrGRN26VK4Y" - }, - "outputs": [], - "source": [ - "MODEL_PATH = 'facebook/bart-large-cnn'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "t7yu7nl84LSE" - }, - "outputs": [], - "source": [ - "tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\n", - "model = BartForConditionalGeneration.from_pretrained(MODEL_PATH, use_cache=True)" - ] - }, - { - "cell_type": "code", - "source": [ - "_folder = Path.cwd()\n", - "saved_models_path = _folder.joinpath(\"models\")\n", - "saved_models_path" - ], - "metadata": { - "id": "b1AYQNnmfIY9" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "import functools\n", - "import operator\n", - "from pathlib import Path\n", - "import os" - ], - "metadata": { - "id": "mc0R5ZBzbVRR" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "def get_model_paths(pretrained_model, model_path, quantized):\n", - "\n", - " model_path.mkdir(parents=True, exist_ok=True)\n", - "\n", - " # gets only the filename\n", - " pretrained_model_name = Path(pretrained_model).stem\n", - "\n", - " if not quantized:\n", - " encoder_path = model_path / pretrained_model_name / \"encoder\" / \"model.onnx\"\n", - " decoder_path = model_path / pretrained_model_name / \"decoder\" / \"model.onnx\"\n", - " init_decoder_path = model_path / pretrained_model_name / \"init-decoder\" / \"model.onnx\"\n", - " else:\n", - " encoder_path = model_path / pretrained_model_name / \"encoder-quantized\" / \"model.onnx\"\n", - " decoder_path = model_path / pretrained_model_name / \"decoder-quantized\" / \"model.onnx\"\n", - " init_decoder_path = model_path / pretrained_model_name / \"init-decoder-quantized\" / \"model.onnx\"\n", - "\n", - " encoder_path.parent.mkdir(parents=True, exist_ok=True)\n", - " decoder_path.parent.mkdir(parents=True, exist_ok=True)\n", - " init_decoder_path.parent.mkdir(parents=True, exist_ok=True)\n", - " \n", - " return encoder_path, decoder_path, init_decoder_path" - ], - "metadata": { - "id": "dcwgIFFHmlcr" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "def turn_model_into_encoder_decoder(model):\n", - " \"\"\"Generates an encoder and a decoder model with a language model head from a pretrained BART model\n", - " Args:\n", - " pretrained_version (str): Name of a pretrained model, or path to a pretrained / finetuned version of BART\n", - " Returns:\n", - " simplified_encoder: pytorch BART encoder with a wrapper to output only the hidden states\n", - " decoder_with_lm_head: pytorch BART decoder with a language modelling head\n", - " decoder_with_lm_head_init: initial pytorch BART decoder with a language modelling head\n", - " \"\"\"\n", - " encoder = model.get_encoder()\n", - " decoder = model.get_decoder()\n", - " lm_head = model.get_output_embeddings()\n", - " final_logits_bias = model.final_logits_bias\n", - "\n", - " simplified_encoder = BartEncoder(encoder)\n", - " decoder_with_lm_head = DecoderWithLMhead(decoder, lm_head, final_logits_bias, model.config)\n", - " decoder_with_lm_head_init = DecoderWithLMheadInitial(decoder, lm_head, final_logits_bias, model.config)\n", - "\n", - " return simplified_encoder, decoder_with_lm_head, decoder_with_lm_head_init" - ], - "metadata": { - "id": "0Xf5loL4b4Kz" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Generating ONNX representations\n", - "Exporting a model in ONNX is done by \"tracing\" the graph. In other words, it keeps track of operations the PyTorch model uses to process a dummy input. Each operation is then converted to ONNX format.\n", - "* The dummy input here is a CNN news excerpt because it is most similar to what our extension will be processing\n", - "\n", - "* [ONNX documentation](https://pytorch.org/docs/stable/onnx.html#functions)" - ], - "metadata": { - "id": "1NvpHAAWKzSq" - } - }, - { - "cell_type": "code", - "source": [ - "TEXT = \"\"\"Elon Musk sold $3.95 billion worth of Tesla stock since completing his purchase of Twitter late last month. \n", - " Musk’s Tesla stock sales, totaling 19.5 million shares, have been widely anticipated ever since the Tesla CEO\n", - " reached a deal to buy Twitter for $44 billion. Musk had sold blocks of Tesla shares worth a total of $15.4 billion\n", - " earlier this year since his deal to buy Twitter was announced. Twitter confirmed Musk bought the social media company\n", - " October 27, but he waited until November 4 to start selling additional Tesla shares. He also sold blocks of Tesla \n", - " stock on Monday and Tuesday this week, according to filings to the Securities and Exchange Commission late Tuesday night. \n", - " It’s not clear if the money Musk raised went toward the Twitter purchase, or to support losses at Twitter since he \n", - " took over. Musk disclosed last week that Twitter has seen a “massive drop in revenue,” as a growing number of advertisers \n", - " pause spending on the platform in the wake of his takeover of the company. He blamed “activist groups” pressuring \n", - " advertisers for the loss of ad dollars.\"\"\"" - ], - "metadata": { - "id": "5vbhRvhuVckE" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "def generate_onnx_representation(model):\n", - " \"\"\"Exports a given BART model to onnx\"\"\"\n", - " (\n", - " simplified_encoder,\n", - " decoder_with_lm_head,\n", - " decoder_with_lm_head_init,\n", - " ) = turn_model_into_encoder_decoder(model)\n", - "\n", - " model_config = model.config\n", - " \n", - " encoder_path, decoder_path, init_decoder_path = get_model_paths(\n", - " model_config._name_or_path, saved_models_path, quantized=False\n", - " )\n", - "\n", - " # creating dummy inputs\n", - " tokenizer = AutoTokenizer.from_pretrained(model_config._name_or_path)\n", - " sample_input = TEXT\n", - " model_inputs = tokenizer(sample_input, return_tensors=\"pt\")\n", - " input_ids = model_inputs[\"input_ids\"]\n", - " attention_mask = model_inputs[\"attention_mask\"]\n", - " \n", - " batch_size = 1\n", - " n_heads = model_config.decoder_attention_heads\n", - " seq_length_a, seq_length_b = input_ids.shape\n", - " d_kv = model_config.d_model // n_heads\n", - "\n", - " input_ids_dec = torch.ones((batch_size, 1), dtype=torch.int64)\n", - " attention_mask_dec = torch.ones((batch_size, seq_length_b), dtype=torch.int64)\n", - " enc_out = torch.ones(\n", - " (batch_size, seq_length_b, model_config.d_model), dtype=torch.float32\n", - " )\n", - " sa = torch.ones(\n", - " (batch_size, n_heads, seq_length_a, d_kv), dtype=torch.float32\n", - " )\n", - " ca = torch.ones(\n", - " (batch_size, n_heads, seq_length_b, d_kv), dtype=torch.float32\n", - " )\n", - " # (self attention keys, self attention values, cross attention keys, cross attention values)\n", - " attention_block = (sa, sa, ca, ca)\n", - " past_key_values = (attention_block,) * model_config.decoder_layers\n", - " flat_past_key_values = functools.reduce(operator.iconcat, past_key_values, [])\n", - "\n", - " decoder_all_inputs = tuple(\n", - " [input_ids_dec, attention_mask_dec, enc_out] + flat_past_key_values\n", - " )\n", - "\n", - " # Exports to ONNX\n", - " with torch.no_grad():\n", - "\n", - " decoder_inputs = [\n", - " \"input_ids\",\n", - " \"encoder_attention_mask\", \n", - " \"encoder_hidden_states\", \n", - " ]\n", - " pkv_input_names = [\"pkv_{}\".format(i) for i in range(len(flat_past_key_values))]\n", - " decoder_input_names = decoder_inputs + pkv_input_names\n", - " decoder_output_names = [\"logits\", \"output_past_key_values\"]\n", - "\n", - " dyn_axis_general = {0: \"batch\", 1: \"sequence\"}\n", - " dyn_axis_pkv = {0: \"batch\", 2: \"seq_length\"}\n", - " \n", - " dyn_axis = {\n", - " \"input_ids\": dyn_axis_general,\n", - " \"encoder_attention_mask\": dyn_axis_general,\n", - " \"encoder_hidden_states\": dyn_axis_general,\n", - " \"logits\": dyn_axis_general,\n", - " \"output_past_key_values\": dyn_axis_general,\n", - " }\n", - "\n", - " dyn_pkv = {\n", - " \"pkv_{}\".format(i): dyn_axis_pkv\n", - " for i in range(len(flat_past_key_values))\n", - " }\n", - "\n", - " dyn_axis_params = {**dyn_axis, **dyn_pkv}\n", - "\n", - "\n", - " # export decoder to use past key values\n", - " torch.onnx.export(\n", - " decoder_with_lm_head,\n", - " decoder_all_inputs,\n", - " decoder_path.as_posix(),\n", - " export_params=True,\n", - " do_constant_folding=False,\n", - " opset_version=12,\n", - " input_names=decoder_input_names,\n", - " output_names=decoder_output_names,\n", - " dynamic_axes=dyn_axis_params,\n", - " )\n", - " \n", - " # export initial decoder to produce past key values\n", - " torch.onnx.export(\n", - " decoder_with_lm_head_init,\n", - " (input_ids_dec, attention_mask_dec, enc_out),\n", - " init_decoder_path.as_posix(),\n", - " export_params=True,\n", - " do_constant_folding=False,\n", - " opset_version=12,\n", - " input_names=[\n", - " \"input_ids\",\n", - " \"encoder_attention_mask\",\n", - " \"encoder_hidden_states\",\n", - " ],\n", - " output_names=decoder_output_names,\n", - " dynamic_axes={\n", - " # batch_size, seq_length = input_shape\n", - " \"input_ids\": dyn_axis_general,\n", - " \"encoder_attention_mask\": dyn_axis_general,\n", - " \"encoder_hidden_states\": dyn_axis_general,\n", - " \"logits\": dyn_axis_general,\n", - " \"past_key_values\": dyn_axis_general,\n", - " },\n", - " )\n", - "\n", - " # export encoder\n", - " torch.onnx.export(\n", - " simplified_encoder,\n", - " args=(input_ids, attention_mask),\n", - " f=encoder_path.as_posix(),\n", - " export_params=True,\n", - " opset_version=12,\n", - " do_constant_folding=True,\n", - " input_names=[\"input_ids\", \"attention_mask\"],\n", - " output_names=[\"hidden_states\"],\n", - " dynamic_axes={\n", - " \"input_ids\": {0: \"batch\", 1: \"seq_length\"},\n", - " \"attention_mask\": {0: \"batch\", 1: \"seq_length\"},\n", - " \"hidden_states\": {0: \"batch\", 1: \"seq_length\"},\n", - " },\n", - " )\n", - "\n", - " return encoder_path, decoder_path, init_decoder_path" - ], - "metadata": { - "id": "bVAZHW_SnV1p" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# MOMENT OF TRUTH!\n", - "# Sometimes this will not work. Try re-reunning the cell or refreshing the notebook, restarting your runtime and \"Run All\".\n", - "# Look in the file paths specified below to check they are generated.\n", - "onnx_model_paths = generate_onnx_representation(model)\n", - "onnx_model_paths" - ], - "metadata": { - "id": "_HiQsj-WrKrt" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "import onnx\n", - "#Validating ONNX models, may crash due to RAM restrictions\n", - "try:\n", - " onnx.checker.check_model(\"/content/models/bart-large-cnn/encoder/model.onnx\")\n", - "except onnx.checker.ValidationError as e:\n", - " print(f\"Encoder model is invalid: {e}\")\n", - "else:\n", - " print(\"Encoder model is valid!\")\n", - "\n", - "try:\n", - " onnx.checker.check_model(\"/content/models/bart-large-cnn/decoder/model.onnx\")\n", - "except onnx.checker.ValidationError as e:\n", - " print(f\"Decoder model is invalid: {e}\")\n", - "else:\n", - " print(\"Decoder model is valid!\")\n", - "\n", - "try:\n", - " onnx.checker.check_model(\"/content/models/bart-large-cnn/init-decoder/model.onnx\")\n", - "except onnx.checker.ValidationError as e:\n", - " print(f\"Initial decoder model is invalid: {e}\")\n", - "else:\n", - " print(\"Initial decoder model is valid!\")" - ], - "metadata": { - "id": "7oecfdoqpKi5" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "!du -h models/" - ], - "metadata": { - "id": "V8-7x2OA5oz2" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "import os, psutil\n", - "\n", - "os.environ[\"OMP_NUM_THREADS\"] = str(psutil.cpu_count(logical=True))\n", - "os.environ[\"OMP_WAIT_POLICY\"] = \"ACTIVE\"\n", - "\n", - "from onnxruntime import (\n", - " GraphOptimizationLevel,\n", - " InferenceSession,\n", - " SessionOptions,\n", - " ExecutionMode,\n", - ")\n", - "\n", - "def get_onnx_runtime_sessions(\n", - " model_paths,\n", - " default: bool = True,\n", - " opt_level: int = 99,\n", - " parallel_exe_mode: bool = True,\n", - " n_threads: int = 4,\n", - " provider=[\n", - " \"CPUExecutionProvider\",\n", - " ],\n", - ") -> InferenceSession:\n", - " \"\"\"\n", - " Optimizes the model\n", - " Args:\n", - " path_to_encoder (str) : the path of input onnx encoder model.\n", - " path_to_decoder (str) : the path of input onnx decoder model.\n", - " path_to_initial_decoder (str) : the path of input initial onnx decoder model.\n", - " opt_level (int) : sess_options.GraphOptimizationLevel param if set 1 uses 'ORT_ENABLE_BASIC',\n", - " 2 for 'ORT_ENABLE_EXTENDED' and 99 for 'ORT_ENABLE_ALL',\n", - " default value is set to 99.\n", - " parallel_exe_mode (bool) : Sets the execution mode. Default is parallel.\n", - " n_threads (int) : Sets the number of threads used to parallelize the execution within nodes. Default is 0 to let onnxruntime choose\n", - " provider : execution providers list.\n", - " default : set this to true, or it will choose the best settings for your hardware.\n", - " (you can test out different settings for better results.)\n", - " Returns:\n", - " encoder_session : encoder onnx InferenceSession\n", - " decoder_session : decoder onnx InferenceSession\n", - " decoder_sess_init : initial decoder onnx InferenceSession\n", - " \"\"\"\n", - " path_to_encoder, path_to_decoder, path_to_initial_decoder = model_paths\n", - "\n", - " if default:\n", - "\n", - " encoder_sess = InferenceSession(str(path_to_encoder))\n", - "\n", - " decoder_sess = InferenceSession(str(path_to_decoder))\n", - "\n", - " decoder_sess_init = InferenceSession(str(path_to_initial_decoder))\n", - "\n", - " else:\n", - "\n", - " # Few properties that might have an impact on performances\n", - " options = SessionOptions()\n", - "\n", - " if opt_level == 1:\n", - " options.graph_optimization_level = GraphOptimizationLevel.ORT_ENABLE_BASIC\n", - " elif opt_level == 2:\n", - " options.graph_optimization_level = (\n", - " GraphOptimizationLevel.ORT_ENABLE_EXTENDED\n", - " )\n", - " else:\n", - " assert opt_level == 99\n", - " options.graph_optimization_level = GraphOptimizationLevel.ORT_ENABLE_ALL\n", - "\n", - " # set this true for better performance\n", - " if parallel_exe_mode == True:\n", - " options.execution_mode = ExecutionMode.ORT_PARALLEL\n", - " else:\n", - " options.execution_mode = ExecutionMode.ORT_SEQUENTIAL\n", - "\n", - " options.intra_op_num_threads = n_threads\n", - "\n", - " encoder_sess = InferenceSession(\n", - " str(path_to_encoder), options, providers=provider\n", - " )\n", - "\n", - " decoder_sess = InferenceSession(\n", - " str(path_to_decoder), options, providers=provider\n", - " )\n", - "\n", - " decoder_sess_init = InferenceSession(\n", - " str(path_to_initial_decoder), options, providers=provider\n", - " )\n", - "\n", - " return encoder_sess, decoder_sess, decoder_sess_init" - ], - "metadata": { - "id": "zgISrAZc5rjk" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "from transformers.modeling_outputs import (\n", - " BaseModelOutputWithPast,\n", - " Seq2SeqLMOutput,\n", - " BaseModelOutput,\n", - ")\n", - "\n", - "class OnnxBartEncoder(torch.nn.Module):\n", - " def __init__(self, encoder_sess):\n", - " super().__init__()\n", - " self.encoder = encoder_sess\n", - "\n", - " def forward(\n", - " self,\n", - " input_ids,\n", - " attention_mask,\n", - " inputs_embeds=None,\n", - " head_mask=None,\n", - " output_attentions=None,\n", - " output_hidden_states=None,\n", - " return_dict=None,\n", - " ):\n", - " \n", - " encoder_hidden_state = torch.from_numpy(\n", - " self.encoder.run(\n", - " None,\n", - " {\n", - " \"input_ids\": input_ids.cpu().numpy(),\n", - " \"attention_mask\": attention_mask.cpu().numpy(),\n", - " },\n", - " )[0]\n", - " )\n", - "\n", - " return BaseModelOutput(encoder_hidden_state)\n", - "\n", - "\n", - "class OnnxBartDecoderInit(torch.nn.Module):\n", - " def __init__(self, decoder_sess):\n", - " super().__init__()\n", - " self.decoder = decoder_sess\n", - "\n", - " def forward(self, input_ids, encoder_attention_mask, encoder_hidden_states):\n", - "\n", - " decoder_outputs = self.decoder.run(\n", - " None,\n", - " {\n", - " \"input_ids\": input_ids.cpu().numpy(),\n", - " \"encoder_attention_mask\": encoder_attention_mask.cpu().numpy(),\n", - " \"encoder_hidden_states\": encoder_hidden_states.cpu().numpy(),\n", - " },\n", - " )\n", - "\n", - " list_pkv = tuple(torch.from_numpy(x) for x in decoder_outputs[1:])\n", - " out_past_key_values = tuple(\n", - " list_pkv[i : i + 4] for i in range(0, len(list_pkv), 4)\n", - " )\n", - "\n", - " return torch.from_numpy(decoder_outputs[0]), out_past_key_values\n", - "\n", - "\n", - "class OnnxBartDecoder(torch.nn.Module):\n", - " def __init__(self, decoder_sess):\n", - " super().__init__()\n", - " self.decoder = decoder_sess\n", - "\n", - " def forward(self, input_ids, attention_mask, encoder_hidden_states, past_key_values):\n", - "\n", - " decoder_inputs = {\n", - " \"input_ids\": input_ids.cpu().numpy(),\n", - " \"encoder_attention_mask\": attention_mask.cpu().numpy(),\n", - " #\"encoder_hidden_states\": encoder_hidden_states.cpu().numpy(),\n", - " }\n", - "\n", - " flat_past_key_values = functools.reduce(operator.iconcat, past_key_values, [])\n", - " \n", - " input_names = [x.name for x in self.decoder.get_inputs()]\n", - " inputs = [\n", - " input_ids.cpu().numpy(),\n", - " attention_mask.cpu().numpy(),\n", - " ] + [\n", - " tensor.cpu().numpy() for tensor in flat_past_key_values\n", - " ]\n", - "\n", - " decoder_inputs = dict(zip(input_names, inputs))\n", - " decoder_outputs = self.decoder.run(None, decoder_inputs)\n", - " \n", - " list_pkv = tuple(torch.from_numpy(x) for x in decoder_outputs[1:])\n", - " out_past_key_values = tuple(\n", - " list_pkv[i : i + 4] for i in range(0, len(list_pkv), 4)\n", - " )\n", - "\n", - " return torch.from_numpy(decoder_outputs[0]), out_past_key_values\n", - "\n", - "class OnnxBart(BartForConditionalGeneration):\n", - " \"\"\" creates a BART model using onnx sessions (encode, decoder & init_decoder)\"\"\"\n", - "\n", - " def __init__(self, config, onnx_model_sessions):\n", - " \n", - " # we need to call init of BartPreTrainedModel to not create self.model as \n", - " # BartForConditionalGeneration.__init__ would do!\n", - " super(BartForConditionalGeneration, self).__init__(config)\n", - " \n", - " assert len(onnx_model_sessions) == 3, \"all three models should be given\"\n", - "\n", - " encoder_sess, decoder_sess, decoder_sess_init = onnx_model_sessions\n", - "\n", - " self.encoder = OnnxBartEncoder(encoder_sess)\n", - " self.decoder = OnnxBartDecoder(decoder_sess)\n", - " self.decoder_init = OnnxBartDecoderInit(decoder_sess_init)\n", - " \n", - " @property\n", - " def device(self):\n", - " return \"cpu\"\n", - "\n", - " def get_encoder(self):\n", - " return self.encoder\n", - "\n", - " def get_decoder(self):\n", - " return self.decoder\n", - "\n", - " def get_output_embeddings(self):\n", - " return None\n", - " \n", - " def forward(\n", - " self,\n", - " input_ids=None,\n", - " attention_mask=None,\n", - " decoder_input_ids=None,\n", - " decoder_attention_mask=None,\n", - " head_mask=None,\n", - " decoder_head_mask=None,\n", - " encoder_outputs=None,\n", - " past_key_values=None,\n", - " inputs_embeds=None,\n", - " decoder_inputs_embeds=None,\n", - " labels=None,\n", - " use_cache=None,\n", - " output_attentions=None,\n", - " output_hidden_states=None,\n", - " return_dict=None,\n", - " ):\n", - "\n", - " if encoder_outputs is None:\n", - " # Convert encoder inputs in embeddings if needed\n", - " # (when using generate, we already get encoder_outputs generated\n", - " # by _prepare_encoder_decoder_kwargs_for_generation)\n", - " encoder_outputs = self.encoder(\n", - " input_ids=input_ids, attention_mask=attention_mask\n", - " )\n", - "\n", - " encoder_hidden_states = encoder_outputs[0]\n", - "\n", - " if past_key_values is None:\n", - " # runs only for the first time:\n", - " init_onnx_outputs = self.decoder_init(\n", - " decoder_input_ids, attention_mask, encoder_hidden_states\n", - " )\n", - " logits, past_key_values = init_onnx_outputs\n", - "\n", - " else:\n", - " if decoder_input_ids is not None:\n", - " decoder_input_ids = decoder_input_ids[:, -1:]\n", - "\n", - " onnx_outputs = self.decoder(\n", - " decoder_input_ids,\n", - " attention_mask,\n", - " encoder_hidden_states,\n", - " past_key_values,\n", - " )\n", - "\n", - " logits, past_key_values = onnx_outputs\n", - "\n", - " return Seq2SeqLMOutput(logits=logits, past_key_values=past_key_values)" - ], - "metadata": { - "id": "56OS2sJd5t97" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "encoder_path, decoder_path, init_decoder_path = get_model_paths(\n", - " MODEL_PATH, saved_models_path, quantized=False\n", - ")\n", - "onnx_model_paths = encoder_path, decoder_path, init_decoder_path\n", - "onnx_model_paths" - ], - "metadata": { - "id": "OtC8lBIR5v3g" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# Warning! May crash due to CoLab RAM restrictions\n", - "onnx_model_sessions = get_onnx_runtime_sessions(onnx_model_paths, default=True)\n", - "onnx_model_sessions" - ], - "metadata": { - "id": "MOYswi3N51J7" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "for path, session in zip(onnx_model_paths, onnx_model_sessions):\n", - " print(\"---\")\n", - " print(\"path:\", os.path.join(*path.parts[-3:]))\n", - " inputs = list(map(lambda x: x.name, session.get_inputs()))\n", - " print(f\"inputs({len(inputs)}):\", inputs)\n", - " outputs = list(map(lambda x: x.name, session.get_outputs()))\n", - " print(f\"outputs({len(outputs)}):\", outputs)" - ], - "metadata": { - "id": "tKZ5rvW26baW" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "config = AutoConfig.from_pretrained(MODEL_PATH)\n", - "onnx_model = OnnxBart(config, onnx_model_sessions)" - ], - "metadata": { - "id": "rFzo-kd36c3E" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "def summarize(model, t_input):\n", - " inputs = tokenizer.encode(t_input, \n", - " return_tensors='pt', \n", - " #max_length=tokenizer.model_max_length, \n", - " #truncation=True, \n", - " #padding=True,\n", - " )\n", - " summary_ids = model.generate(inputs, \n", - " #min_length=0, \n", - " #max_length=100, \n", - " #length_penalty=15, \n", - " #repetition_penalty=1, \n", - " #early_stopping=True, \n", - " num_beams=3,\n", - " )\n", - " output = tokenizer.decode(summary_ids[0], skip_special_tokens=True)\n", - " return output" - ], - "metadata": { - "id": "Xd66qvZT6xa2" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "import time\n", - "t0 = time.time()\n", - "print(summarize(model, TEXT))\n", - "t1 = time.time()\n", - "print(t1 - t0)" - ], - "metadata": { - "id": "XXiRFLatFJvy" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "t0 = time.time()\n", - "print(summarize(onnx_model, TEXT))\n", - "t1 = time.time()\n", - "print(t1 - t0)" - ], - "metadata": { - "id": "kVeY9xN3Ff35" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## **TODO**\n", - "\n", - "* REVIEW CODE: As you can see in the cells above, the run time did not improve much. Also, the outputs from both models are different, so there is likely a bug somewhere in the ONNX conversion.\n", - "* Apply quantization, CoLab RAM pls don't let me down 🙏.\n", - "* Look into graph optimizations of the converted model.\n", - "\n", - "### On a side note...\n", - "\n", - "This is a very small excerpt of the converted decoder, visualized using [netron](https://github.com/lutzroeder/netron)!\n", - "\n", - "It's really neat to see the whole model \"flattened\" on a graph.\n", - "\n", - "The actual image is huge, and couldn't be put on this notebook." - ], - "metadata": { - "id": "hxrOJkwqwmu3" - } - }, - { - "cell_type": "markdown", - "source": [ - "![decoder_excerpt.PNG](data:image/png;base64,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X37J1C1Fg9F+txSF3/xuKU899ZR1S1HwTJ9X6o5Up04d65airiP63NTAruba1kCpBrELFy6c6TO2IKpo0aLumGOOscCMBs8VoFGHJ4VSFKxRKEUDvPr/QnOlK5SiqxE1WK3uTwqlaB5yhVI0hY/mQfen8FHHGbXL1j7VvgUAAACyomlT9L37jTfesKkja9WqZaHpvYW5DzjgAOsSorENTbuirhxvv/22fS+tV6+eHQPnRdeK3FRWoQsqd0U4BIge4RAAAAAghemqDl0l/v7771v7zvvuu89OTmqg5MADDwwcSAkvTe9w3nnn2clAXYGv8IemUtGBt6aUyW/JHg5ZtmyZXVGUXYVfhRTvIhwCJKY//vjDPmP1maFuKT/99JMNJOt3ddy4cRbCe++996wziLqlqFOIwhnqHKKwhjqJKLyhEIc+vxXq0BWF6paidtUKfZQuXdpCIAqDRH7253epU0rx4sVtOq6TTjrJBswrVqxo0w7VqFHDrkxUwEaf/QrchE/f88ILL9j/TRrwHzx4sHWnUkcZ7St1mNG+++233+zkwvr169327du9vQwAAICCpO9lOsZXF8COHTtap1JNheJ3mciu9N1R3xdvuukmmzr2lVdese+BCnNnN1ah78fpGg5RN0aF3oPGIfzS7frOHHT/RCzCIUD0CIcAAAAASWz37t124lAnwnQ1jQIcmjZBJ/80PULQIEp4qQWorgq//vrr7WRbjx497EpvnUzTgXaiSfZwiFq9Rv4MIis/B4kIhwAIpwF6hQoVpNDgsFpdK2Co9taaliYolBI0hY9aS+v/omuuucZCKZperEKFCu700093pUqVckcddVRCdErR/5OaTih86p6qVavaVaaal15dscIDKa1bt7YTFy+++KL9n6upjLQ/tF8U2tF+8qftoUMKAACAc4sXL7aOHTrOVbdRBZc1BpGTgLLCzPouqdCzvoO98847NrWkAgwaC8mNdA6H+M8dtK/9ymqKnEQtwiFA9AiHAAAAAAlu9erVbtKkSTb1i66SbtiwoU1LcMIJJwQezIfXwQcf7M4880xrv6o2rGr5//HHH9v8rps3b/aeIXkwrUzeFuEQAIlg27ZtdiXj0qVLbd50/R+lAXsN/n/yySdu+PDh9n+g5lUPn75HgbuHH37YumJpnnldOar/76644gqbCkefbwp9KPyhEEhOQpPxLP2ffPjhh7uSJUu6U045xaYW0hRD+j/96quvtqCmgjUK2Chooy4waoPetWtXC29q+qJBgwbZ/tB+0Xzvkd1RFO7ZsWOHt2cBAADiS+HiWbNmuQ8//NA6uilUq26lmqp23333DfxO5NchhxziypUrZ9MvKojrdyrV4+l4NR7SORySikU4BIge4RAAAACggO3cudP9/PPPNgiikz860aUrljVIosGSoEGU8FLLVbVeVWBCJ8t04ui7775zq1at8p4hdehKbB3416xZM3BgILsiHJK5dFW89qcG3wAgnShA4XdJUbBCAQsFLRRI0f8TOsERFEh54oknQoEUDUZr3nr9n1StWrXQtD2J0iElfLoenaDR94pKlSrZd4achlG0D7Qv/Kl6dEIjvDNKMgZNAQBAdPT//Y8//mgd05577jm7YEXd1o477rjA7yDhpWkMq1Sp4ho0aGDfM9T949tvv7VQcEFQFxIdAytoG3SMHO8iHJK3pWC4fp4KmAPIGcIhAAAAQD7QwIdOqqgFvdrv62oVDZDoSuagAZTwKlKkiLXj10mcli1b2tU0OnGlg9+//vrLe4b0of2mg/8lS5YEDg5QOSvNI3zeeefZvlRACQAQX1u3bnVr1qxxv//+u5s3b55d4ajOYF988YUbPXq0e//9992AAQPcm2++GZqyp23btjaPfpMmTexEzC233OJq167tatSo4S6++GL7HFd3lBNPPNFOvuSkRXu86tBDD3VHHnmkdTZTQEZBGXVwUScXDdyHT9Oj7zNt2rSxE0x6rXrNeu3Dhg2zfaF9MnnyZAsvavo8vysK/18BABAf69ats/97Bw4c6Nq1a2djFhdccIE74ogjAv/f92ufffaxjmhXXXWVdabU9HvqVqrgrb77JBqFYXUMrPBv0HEylTylC6L0s1RpfANAzhAOAQAAAPLApk2b3LRp09wHH3xgVxf7rVRPPfVUd8ABBwQOooSXWt7rqmNdxdK5c2e7IkdXlHCAm5lOjungf8KECYEDBFTOSlfIaz9qzmcAQOr5448/7ERPZBhF/38qgKEgRmQYRQFWBTf8MIoCHepmVr16dQtnnnvuua5s2bIF3hlFU/ToZJW6p5122mkWolXnlsggil6HwjV6Xfp+pen1evfubSe+ND2PwrbqFqPvXLNnz7aOKDrRQEcUAEAqUtevb775xr399tvuqaee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gBSi9r1q9agWvY0aNXIXXXSRzf8cOWDil6aCOfvss92tt97qOnToYFdY6aorAAAAAACQtxS2WL58uXX8UOcPTbujbieaksafdkcBlK5du9qFGo899phr0qSJu+uuu+ziDXU9UacRdRzRBR35FUA56KCDbGzh5JNPduecc46FYGrWrOluu+02d99999l2Kmii7qIKmijModelbi4zZsywKXZWrlyZbbeOzZs3u6+//tr16NHDxjPOO+88d+CBBwZuj+rUU0+1bit63o8//tgtWrTIeyQAeUkXjOl37phjjnELFizwlgJIVoRDAAAAkpSuYlInEM13rDlyNSAUOVjilwZylPRv0KCB69Spkw2caDAKAAAAAACkjg0bNrhly5a5efPmhabb0UUkH330kRs0aJBNxaIOAM8995xr06aNdRFR95O6detahxEFT04//XSbUjaeoZNDDz3UFS1a1J4juxCIxjPULUShGE0N1K1bN5veVl1BNC6ik9W6UIZOp0D8XH/99fb72LhxY28JgGRFOAQAACDBhXcDUbhDbWEjB0vCS7drPQ2YjB49mqtnAAAAAABArm3dutWtWLHCOo3+8MMP7osvvrCwiS5YUaeTzp07uyeffDJT0ERT7CjYccQRR1jIY7/99gscx8jLOuSQQ6zLSZkyZVy5cuWso2r16tVtSprbb7/dOp20bNnSpqnRuMkbb7zhBgwYYJ1UNa2OwjTq6kLoBPgf/V74v2PqdAQgeREOAQAASCCa13fgwIE56gai27SO1tWAjK6YAQAAAAAAyG/bt2+3aWFeeuklm25G3UeCxjJUxYoVc5UrV7bpcp599lnXr18/N378eDdixAibwqJPnz42RY26myh00qxZM5tq5pZbbnG1atVyl19+uXU4OfPMM12pUqUsfFKoUKHA58qrUqcTTauhqXUqVKjgLr74YnfVVVfZ1DZ6HQrGPPHEE65jx4627X379rWpgnTRjvbLtGnT3Pz58216HYVtgGTz8MMP2+9ClSpVvCUAkhHhEAAAgAKgeXb9uXTvvvtum/Iluyto/G4g6h6iLiK6egUAAAAAACC//fXXX27SpEk2pqFOIWeccUbgWIaqbNmy7uabb7agh4ISS5cu9R4lPjTeoi4nmkpX0+pMnDjRffrpp27YsGGuf//+1umka9eurm3btu6RRx5x9957r4VZateubd1Ozj///FDo5PDDDw98TXlV6nKiC3/CAydXX321u+mmm2ysqHnz5q5169auS5cutt1+h5PPP//cTZ482c2ZM8ctWbLEphIC4k2/u/5FbO+++663FECyIRwCAAAQZzpQ//jjj+1qGLVWVWvTyAEBv4488kh3xRVX0A0EAAAAAAAUuH/++cemktH0KwosZDfVrW5Th48333zTTZ061f3555/eoyS/TZs2uWXLltnUOnptX331lRs1apQbMmSIdTp5+eWXXYcOHVyrVq3cgw8+6O688053ww03uCuvvNJVrVrVnX322TYepClvNMVO0P7Li1IXlRNPPNF+FnpedTepV69eKGzSpk0bC8fo56nOtRqv+vLLL+01zZs3zzqbbNu2zXvVQEYar9T77Nprr/WWAEg2hEMAAADy0OLFi93777/vHnvsMXfppZdaq9TIA3W/Tj31VDtA96+eWb58ufcoAAAAAAAA+U/dKN5++213//33W5fToPEM1SmnnGIdNxSK+Pbbb92uXbu8R0BObd682caC/MCJQhojR460rgy9evVyL774onvmmWfshPx9993n6tev76677jqbVqdixYo2dU+JEiVckSJFAn9GsVbRokVdyZIlrTOMOqpUr17dXX/99TaNzkMPPRTqauIHTTQtkF6DptD57bff3Jo1a9zOnTu9V4tUoIvY/PeHuvIASD6EQwAAAHJJU7voKpGnn37a2n7q6ozwg2i/NO+tDqJ1IK8DZrVe1Vy8AAAAAAAABUWdMDRNibpdXHbZZTbNSdC4xvHHH2+dUDt16uQ+++wzCzUg8fzxxx9u1apVNqWOAhqazljjVoMHD7awyQsvvODatWtn0+k0btzY3XLLLdYB4pJLLrFpbU466STraKtxrKD3QSylKXrU0UTPo+erWbOmhYsUQnr88cddx44d3auvvmpT53z00UcWMvnxxx9DIRMkDk17rZ/pAw884C0BkEwIhwAAAOTA1q1b3YQJE+yKCLUFPeGEEzId6Kr+85//uCpVqriHH37YrvTQ1R8AAAAAAAAFSeMan3/+uQU86tSp44477rjAcQ11QK1Ro4ZNP6IuFgobID1t2LDBOuT+9NNP1h3m008/dUOHDnV9+/Z1L730kk2f3LJly1DQ5JprrnEXX3yxTaFTunRpV7x48cD3WCylaXlOPvlk62pTrVo1Cy2pk0mzZs1c27ZtLQCjaX7U1Vfv9ylTptjYnN7HO3bs8F4ZYjFu3Dj7WaizzO+//+4tBZAsCIcAAAAEmDlzps2R27BhQ2ufGXkw6tc555zj7r33Xjvw1H0AAAAAAAAK2ooVK9x7773nHnzwQVe+fPnAMY199tnHOp1qihBNCzJ//nzv3kDeUShD3XfV0UTdQNQVRN1B1CVE3UI03bK616gThbqJqKuIuovEK2Si7iiaFum8885zV1xxhV0E1qhRI+uo0r59e/fKK6/YtmmaHHVf0TbPmzfPpgDasmWL96rSmwJk2pedO3f2lgBIFoRDAABA2lu5cqUdlOpA9NJLL82yfabmclXrxB49etjUMLt37/YeAQAAAAAAoODoxPtbb71lJ7nPPPPMLMc17rjjDvfaa6+5H374wbsnkBw0bY5CT7/88ot1BFEHC3UI0QVb/pQ5zZs3t04i6iiiziLqMKJOI1lNBZ3bOuiggyxkUqZMGQtfVa5c2QITCprceeedFsrSOKM69fTs2dOCWpqSSb93CxYssK4syeydd96x/VCuXDlvCYBkQTgEAACkHc27+vLLL7ubbropy+lhNBeq5l3VFQPjx4/nygAAAAAAAJAwNFWGpvfILgyizgtNmzZ1w4cPd5s2bfLuCaSv7du320ViCphMnjzZpspRcEPdg7t27WpT0/gdTDRNTtWqVe336KSTTnJHH320O+SQQwJ/13JbmppF3VHOPfdcC7PceOONNk3PE088YVNb9+7d233wwQfuq6++crNmzXLLli2z15AISpUqZa9B03ADSB6EQwAAQMrTwZ4O8BT2OOywwzIdiKkqVqxoAyaDBg1yv/32m3dPAAAAAACAgqfupbp45amnnnIXXnhh4NiGpslQxwKd7F6zZo13TwB5bevWrRYyUcee6dOn2/QzY8aMcUOHDrUOPt27d3cdO3Z0jz32mLvnnnuso8jll1/uKlSoYKGKIkWKBP4OR1PHHnusO+uss9zFF1/s6tSp4+6++2736KOP2lQvCpV8+OGHtl1z5sxxq1at8rY876i7srajdevW3hIAyYBwCAAASDnfffede/75562FpFL9kQdPCohcd9117sUXX7R19+zZ490TAAAAAAAgMSxcuNBONN9+++2uZMmSmcY3LrjgAvfwww9bGEQdBQAkl3Xr1lnA5Pvvv3djx451Q4YMca+//roFSx555BGbIkdjmBdddJE744wzAsc5oymFUk488US7SO6qq65y9evXd82aNXMdOnSw5/Wnv1Hg5ffff7epfLKi6Xz0mJpSB0DyIBwCAACSnq6GGTx4sCXxdYATeeBz1FFH2YGUuodMnTrVuxcAAAAAAEBi0bjFM8884y655JJM4xtHHnmkq1evnp3E1bQYANLTtm3bLLwxY8YMm9bl/ffft6lxOnXq5Fq2bGmhklq1arkqVaq4U0891abPjvw8iaaOO+44V65cOXfppZdaF5R7773XPfTQQ6Hb+/fv7yZNmmRBl40bN3pbCSAREQ4BAABJafbs2daiUaGPyPk+dTWNDlTUPeTbb7/17gEAAAAAAJB4fv75Z9etWzebHiJ8fEN17rnnWgeBUaNG2QlhAMit9evXu/nz51uQY+TIka5fv37uhRdesKlhFPjQeKoCIJquRtPWRH4eRVMKs5UtW9ZVrVrVujs3btzYnkednAcMGGDT8EyZMsUtWLDAbd682dtCAPFGOAQAACSNzz//3ObWPf/88zMdcGhe3SeeeMJaHwIAAAAAACSyxYsXu9dee82mdggf39hvv/3cNddcYxfEzJw501sbAAqGQmlLlixx06ZNs3FXTX2jz65nn33WpqfR55aCJBqbLV26tDv00EMzfKZFU3qc8uXLuyuuuMLdcsst1p2kffv2rmfPnm7YsGHu66+/tjDd2rVrva0DEC3CIQAAIGFpXsuspovZd999XY0aNezKGh2cAAAAAAAAJDKd0Hz77bfd9ddf7/7zn/+ExjgKFSrkateu7d544w23aNEib20ASGzqQKLPsOLFi3tL/mf58uUWcPviiy/c0KFDbTosBUoU+Lj11ltd9erV3TnnnOOOP/54d9BBB4U+D6OpI444wp1++uk2DZe6njzwwAP2HHouP0wyd+5ct2HDBm+rABAOAQAACWfy5Mk2P2apUqUyfeFXarxv3752hQ0AAAAAAECiUyfUu+++2xUrViw0xlG4cGF344032hjHsmXLvDUBILkcfPDB9pm2dOlSb0nuqUPJ1KlT3SeffGJTz2jKG3WR1uenpha/8MIL3cknn+yKFi0a+iyNpsI7k9x2223u4Ycfdp07d7bQnqa5+fHHH/k8RsojHAIAABLCpk2bXJ8+fdyVV16Z4Uu7OoY0adLEffjhh27Lli3e2gAAAAAAAIlr9+7drn///nZ1vD/GoavrdcW8TnquXr3aWxMAkleFChXs800huPy2YsUK604yYcIE9+6777qXX37ZPfnkk65Ro0auVq1arnLlyja2fMghh4Q+h3Nahx12mHUlueyyy9xNN91kHU+ee+45C/SNGjXK/fDDDwRJkJQIhwAAgAL1zTffuGbNmrnjjjsu9OVb8+vq6hlNKbNz505vTQAAAAAAgMSmaWE6duzoypYtGxrn0NXur7zyiluzZo23FgCkBgUn9DmnabESnTpRf//99xbueOutt6xrSIsWLayLSLVq1dyZZ55pnav9z+6clu5z1llnWUeSBg0auMcff9y99NJLNrataXU0tY0ujAQSAeEQAACQ7zTHrg4YLr/88gxfpCtVqmRfyufPn++tCQAAAAAAkPh08ct9991n08VojGP//fd3t99+uxs9erS3BgCknjZt2thnnqZoSSUrV650M2bMcJ999pl1e+rWrZt75JFHXP369a0jlMIg0QZJChUq5MqUKeMuuugiC9U0b97cde3a1Q0cODAUIqFzNuKNcAgAAMg3mjeybdu2Nr+j/6X46KOPdg888IAbP368txYAAAAAAEByGDdunE1f4I9zaBqCdu3a2Uk+AEh1Cjbos+/qq6/2lqQfTS+jaWZGjhzpevXq5dq3b2/j3XXq1HEXXHCBK1WqVOj/iJyUpsE5+eST3SWXXOLuvPNO98wzz1hARSFEprJBrAiHAACAuPv1119dq1at3OGHHx76knvNNdfYHI0bNmzw1gIAAAAAAEgOkyZNsivI/XGOa6+91k6S7t6921sDAFLf5MmT7TNQU7IgexoHnzNnjnUj6d+/v+vUqZNr2rSpu/766236sRNOOCH0f8re6pRTTnE1atSwjlVdunRxQ4cOtSlz1PEEyA7hEAAAEDc///yzzdvot1RVad7Fzz//3FsDAAAAAAAgecyePdvdf//9oXEOTS2gk3wAkI6WL19un4VFihTxliBW69atc7NmzXKffPKJe+2119yjjz5qAZIKFSq4okWLhv7/ya5Kly5tnUcUYmzdurVN8T5q1Cg3c+ZMt3HjRu+ZkI4IhwAAgDyn+RgffPBBd+CBB9qX0WLFitkcitOnT/fWAAAAAAAASB6///67e+yxx9zBBx9sYx368+mnn3Zbtmzx1gCA9LTvvvva5yKfh/lj8+bNbtq0ae6D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s127dvae0f4ID7pkFZzZsWOHu++++zLsK9G+1WsIf2z9rPQzC+c/7ooVK9zgwYPd+eefH9pmTfPj/4x8e/s5SE6fOz8RDgEAIEERDqHiUYRDAAAAAAAFjXAIFY8iHBI7wiFUPCrVwyFdunRx9evXdy+99JI9xrBhw+wxFS745ZdfvLX/DX5oPzRt2tSNHz/e6tZbb7XAwLfffmvrbN261U2cONGCEbr/yJEj7TH9x1GoQs+noIH/OLq9e/fu7qOPPrJ1/O165JFH3HXXXefee+89W6djx452v6eeeipDOGPPnj2uf//+7pxzznGTJk3ylv77XH379rXlkT+7qVOnulNOOcU9+uijFjLQdjRv3twNGTLEW8O51atXu9q1a9u+0D7RNigooiCFttcPW+jPd9991x111FEZ9o3+XrFiRXfsscfmOhwS/tht27a1bR0xYoSrWbOmq1KlioVnfHrcqlWr2uvwX5fWrVGjhitbtqybM2eOt2bOfg7RPHd+IhwCAECCIhxCxaMIhwAAAAAAChrhECoeRTgkdoRDqHhUqodD1NkiPAQiy5cvd5dddpl7/PHHQ+OwCxcutC4SfihCli1bZoEEhUHCl2cVgPj4448tbKDQQfj64fztigynKNCgYEjlypXdkiVLvKX/Cg+CKCAS+e9InTp1cldccYVbu3att+TfMMRff/1lf1fgROtce+21btWqVbZMtM7AgQMzbINCFwpfKGyh5/X5AQz9bHIbDvE7seg5w/eXtknbpkCPT4+r54rcjlmzZtn2ha+bk59DNM+dnwiHAACQoAiHUPEowiEAAAAAgIJGOISKRxEOiR3hECoelerhkCeffNLCEJF08j8yQBHJDzSo9HdfUADCX7dZs2Zu165d3tLM/O2KDJyIOlwosKDgQqTwQIi6jmQVDBGtp44n4VPihNPULNqvb775prfkf+bOnevKlSsX6pYyYMAAC7IsWrTI/h3OXze34RA9v7ZD2xNO26z9E77f9bh6Lj1nuM2bN7sbb7wxtD9z+nOI5rnzE+EQAAASFOEQKh5FOAQAAAAAUNAIh1DxKD8comkINA2ArsyuU6eOndTT1A133HGHu/vuu+2EnKYBePjhh91jjz1mV9LrRF2HDh3sivEXXnjBvfLKK+6NN95wvXv3dv369bOThpqaYfjw4TbNwyeffOI+++wz6wLw3Xff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CIcgHgiHAIlDnU/0flenlbzmT3OkaWfiMc0R4RAAQErjJD7igfdV4lGLRD9cojaIY8aMce+++64lvjUvpNoaqnNJZLhE7QkPOuigDEGR3JTmudRjKQWu94fa+ClcogN3zSWqNov6Iv7ee++5sWPHWmpdqX19wVfSHQAAAACixUl8xAPvq9gRDkE8EA4BEkc8wyHxRjgEAJDSOImPeOB9lXq2b9/uVqxYYelrP1yihLXm0ezUqZN7/PHHrWWgBscULtGcjqeddlqehUvUPlCPpcCKpty56qqr3C233BIKl6iVobZFgRelwDV1j9ojap7QzZs3e68CAAAAQDrhJD7igfdV7AiHIB4IhwCJg3AIAAAJipP4iAfeV4ikdn8rV660OS0nTZpk81cqXNKzZ08LdrRq1crdd9997uabb3ZXXnmldS5RuERT2eTVvJJFixZ1J5xwgitXrpzNa3nttde62267zabGIWACAAAApB5O4iMeeF/FjnAI4oFwCJA4CIcAAJCgOImPeOB9hbymqWVWrVrl5s6da/NFfvrpp27IkCGhcInCHQp5KOyh0IfCHwqBHH/88a5IkSIZQiKxFAETAAAAIHlwEh/xwPsqdoRDEA+EQ4DEQTgEAIAExUl8xAPvKySaf/75x23atMktWbLEzZo1y33zzTdu1KhRbtCgQe71118PTY2j7iWarubqq692lStXdmeeeaYrWbKkK1y4cIaQSCxVrFgxV7p0aVehQgV3ySWXuNq1a7s777zTNW/e3LVr1869/PLL7u2333Yffvih++KLL9z06dPdokWL3MaNG93ff//tvSIAAAAAe8NJfMQD76vYEQ5BPBAOARIH4RAAABJUopzE15QTOinbvn17bwmSGeEQpCIFMxTQWLx4sZsxY4b76quv3IgRI9w777zjXn31VdexY0f32GOPuXvvvdemx7nqqqvsd+GMM85wxx13nDvkkEMyhERyW+qEou4l5cuXdxdffLG77rrrXIMGDdxDDz3k2rZt61588UX31ltvueHDh9sB2I8//miDl+vXr3d79uzxXg0AAACQ+hLpJL6+j2sKTQXUkdwIh8Qur0/i8/sFIRwCJA7CIQAAJKjcnsTXwZYOunTwlReCwiHz5s1zZ599tvv222+9JclP+y38JG+qhmEIhwDBdu/e7datW2eDiQpt6ADpgw8+sDCHQh0K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pk2tU5u279dpMLXTYWyma9G6Wchj4MCBMm7cOJk7d6788MMPdrW3dvPg5AUAIDr0u007jGpQUbuwRvweKly4sPTq1Uu2bNnirA14y/33329/C0y/hLhCoCB88F7CSwiHAAgovapNT+pr28vEiRPbBxBFRbfuvPNOXweRFStWOFuXt5w9e9bCVfp3pP8PAADgNefOnbPpKjdu3CjfffedzJ492wIWGrR47733pEWLFtZtrkKFCnZCTLt46FQrsT0OIeQBAAgFFy9elIULF0q7du3sOyvid1nVqlVtjO706dPO2kD4c6dh0nAwEBcIFIQP3kt4CeEQAAGzdetW3wn9tGnT2ocPRcW0MmXKZNtStWrVnC3Me9wvcb3SFQAAIBRdu3ZN/vrrL/n9999tWpQFCxbIxIkT5aOPPpL333/fpmmpV6+eVKpUyaam1A5yOtVgsmTJrts/jE6lTJnSrh7VkwSlSpWSF198URo2bChvv/22dO/eXYYPH27TxehJNX1eeixz5MgRuXLlivPMAQAILRqkbNWqlWTJksX3fXjfffdZmDIUTw4A0aXd4HS7X7lypbMEiB0CBeGD9xJeQjgEQMC4XUOyZs1qHzwUFdvKmTOnbVNenTtX257r6/Daa685SwAAABKGdsbQDhnaKUM7ZmjnjPHjx8ugQYOsi4dOLVmrVi0pX768b5qW2AbGkydPbie1cufOLSVLlpQXXnhB6tevL61bt5YPPvhAhg4dakETDZz8+OOP1kZfn+OlS5ecZw0AgPecOXPGvqP1ezPi92qhQoWYdgZhrUSJEratL1u2zFkCxA6BgvDBewkvIRwCIGC0zbKeyE+XLp198FBUbOuBBx6wbWry5MnOVuYt2kJdXwdtjw4AABAXLly4IAcOHJBNmzbZFcazZs2SMWPGSP/+/aVjx47StGlTqVmzppQpU0aefPJJ2x9LlSrVdftpt1q33Xab3HPPPfLII4/Y1C/PPfecvPLKK/LWW29Jt27drIPI559/LvPmzbPQyebNm+XgwYP2PAEAQOzouIJ26nKn23BLu2l9//33zlpAeND9V92+v/nmG2cJEDsECsIH7yW8hHAIgICpUaOGnchPkSKFffBQVGxLQxG6TemJA6+699577bWIOl+qnsgBAADepFO1HD16VLZt2yarVq2SRYsWyZdffikjRoyQnj17Stu2ba3z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DBs2TKpXry6ZMmXyH3QVLFjQuomsWbPGtxYAAAAAAACASHbkyBH5+++/7ULjgAEDrEPx+++/Ly+99JI8+eSTkiNHDrnyyiv95xgvVNddd508/PDDUrp0aXnzzTfliy++kJ9//lnGjRtnwQ+6fwBA8hEOAQAACdq8ebO1btQDucCDtMKFC1sif9KkSdbqEQAAAAAAAID36bm+qKgo6/IxY8YMGT58uPTq1Uvat28vH330kbzyyitSrFgxG9uiHTwCzxleqK666iq5//77pUSJEtbxo3nz5tKjRw8ZPXq0LF++nOAHAIQZ4RAAAJAk2vJRU//asjHwoC579uzW/lFnd27ZssW3NgAAAAAAAIC0dOrUKdmxY4csXbpUJk6cKL/++qt07dpVvvzySzvP9+qrr0rZsmWtY/C9994rN9xwQ5zzfheqK664Qu68807Jnz+/jYbRTsQNGzaUNm3ayE8//WTBktmzZ8v69evl8OHDvq0CAKQVwiEAAOCi6QcHnQmaN2/eeAeFRYoUkU8++URGjRplB6AAAAAAAAAAUu7o0aOyadMmmTdvnvz111/St29fGwOt5+lq1aolzz33nDzxxBMW9Lj++uvjnbdLSun9tCvIU089JS+++KLUr1/fRrt0795d/vzzT8IeAOBhhEMAAECKzJw5Uz777DP7hkHwwaTOCC1Tpox8/fXXsnjxYt89AAAAAAAAgMimI1Q2btwo8+fPl7Fjx8ovv/wi3333nbRo0cICGVWrVpVnnnnGunJky5bNRrIEn3tLSl166aVy6623Su7cuaV48eL2uA0aNJCvvvpKfv75Z/uCl27D1q1b5cSJE76tAwBkRIRDAABAyOhs0B9//FGqVatmLSWDD0Zvu+02qVGjhvTu3VvWrl3ruxcAAAAAAADgTcePH5ft27fbebGpU6fK0KFDpWfPnvZlqY8//lhq164tzz//vHXbfeihh+SWW26xwEbwebOk1tVXX21jnh999FH7UpaOhnFGuejzancP/TLXmjVr5MCBA76tBACAcAgAAAijuXPnStu2baV06dJ24Bp8MKsHwxUrVpRvvvnG1gUAAAAAAABS27lz52T//v02LkVHtmgnj0GDBkmXLl2kVatWFr54/fXXpUKFChbyyJUrl30JKrndPJzSES733HOP/Pe//7XzZ6+88oq8++678vnnn8v3339v3UR0WxYsWCCbN2+W6Oho3xYDAHDxCIcAAIBUM336dGnZsqW1xHQLi1x22WVStGhRadasmYwZM0aOHDniuycAAAAAAAAQ37Fjx2Tnzp3WKUPHo+gFL+2e0b9/f+natat9calp06YWuqhZs6ZUqlRJSpYsaYEMDWbccMMN8c5RXUxdeeWV9gWo++67TwoUKGCjWypXrixvv/22fPrpp9KhQwfrojtixAiZMWOGrF69WqKiouTMmTO+PQAAIHUQDgEAAGlm8eLF9i2Il19+2XUMjdaDDz5oo2h05uqsWbPk1KlTvnsDAAAAAADAq2JjY61bx4YNG6wzxoQJE+T333+XHj16SLt27VwDHY8//riNZtHzSJkzZ3Y9l5TUuvzyy+Wmm26SHDlySL58+eTpp5+W8uXLS/Xq1aVu3brSpEkTG9Wi3UM0aDJ8+HCZMmWKLFq0yDqM7N27V06ePOnbGwAA0j/CIQAAIN3Q9pjaLlMPwPPkyRPvoN2pvHnzyhtvvCHdunWThQsX+u4NAAAAAACA1HT06FHZtm2brFixQmbOnCl//fWXDBgwQH744Qf58ssvpVGjRlKrVi154YUXpFixYnZO56677kpxsENLR7rceuutkjNnTguN6FiWKlWqWMeOxo0bW7Djxx9/lIEDB8ro0aPtS0erVq2SHTt2MJ4FABCRCIcAAIB0S9uCTp06VTp27GgzV/VgP/hEgFPatlMDI3ryQU9GHD9+3PcoAAAAAAAACKbnTnQci445mTNnjowbN05+++036dmzp7Rv397G/mrnDu3oWqFCBeusoeGOu+++W7JkySKXXHKJ6zmapNall15qnTt0HMtjjz0mpUqVsu6y77zzjnzyySfy9ddfS/fu3eXXX3+1bdNt/Pvvv2X37t1y4sQJ314AAICkIhwCAAA85WICI3pb1apVrRXp+PHjrd0nAAAAAACAV2iAQ89naLfVlStXyrx582Ty5MkyatQoC0306tXLRva2bdtWmjdvLg0bNrTOGToapWLFiha4ePLJJ21syv333y+33367XH/99XLZZZe5nku52Lr22mvljjvukIcfflgKFSokZcuWtfM19evXt3DJN998Y9s4bNgwG8myZMkS2bJlixw5csS3hwAAILUQDgEAAJ6nrUCnT58unTt3ltdee01y584d72SFUzqT9rnnnpPPPvtMhg4dKhs3bvQ9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q1eXt99+20a8NGvWTL766ivp1KmTdW8aMGCAdWHSbhvTpk2z/db919dBXw99Xei4AQAAAAAAQDgEAAAASBe2bt1qHUf04m3Dhg1t/IB+u/6yyy6LdyE1sG699VYpUqSIXeD94osv7ALwlClT7MJoQt9i10CIXojV+2fJksXu4yAc4l6EQ5Ac58+fl+PHj8u+ffvs3/jff/8tixYtspEh+u/9zz//lIEDB8rPP/8s33//vb/rho4bcYIbVapUsc4W2uFCO11oxwvtfKFBCv33qx0x3N6zoSwNsGXOnFmyZs1q41qcrht6QqFChQpSrVo163rUoEED+fTTT6VVq1by7bffWnjD6bih+ztz5kxZsmSJrF271sJthw4dklOnTvleLQAAAAAAAIQT4RAAAAAgndORBdoBoFu3btKoUSO7GKvf7L/iiiviXcQNLA00FC5c2L5137RpU7tQq51L1qxZI82bN4+zbsWKFeXw4cPpMhyioxt0ZMNrr73mentw6Xq6vt7P7fbkVFLDIfoaDh8+3PcnpGcnT56UgwcPWkhh3bp1snTpUpk9e7ZMmjRJRo4c6R+V4nTb0PBVkyZN5L333rMghAYinn/+eXnmmWesy4UzLiV79uzWceOaa66RSy65xPX9FOrSzhvXX3+9/bvV8EaePHnk8ccft+5A2qFIAybaeejdd9+Vxo0b275888039n9Kv379ZMiQIf7OGzouRUMs27Ztk/3798uJEyd8rxgAAAAAAAC8jHAIAAAA4GE6MmHu3LnSp08fu+irIxhy5cp1wW4CevE6eJ1rr73WghWhCododwSlXQJ0fI7bOkkpr4RDtANLjhw5LGSA5Dtz5owcOXJEdu/eLRs3bpQVK1bIvHnzrCPO6NGjbUSKBho02KDdKVq3bm3hJx05oqNHXn31ValcubKULVtWihYtKgULFpTcuXNbaELf1xqiuFCwKpSlY1n035uOadFQl76PdExU6dKlLZSl4a233nrLRk05XTc6duzoD27o/up+6/7r67B8+XIbUbVr1y4LI50+fdr3ygEAAAAAAAAJIxwCAAAAZFB60XjZsmXWAUFHVbz00kvWUSBTpkzxLmA7deedd4YkHFKuXDnreLJz504bq6HdFtzWS0ql93CIdnXJnz+/rde5c2ff0ozn3LlzEh0dLXv37rXRRPr6apeJ6dOnW0caHR2i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)" - ], - "metadata": { - "id": "4U-C2bCvwNdY" - } - } - ], - "metadata": { - "colab": { - "provenance": [], - "authorship_tag": "ABX9TyPig5weK8vmR2rgUGsiV5O2", - "include_colab_link": true - }, - "gpuClass": "standard", - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/summary_be/requirements.txt b/summary_be/requirements.txt index 526b238..e6dc824 100644 --- a/summary_be/requirements.txt +++ b/summary_be/requirements.txt @@ -1,21 +1,49 @@ -absl-py==1.3.0 +black==22.12.0 +blis==0.7.9 +catalogue==2.0.8 +certifi==2022.12.7 +charset-normalizer==3.1.0 click==8.1.3 colorama==0.4.6 +confection==0.0.4 +coverage==6.5.0 +cymem==2.0.7 Flask==2.2.2 Flask-Cors==3.0.10 +idna==3.4 importlib-metadata==5.0.0 itsdangerous==2.1.2 Jinja2==3.1.2 joblib==1.2.0 +langcodes==3.3.0 MarkupSafe==2.1.1 +murmurhash==1.0.9 +mypy-extensions==1.0.0 nltk==3.7 numpy==1.23.5 +packaging==23.1 +pathspec==0.11.1 +pathy==0.10.1 +platformdirs==3.2.0 +preshed==3.0.8 +pydantic==1.10.7 python-dotenv==0.21.0 regex==2022.10.31 +requests==2.28.2 rouge-score==0.1.2 six==1.16.0 +smart-open==6.3.0 +spacy==3.5.2 +spacy-legacy==3.0.12 +spacy-loggers==1.0.4 +srsly==2.4.6 +thinc==8.1.9 +tomli==2.0.1 tqdm==4.64.1 +typer==0.7.0 +typing_extensions==4.5.0 +urllib3==1.26.15 +wasabi==1.1.1 Werkzeug==2.2.2 zipp==3.10.0 -coverage==6.5.0 -black==22.12.0 +tensorflow==2.8.0 \ No newline at end of file