{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":33579,"databundleVersionId":3073370,"sourceType":"competition"}],"dockerImageVersionId":30301,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-09T12:52:26.617868Z","iopub.execute_input":"2023-02-09T12:52:26.618328Z","iopub.status.idle":"2023-02-09T12:52:26.655548Z","shell.execute_reply.started":"2023-02-09T12:52:26.618241Z","shell.execute_reply":"2023-02-09T12:52:26.654609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt \nimport warnings \nimport nltk\nfrom bs4 import BeautifulSoup\nimport string\nfrom nltk.corpus import stopwords\nfrom nltk.tokenize import RegexpTokenizer\nfrom nltk.stem import WordNetLemmatizer\nfrom nltk.corpus import stopwords\nfrom tqdm import tqdm\nimport re\n%matplotlib inline\n\nwarnings.filterwarnings('ignore')\n\nimport nltk\nimport string\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.model_selection import train_test_split, GridSearchCV","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:52:26.659355Z","iopub.execute_input":"2023-02-09T12:52:26.660230Z","iopub.status.idle":"2023-02-09T12:52:27.803689Z","shell.execute_reply.started":"2023-02-09T12:52:26.660192Z","shell.execute_reply":"2023-02-09T12:52:27.802715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/goodreads-books-reviews-290312/goodreads_train.csv')\ntest = pd.read_csv('../input/goodreads-books-reviews-290312/goodreads_test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:52:27.805656Z","iopub.execute_input":"2023-02-09T12:52:27.806005Z","iopub.status.idle":"2023-02-09T12:53:08.389014Z","shell.execute_reply.started":"2023-02-09T12:52:27.805970Z","shell.execute_reply":"2023-02-09T12:53:08.388039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_counts = train.groupby(['rating', 'n_votes']).size().reset_index(name='counts')\n\n# Draw Stripplot\nfig, ax = plt.subplots(figsize=(16,10), dpi= 80)    \nsns.scatterplot(df_counts.n_votes, df_counts.rating, size=df_counts.counts*2, ax=ax)\n\n# Decorations\nplt.title('Counts Plot - n_votes of rating', fontsize=22)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:08.390636Z","iopub.execute_input":"2023-02-09T12:53:08.391010Z","iopub.status.idle":"2023-02-09T12:53:08.960445Z","shell.execute_reply.started":"2023-02-09T12:53:08.390973Z","shell.execute_reply":"2023-02-09T12:53:08.959560Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_counts = train.groupby(['rating', 'n_comments']).size().reset_index(name='counts')\n\n# Draw Stripplot\nfig, ax = plt.subplots(figsize=(16,10), dpi= 80)    \nsns.scatterplot(df_counts.n_comments, df_counts.rating, size=df_counts.counts*2, ax=ax)\n\n# Decorations\nplt.title('Counts Plot - n_comments of rating', fontsize=22)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:08.965756Z","iopub.execute_input":"2023-02-09T12:53:08.966666Z","iopub.status.idle":"2023-02-09T12:53:09.424058Z","shell.execute_reply.started":"2023-02-09T12:53:08.966627Z","shell.execute_reply":"2023-02-09T12:53:09.423049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1, 1, figsize=(19, 6))\nsns.histplot(x='book_id', data=train, palette='Paired', ax=ax, color = 'blue')\nax.tick_params(axis='x', rotation=90)\nplt.title(\"Id\", fontsize=22)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:09.426306Z","iopub.execute_input":"2023-02-09T12:53:09.426989Z","iopub.status.idle":"2023-02-09T12:53:09.948148Z","shell.execute_reply.started":"2023-02-09T12:53:09.426948Z","shell.execute_reply":"2023-02-09T12:53:09.947052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1, 1, figsize=(19, 6))\nsns.histplot(x='rating', data=train, palette='Paired', ax=ax, color = 'blue')\nax.tick_params(axis='x', rotation=90)\nplt.title(\"Rating\", fontsize=22)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:09.949814Z","iopub.execute_input":"2023-02-09T12:53:09.950212Z","iopub.status.idle":"2023-02-09T12:53:10.555151Z","shell.execute_reply.started":"2023-02-09T12:53:09.950172Z","shell.execute_reply":"2023-02-09T12:53:10.554073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"stopwords = stopwords.words('english')","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:10.556958Z","iopub.execute_input":"2023-02-09T12:53:10.557765Z","iopub.status.idle":"2023-02-09T12:53:10.569160Z","shell.execute_reply.started":"2023-02-09T12:53:10.557723Z","shell.execute_reply":"2023-02-09T12:53:10.568142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess_desc(text_col):\n    preprocessed_descs = []\n    url_pattern = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')\n    tag_pattern = re.compile('@(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')\n    for sentence in tqdm(text_col.values):\n        if sentence is np.nan:\n            preprocessed_descs.append(sent.lower().strip())\n            continue\n        else:\n            sent = url_pattern.sub('', sentence)\n            sent = tag_pattern.sub('', sent)\n            sent = sent.replace('\\\\r', ' ')\n            sent = sent.replace('\\\\\"', ' ')\n            sent = sent.replace('\\\\n', ' ')\n            sent = re.sub('[^A-Za-z0-9]+', ' ', sent)\n            sent = ' '.join(e for e in sent.split() if e not in stopwords)\n            preprocessed_descs.append(sent.lower().strip())\n    return preprocessed_descs","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:10.570744Z","iopub.execute_input":"2023-02-09T12:53:10.571290Z","iopub.status.idle":"2023-02-09T12:53:10.580058Z","shell.execute_reply.started":"2023-02-09T12:53:10.571256Z","shell.execute_reply":"2023-02-09T12:53:10.578921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.assign(pre_text = preprocess_desc(train['review_text']))","metadata":{"execution":{"iopub.status.busy":"2023-02-09T12:53:10.581445Z","iopub.execute_input":"2023-02-09T12:53:10.581913Z","iopub.status.idle":"2023-02-09T13:00:07.751039Z","shell.execute_reply.started":"2023-02-09T12:53:10.581880Z","shell.execute_reply":"2023-02-09T13:00:07.750074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = test.assign(pre_text = preprocess_desc(test['review_text']))","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:00:07.755682Z","iopub.execute_input":"2023-02-09T13:00:07.755971Z","iopub.status.idle":"2023-02-09T13:03:51.546390Z","shell.execute_reply.started":"2023-02-09T13:00:07.755945Z","shell.execute_reply":"2023-02-09T13:03:51.545147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.drop(train[[\"user_id\", \"book_id\", \"review_id\", \"date_added\", \"date_updated\", \"read_at\", \"started_at\", 'n_votes', 'n_comments']], axis = 1)\ntest = test.drop(test[[\"user_id\", \"book_id\", \"review_id\", \"date_added\", \"date_updated\", \"read_at\", \"started_at\", 'n_votes', 'n_comments']], axis = 1)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:03:51.548034Z","iopub.execute_input":"2023-02-09T13:03:51.548461Z","iopub.status.idle":"2023-02-09T13:03:52.527414Z","shell.execute_reply.started":"2023-02-09T13:03:51.548420Z","shell.execute_reply":"2023-02-09T13:03:52.526394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import Model\nfrom keras.layers import LSTM, Activation, Dense, Dropout, Input, Embedding, BatchNormalization,  AveragePooling1D,Flatten, GRU\nfrom tensorflow.keras.optimizers import RMSprop\nfrom keras.preprocessing.text import Tokenizer\nfrom keras.preprocessing import sequence\nfrom tensorflow.keras.utils import to_categorical\nfrom keras.callbacks import EarlyStopping\nfrom keras import backend as K\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import regularizers\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:03:52.529114Z","iopub.execute_input":"2023-02-09T13:03:52.529511Z","iopub.status.idle":"2023-02-09T13:03:57.231393Z","shell.execute_reply.started":"2023-02-09T13:03:52.529474Z","shell.execute_reply":"2023-02-09T13:03:57.230384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"MAX_NB_WORDS = 30000\n# Max number of words in each complaint.\nMAX_SEQUENCE_LENGTH = 250\n# This is fixed.\nEMBEDDING_DIM = 100\ntokenizer = Tokenizer(num_words=MAX_NB_WORDS, filters='!\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~', lower=True)\ntokenizer.fit_on_texts(train['pre_text'].values)\nword_index = tokenizer.word_index\nprint('Found %s unique tokens.' % len(word_index))","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:03:57.233065Z","iopub.execute_input":"2023-02-09T13:03:57.233850Z","iopub.status.idle":"2023-02-09T13:05:08.161701Z","shell.execute_reply.started":"2023-02-09T13:03:57.233813Z","shell.execute_reply":"2023-02-09T13:05:08.160597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.sequence import pad_sequences\n\nX = tokenizer.texts_to_sequences(train['pre_text'].values)\nX = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)\nprint('Shape of data tensor:', X.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:05:08.164171Z","iopub.execute_input":"2023-02-09T13:05:08.164868Z","iopub.status.idle":"2023-02-09T13:06:08.884520Z","shell.execute_reply.started":"2023-02-09T13:05:08.164827Z","shell.execute_reply":"2023-02-09T13:06:08.883322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import to_categorical\n\nY = to_categorical(train['rating'].values)\nprint('Shape of label tensor:', Y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:06:08.886176Z","iopub.execute_input":"2023-02-09T13:06:08.886552Z","iopub.status.idle":"2023-02-09T13:06:08.908613Z","shell.execute_reply.started":"2023-02-09T13:06:08.886515Z","shell.execute_reply":"2023-02-09T13:06:08.907683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver() \n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    \n    strategy = tf.distribute.experimental.TPUStrategy\nexcept ValueError:\n    strategy = tf.distribute.get_strategy() \n    print('Number of replicas:', strategy.num_replicas_in_sync) ","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:46.335806Z","iopub.execute_input":"2023-02-09T13:13:46.336193Z","iopub.status.idle":"2023-02-09T13:13:46.342791Z","shell.execute_reply.started":"2023-02-09T13:13:46.336159Z","shell.execute_reply":"2023-02-09T13:13:46.341676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver() # TPU detection\nexcept ValueError:\n    tpu = None\n    gpus = tf.config.experimental.list_logical_devices(\"GPU\")\n    \nif tpu:\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu,) \n    print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])\nelif len(gpus) > 1:\n    strategy = tf.distribute.MirroredStrategy([gpu.name for gpu in gpus])\n    print('Running on multiple GPUs ', [gpu.name for gpu in gpus])\nelif len(gpus) == 1:\n    strategy = tf.distribute.get_strategy() \n    print('Running on single GPU ', gpus[0].name)\nelse:\n    strategy = tf.distribute.get_strategy() \n    print('Running on CPU')\nprint(\"Number of accelerators: \", strategy.num_replicas_in_sync)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:47.168914Z","iopub.execute_input":"2023-02-09T13:13:47.169294Z","iopub.status.idle":"2023-02-09T13:13:47.178225Z","shell.execute_reply.started":"2023-02-09T13:13:47.169262Z","shell.execute_reply":"2023-02-09T13:13:47.177163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.10, random_state = 42)\nprint(X_train.shape,Y_train.shape)\nprint(X_test.shape,Y_test.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:51.170937Z","iopub.execute_input":"2023-02-09T13:13:51.171326Z","iopub.status.idle":"2023-02-09T13:13:52.574122Z","shell.execute_reply.started":"2023-02-09T13:13:51.171293Z","shell.execute_reply":"2023-02-09T13:13:52.572838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Conv1D, MaxPooling1D, Embedding, GlobalMaxPooling1D, Flatten, BatchNormalization, Bidirectional\nfrom tensorflow.keras.initializers import Constant\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras import regularizers\n\n# build model\nwith strategy.scope():\n    model = Sequential()\n    model.add(Embedding(MAX_NB_WORDS + 1, 50, input_length = MAX_SEQUENCE_LENGTH))\n\n    model.add(Conv1D(64, 3, activation = 'relu', padding = 'same'))\n    model.add(Conv1D(64, 3, activation = 'relu', padding = 'same'))\n    model.add(MaxPooling1D(2))\n    model.add(Bidirectional(LSTM(32, return_sequences=True)))\n    model.add(Dropout(0.2))\n\n    model.add(Conv1D(128, 5, activation = 'relu', padding = 'same'))\n    model.add(Conv1D(128, 5, activation = 'relu', padding = 'same'))\n    model.add(MaxPooling1D(3))\n    model.add(Bidirectional(LSTM(64, return_sequences=True)))\n    model.add(Dropout(0.2))\n\n    model.add(Conv1D(256, 5, activation = 'relu', padding = 'same'))\n    model.add(Conv1D(256, 5, activation = 'relu', padding = 'same'))\n    model.add(MaxPooling1D(3))\n    model.add(Bidirectional(LSTM(32, return_sequences=True)))\n    model.add(Dropout(0.2))\n\n    model.add(GlobalMaxPooling1D())\n    model.add(Dense(64, activation = 'relu'))\n    model.add(Dense(32, activation = 'relu'))\n    model.add(Dropout(0.2))\n    model.add(Dense(6, activation = 'softmax'))\n\n    model.compile(Adam(learning_rate = 1e-4),\n                  loss = 'categorical_crossentropy', \n                  metrics=['accuracy'],\n                  steps_per_execution = 200)\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:56.624855Z","iopub.execute_input":"2023-02-09T13:13:56.627435Z","iopub.status.idle":"2023-02-09T13:13:58.267474Z","shell.execute_reply.started":"2023-02-09T13:13:56.627383Z","shell.execute_reply":"2023-02-09T13:13:58.266398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\nearly_stop = EarlyStopping(patience = 4, restore_best_weights = True, verbose = 1) # val_loss\nreduce_lr = ReduceLROnPlateau(factor = 0.1, patience = 2, mode = 'min', verbose = 1) # val_loss","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:06:13.267757Z","iopub.execute_input":"2023-02-09T13:06:13.268121Z","iopub.status.idle":"2023-02-09T13:06:13.275090Z","shell.execute_reply.started":"2023-02-09T13:06:13.268071Z","shell.execute_reply":"2023-02-09T13:06:13.273567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(X_train, \n                    Y_train, \n                    batch_size = 32 * strategy.num_replicas_in_sync,\n                    epochs = 15,\n                    verbose = 1,\n                    validation_data = (X_test, Y_test),\n                    callbacks = [reduce_lr, early_stop])","metadata":{"execution":{"iopub.status.busy":"2023-02-09T14:31:56.439711Z","iopub.execute_input":"2023-02-09T14:31:56.440112Z","iopub.status.idle":"2023-02-09T14:31:56.516640Z","shell.execute_reply.started":"2023-02-09T14:31:56.440030Z","shell.execute_reply":"2023-02-09T14:31:56.515152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accr = model.evaluate(X_test,Y_test)\nprint('Test set\\n  Loss: {:0.3f}\\n  Accuracy: {:0.3f}'.format(accr[0],accr[1]))","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.268786Z","iopub.status.idle":"2023-02-09T13:13:44.269559Z","shell.execute_reply.started":"2023-02-09T13:13:44.269278Z","shell.execute_reply":"2023-02-09T13:13:44.269304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seq = tokenizer.texts_to_sequences(test.pre_text)\npadded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)\npred = model.predict(padded)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.271066Z","iopub.status.idle":"2023-02-09T13:13:44.271780Z","shell.execute_reply.started":"2023-02-09T13:13:44.271526Z","shell.execute_reply":"2023-02-09T13:13:44.271550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('/kaggle/input/goodreads-books-reviews-290312/goodreads_sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.273081Z","iopub.status.idle":"2023-02-09T13:13:44.273815Z","shell.execute_reply.started":"2023-02-09T13:13:44.273559Z","shell.execute_reply":"2023-02-09T13:13:44.273584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.275133Z","iopub.status.idle":"2023-02-09T13:13:44.275827Z","shell.execute_reply.started":"2023-02-09T13:13:44.275573Z","shell.execute_reply":"2023-02-09T13:13:44.275597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['rating'] = [np.argmax(i) for i in pred]","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.277128Z","iopub.status.idle":"2023-02-09T13:13:44.277830Z","shell.execute_reply.started":"2023-02-09T13:13:44.277575Z","shell.execute_reply":"2023-02-09T13:13:44.277600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.279145Z","iopub.status.idle":"2023-02-09T13:13:44.279843Z","shell.execute_reply.started":"2023-02-09T13:13:44.279585Z","shell.execute_reply":"2023-02-09T13:13:44.279609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2023-02-09T13:13:44.281177Z","iopub.status.idle":"2023-02-09T13:13:44.281957Z","shell.execute_reply.started":"2023-02-09T13:13:44.281681Z","shell.execute_reply":"2023-02-09T13:13:44.281709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}