{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Speaker dialect classification using Keras model","metadata":{}},{"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\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\n\n\n# NLP libduplicatedaries\nimport re # for preprocessing text\nimport string # for preprocessing text\nimport nltk # for processing texts\nfrom nltk.stem import PorterStemmer\nfrom nltk.corpus import stopwords # list of stop words\nnltk.download('punkt')\nnltk.download('stopwords')\nnltk.download('wordnet')\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-11T18:39:55.189021Z","iopub.execute_input":"2023-03-11T18:39:55.190643Z","iopub.status.idle":"2023-03-11T18:39:57.646785Z","shell.execute_reply.started":"2023-03-11T18:39:55.190554Z","shell.execute_reply":"2023-03-11T18:39:57.645216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Read data ","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/ml-olympiad-dialectrecognition/train.csv')\ntrain_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:39:57.650760Z","iopub.execute_input":"2023-03-11T18:39:57.652428Z","iopub.status.idle":"2023-03-11T18:39:59.774998Z","shell.execute_reply.started":"2023-03-11T18:39:57.652344Z","shell.execute_reply":"2023-03-11T18:39:59.773563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Train dataset contents',train_df.shape[0], 'samples, and', train_df.shape[1],'features.')","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:39:59.777161Z","iopub.execute_input":"2023-03-11T18:39:59.778078Z","iopub.status.idle":"2023-03-11T18:39:59.786335Z","shell.execute_reply.started":"2023-03-11T18:39:59.778020Z","shell.execute_reply":"2023-03-11T18:39:59.784684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Train dataset contents', train_df[train_df.duplicated()].shape[0],'duplicated rows.') ","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:39:59.791831Z","iopub.execute_input":"2023-03-11T18:39:59.793305Z","iopub.status.idle":"2023-03-11T18:40:00.261422Z","shell.execute_reply.started":"2023-03-11T18:39:59.793245Z","shell.execute_reply":"2023-03-11T18:40:00.259717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# drop duplicated rows\ntrain_df.drop_duplicates(inplace = True)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:00.263878Z","iopub.execute_input":"2023-03-11T18:40:00.264454Z","iopub.status.idle":"2023-03-11T18:40:00.688099Z","shell.execute_reply.started":"2023-03-11T18:40:00.264398Z","shell.execute_reply":"2023-03-11T18:40:00.686497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Train dataset after drop duplicated rows contents',train_df.shape[0], 'samples.')","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:00.689889Z","iopub.execute_input":"2023-03-11T18:40:00.690809Z","iopub.status.idle":"2023-03-11T18:40:00.704403Z","shell.execute_reply.started":"2023-03-11T18:40:00.690763Z","shell.execute_reply":"2023-03-11T18:40:00.702202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare dataset","metadata":{}},{"cell_type":"markdown","source":"### Text Preprocessing ","metadata":{}},{"cell_type":"code","source":"arabic_punctuations = '''`÷×؛<>_()*&^%][ـ،/:\"؟.,'{}~¦+|!”…“–ـ''' # define arabic punctuations\n\ndef clean_text(text):\n    '''\n    DESCRIPTION:\n    This function to clean text \n    INPUT: \n    text: string\n    OUTPUT: \n    text: string after clean it\n    ''' \n    text = re.sub(\"[a-zA-Z]\", \" \", text) # remove english letters\n    text = re.sub('\\n', ' ', text) # remove \\n from text\n    text = re.sub(r'\\d+', '', text) #remove number\n    text = re.sub(r'http\\S+', '', text) # remove links\n    text = text.translate(str.maketrans('','', arabic_punctuations)) # remove punctuation\n    #text = ' '.join([word for word in text.split() if word not in stopwords.words(\"arabic\")]) # remove stop word\n    text = re.sub(' +', ' ',text) # remove extra space\n    text = text.strip() #remove whitespaces\n\n    text = text.replace(\"\\n\", \"\")\n    text = text.replace(\"-\", \"\")\n    text = text.replace(\"--\", \"\")\n    text = text.replace(\"››\", \"\")\n    text = text.replace(\"‹‹\", \"\")\n    text = text.replace(\"‰\", \"\")\n    text = text.replace(\"••\", \"\")\n    text = text.replace(\"•\", \"\")\n    text = text.replace(\"’\", \"\")\n    text = text.replace(\"‘\", \"\")\n    text = text.replace(\"|\", \"\")   \n    text = text.replace(\";\", \"\")  \n    text = text.replace(\"?\", \"\")  \n    text = text.replace(\"«\", \"\")  \n    text = text.replace(\"·\", \"\")  \n    text = text.replace(\"»\", \"\")  \n\n    return text","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:00.707357Z","iopub.execute_input":"2023-03-11T18:40:00.708572Z","iopub.status.idle":"2023-03-11T18:40:00.724691Z","shell.execute_reply.started":"2023-03-11T18:40:00.708491Z","shell.execute_reply":"2023-03-11T18:40:00.722535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The cleaning function applied in all rows\ntrain_df['Cleaned_Text'] = train_df['GroundTruthText'].apply(clean_text)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:00.727408Z","iopub.execute_input":"2023-03-11T18:40:00.728074Z","iopub.status.idle":"2023-03-11T18:40:03.497884Z","shell.execute_reply.started":"2023-03-11T18:40:00.728021Z","shell.execute_reply":"2023-03-11T18:40:03.495893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# counts of each class in train dataset\ntrain_df.SpeakerDialect.value_counts()\n","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:03.500997Z","iopub.execute_input":"2023-03-11T18:40:03.501642Z","iopub.status.idle":"2023-03-11T18:40:03.521231Z","shell.execute_reply.started":"2023-03-11T18:40:03.501590Z","shell.execute_reply":"2023-03-11T18:40:03.519499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.preprocessing import LabelEncoder\nfrom collections import Counter\nfrom tensorflow.keras.preprocessing.text import Tokenizer\nfrom tensorflow.keras.preprocessing.sequence import pad_sequences\n","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:45:46.243830Z","iopub.execute_input":"2023-03-11T18:45:46.245229Z","iopub.status.idle":"2023-03-11T18:45:46.252356Z","shell.execute_reply.started":"2023-03-11T18:45:46.245179Z","shell.execute_reply":"2023-03-11T18:45:46.250856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Split dataset into train and validation sets with ratio 80:20","metadata":{}},{"cell_type":"code","source":"# Split dataset into training and validation set\ntrain_size = int(train_df.shape[0] * .80)\n\ntrain = train_df[:train_size]\nval = train_df[train_size:]\n","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:15.187153Z","iopub.execute_input":"2023-03-11T18:40:15.188159Z","iopub.status.idle":"2023-03-11T18:40:15.196271Z","shell.execute_reply.started":"2023-03-11T18:40:15.188108Z","shell.execute_reply":"2023-03-11T18:40:15.194777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convert Feature column to numpy array\ntrain_sentences = train.Cleaned_Text.to_numpy()\nval_sentences = val.Cleaned_Text.to_numpy()\n\ntrain_sentences[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:15.198900Z","iopub.execute_input":"2023-03-11T18:40:15.200250Z","iopub.status.idle":"2023-03-11T18:40:15.212327Z","shell.execute_reply.started":"2023-03-11T18:40:15.200172Z","shell.execute_reply":"2023-03-11T18:40:15.210849Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''# Convert label column to numpy array \ntrain_labels = train.SpeakerDialect.to_numpy()\nval_labels = val.SpeakerDialect.to_numpy()\n\ntrain_labels[:5]'''","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:15.214799Z","iopub.execute_input":"2023-03-11T18:40:15.215920Z","iopub.status.idle":"2023-03-11T18:40:15.228059Z","shell.execute_reply.started":"2023-03-11T18:40:15.215836Z","shell.execute_reply":"2023-03-11T18:40:15.226645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convert label column to numpy array \ny = train.SpeakerDialect.to_numpy()  \ny_val = val.SpeakerDialect.to_numpy()\n\nlabelencoder = LabelEncoder()\ntrain_labels = to_categorical(labelencoder.fit_transform(y))\nval_labels = to_categorical(labelencoder.transform(y_val))\n\ntrain_labels[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:40:21.526234Z","iopub.execute_input":"2023-03-11T18:40:21.526717Z","iopub.status.idle":"2023-03-11T18:40:21.583078Z","shell.execute_reply.started":"2023-03-11T18:40:21.526676Z","shell.execute_reply":"2023-03-11T18:40:21.581287Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Get features from clean text","metadata":{}},{"cell_type":"code","source":"# counts of unique words in Cleaned_Text column \nunique_words = Counter(\" \".join(train_df.Cleaned_Text).split(\" \")).items()\ncounts_of_unique_words = len(unique_words)\nprint(\"Counts of unique words are\",counts_of_unique_words)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:41:02.459184Z","iopub.execute_input":"2023-03-11T18:41:02.460622Z","iopub.status.idle":"2023-03-11T18:41:03.221973Z","shell.execute_reply.started":"2023-03-11T18:41:02.460472Z","shell.execute_reply":"2023-03-11T18:41:03.220437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vocab_size = counts_of_unique_words\nembedding_dim = 128\nmax_length = 400\ntrunc_type = 'post'\npadding_type = 'post'\noov_tok = '<OOV>'","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:41:05.133931Z","iopub.execute_input":"2023-03-11T18:41:05.136023Z","iopub.status.idle":"2023-03-11T18:41:05.144976Z","shell.execute_reply.started":"2023-03-11T18:41:05.135938Z","shell.execute_reply":"2023-03-11T18:41:05.142624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# vectorize a text corpus by turning each text into a sequence of integers, \n#   and number of words equal counts_of_unique_words\ntokenizer = Tokenizer(num_words=counts_of_unique_words)\ntokenizer.fit_on_texts(train_sentences) # fit only to training\nword_index = tokenizer.word_index\nprint(\"First 10 word index\")\ndict(list(word_index.items())[0:10])","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:41:06.728923Z","iopub.execute_input":"2023-03-11T18:41:06.730262Z","iopub.status.idle":"2023-03-11T18:41:09.497055Z","shell.execute_reply.started":"2023-03-11T18:41:06.730197Z","shell.execute_reply":"2023-03-11T18:41:09.495608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_sequences = tokenizer.texts_to_sequences(train_sentences)\nval_sequences = tokenizer.texts_to_sequences(val_sentences)\n\nprint(\"First 5 sequences on train set\")\ntrain_sequences[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:44:29.957449Z","iopub.execute_input":"2023-03-11T18:44:29.958598Z","iopub.status.idle":"2023-03-11T18:44:32.847019Z","shell.execute_reply.started":"2023-03-11T18:44:29.958545Z","shell.execute_reply":"2023-03-11T18:44:32.845240Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntrain_padded = pad_sequences(train_sequences, \n                             maxlen=max_length, \n                             padding=padding_type, \n                             truncating=trunc_type)\nval_padded = pad_sequences(val_sequences, \n                           maxlen=max_length, \n                           padding=padding_type, \n                           truncating=trunc_type)\n\nprint(\"First 5 padded sequences on train set\")\ntrain_padded[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:44:32.850117Z","iopub.execute_input":"2023-03-11T18:44:32.855214Z","iopub.status.idle":"2023-03-11T18:44:33.349060Z","shell.execute_reply.started":"2023-03-11T18:44:32.855138Z","shell.execute_reply":"2023-03-11T18:44:33.347536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Build a model","metadata":{}},{"cell_type":"code","source":"model = tf.keras.Sequential([\n    tf.keras.layers.Embedding(vocab_size, embedding_dim),\n    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(embedding_dim)),\n    tf.keras.layers.Dense(embedding_dim, activation='relu'),\n    tf.keras.layers.Dense(4, activation='softmax')\n])\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:46:26.552143Z","iopub.execute_input":"2023-03-11T18:46:26.553034Z","iopub.status.idle":"2023-03-11T18:46:31.115353Z","shell.execute_reply.started":"2023-03-11T18:46:26.552987Z","shell.execute_reply":"2023-03-11T18:46:31.113950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint_path = \"training_1/cp.ckpt\"\ncheckpoint_dir = os.path.dirname(checkpoint_path)\n\n# Create a callback that saves the model's weights\ncp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,\n                                                 save_weights_only=True,\n                                                 verbose=1)\n\nmodel.compile(loss='categorical_crossentropy',\n              metrics=['accuracy'],\n              optimizer='adam')\n\nnum_epochs = 20\nhistory = model.fit(train_padded, \n                    train_labels,  \n                    validation_data = (val_padded, val_labels), \n                    epochs = num_epochs, \n                    batch_size=64,\n                    callbacks = [cp_callback])","metadata":{"execution":{"iopub.status.busy":"2023-03-06T09:44:56.821398Z","iopub.execute_input":"2023-03-06T09:44:56.822228Z","iopub.status.idle":"2023-03-06T10:26:34.282981Z","shell.execute_reply.started":"2023-03-06T09:44:56.822159Z","shell.execute_reply":"2023-03-06T10:26:34.281315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Test data","metadata":{}},{"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/ml-olympiad-dialectrecognition/test.csv')\ntest_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:48:06.449656Z","iopub.execute_input":"2023-03-11T18:48:06.450131Z","iopub.status.idle":"2023-03-11T18:48:06.497228Z","shell.execute_reply.started":"2023-03-11T18:48:06.450092Z","shell.execute_reply":"2023-03-11T18:48:06.495621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The cleaning function applied in all rows\ntest_df['Cleaned_Text'] = test_df['GroundTruthText'].apply(clean_text)","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:48:09.290287Z","iopub.execute_input":"2023-03-11T18:48:09.291300Z","iopub.status.idle":"2023-03-11T18:48:09.382352Z","shell.execute_reply.started":"2023-03-11T18:48:09.291240Z","shell.execute_reply":"2023-03-11T18:48:09.380963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_sentences = test_df.Cleaned_Text.to_numpy()\ntest_sentences[:5]\n","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:48:13.178430Z","iopub.execute_input":"2023-03-11T18:48:13.179925Z","iopub.status.idle":"2023-03-11T18:48:13.190640Z","shell.execute_reply.started":"2023-03-11T18:48:13.179852Z","shell.execute_reply":"2023-03-11T18:48:13.188767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_sequences = tokenizer.texts_to_sequences(test_sentences)\ntest_padded = pad_sequences(test_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n\ntest_padded[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-11T18:48:27.004478Z","iopub.execute_input":"2023-03-11T18:48:27.005707Z","iopub.status.idle":"2023-03-11T18:48:27.075372Z","shell.execute_reply.started":"2023-03-11T18:48:27.005658Z","shell.execute_reply":"2023-03-11T18:48:27.073526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_predict = model.predict(test_padded)\npredicted_label=np.argmax(x_predict,axis=1)\nprediction_class = labelencoder.inverse_transform(predicted_label) \nprediction_class","metadata":{"execution":{"iopub.status.busy":"2023-03-06T10:26:37.227667Z","iopub.execute_input":"2023-03-06T10:26:37.228849Z","iopub.status.idle":"2023-03-06T10:26:38.676801Z","shell.execute_reply.started":"2023-03-06T10:26:37.228771Z","shell.execute_reply":"2023-03-06T10:26:38.675260Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['SpeakerDialect'] = prediction_class","metadata":{"execution":{"iopub.status.busy":"2023-03-06T10:26:38.697406Z","iopub.execute_input":"2023-03-06T10:26:38.699086Z","iopub.status.idle":"2023-03-06T10:26:38.709173Z","shell.execute_reply.started":"2023-03-06T10:26:38.699020Z","shell.execute_reply":"2023-03-06T10:26:38.707480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df[:5]","metadata":{"execution":{"iopub.status.busy":"2023-03-06T10:26:38.711935Z","iopub.execute_input":"2023-03-06T10:26:38.713586Z","iopub.status.idle":"2023-03-06T10:26:38.754560Z","shell.execute_reply.started":"2023-03-06T10:26:38.713517Z","shell.execute_reply":"2023-03-06T10:26:38.752704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SpeakerDialect_dic = {'Najdi':1, 'Hijazi':2, 'Khaliji':3, 'ModernStandardArabic':4}","metadata":{"execution":{"iopub.status.busy":"2023-03-05T21:10:39.897362Z","iopub.execute_input":"2023-03-05T21:10:39.897742Z","iopub.status.idle":"2023-03-05T21:10:39.903428Z","shell.execute_reply.started":"2023-03-05T21:10:39.897706Z","shell.execute_reply":"2023-03-05T21:10:39.902005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.SpeakerDialect.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-03-05T21:10:41.050249Z","iopub.execute_input":"2023-03-05T21:10:41.050614Z","iopub.status.idle":"2023-03-05T21:10:41.061969Z","shell.execute_reply.started":"2023-03-05T21:10:41.050581Z","shell.execute_reply":"2023-03-05T21:10:41.060805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['SpeakerDialect'] = test_df['SpeakerDialect'].map(SpeakerDialect_dic)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-03-05T21:10:41.815447Z","iopub.execute_input":"2023-03-05T21:10:41.815772Z","iopub.status.idle":"2023-03-05T21:10:41.821818Z","shell.execute_reply.started":"2023-03-05T21:10:41.815742Z","shell.execute_reply":"2023-03-05T21:10:41.820780Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df[['SegmentID','SpeakerDialect']].to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2023-03-05T21:10:42.353143Z","iopub.execute_input":"2023-03-05T21:10:42.355396Z","iopub.status.idle":"2023-03-05T21:10:42.366909Z","shell.execute_reply.started":"2023-03-05T21:10:42.355361Z","shell.execute_reply":"2023-03-05T21:10:42.365893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df[['SegmentID','SpeakerDialect']]","metadata":{"execution":{"iopub.status.busy":"2023-03-05T21:10:43.512733Z","iopub.execute_input":"2023-03-05T21:10:43.513412Z","iopub.status.idle":"2023-03-05T21:10:43.527878Z","shell.execute_reply.started":"2023-03-05T21:10:43.513374Z","shell.execute_reply":"2023-03-05T21:10:43.526718Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}