In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.hist(lenghts,bins=20);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "6b2085ab",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "55.0"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# what sentence length covers 95% of the samples\n",
+ "percentile=np.percentile(lenghts,95)\n",
+ "percentile"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "959ae373",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 55 sentence length is the highest\n",
+ "max_vocab_words=64000\n",
+ "max_length=55\n",
+ "text_tokenize=TextVectorization(\n",
+ " max_tokens=max_vocab_words,\n",
+ " output_mode='int',\n",
+ " output_sequence_length=max_length\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "eee5dbfc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2023-06-13 17:41:34.825717: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz\n"
+ ]
+ }
+ ],
+ "source": [
+ "text_tokenize.adapt(train_sentences)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "118c5439",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Original sentence use of a diclofenac sodium suppository ( @mg ) was allowed for all patients at any time after surgery , and the diclofenac sodium suppository usage was assessed .\n",
+ "\n",
+ "lengh of text 29\n",
+ "\n",
+ "Vectorized text [[ 87 4 8 2868 764 6735 68 10 2583 11 62 12 15 262\n",
+ " 63 21 115 3 2 2868 764 6735 2637 10 113 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "import random\n",
+ "random_sentence=random.choice(train_sentences)\n",
+ "print(f\"Original sentence {random_sentence}\\n\")\n",
+ "print(f\"lengh of text {len (random_sentence.split())}\\n\")\n",
+ "print(f\"Vectorized text {text_tokenize([random_sentence])}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "4684e07b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of words in vocab 64000\n",
+ "Top 5 most frquent words ['', '[UNK]', 'the', 'and', 'of']\n",
+ "Top 5 least frquent words ['andbehavior', 'andat', 'andapplication', 'ancovamean', 'ancovaadjusted']\n"
+ ]
+ }
+ ],
+ "source": [
+ "text_vocab=text_tokenize.get_vocabulary()\n",
+ "print(f\"Number of words in vocab { len(text_vocab)}\")\n",
+ "print (f\"Top 5 most frquent words {text_vocab[:5]}\")\n",
+ "print (f\"Top 5 least frquent words {text_vocab[-5:]}\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "526ef3d8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'name': 'text_vectorization_1',\n",
+ " 'trainable': True,\n",
+ " 'dtype': 'string',\n",
+ " 'batch_input_shape': (None,),\n",
+ " 'max_tokens': 64000,\n",
+ " 'standardize': 'lower_and_strip_punctuation',\n",
+ " 'split': 'whitespace',\n",
+ " 'ngrams': None,\n",
+ " 'output_mode': 'int',\n",
+ " 'output_sequence_length': 55,\n",
+ " 'pad_to_max_tokens': False,\n",
+ " 'sparse': False,\n",
+ " 'ragged': False,\n",
+ " 'vocabulary': None,\n",
+ " 'idf_weights': None,\n",
+ " 'encoding': 'utf-8',\n",
+ " 'vocabulary_size': 64000}"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "text_tokenize.get_config()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "0871ad6c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "token_embedding=tf.keras.layers.Embedding(input_dim=len(text_vocab),\n",
+ " output_dim=128,\n",
+ " mask_zero=False\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "a31d9736",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Original sentence use of a diclofenac sodium suppository ( @mg ) was allowed for all patients at any time after surgery , and the diclofenac sodium suppository usage was assessed .\n",
+ "\n",
+ "Vectorized sentence [[ 87 4 8 2868 764 6735 68 10 2583 11 62 12 15 262\n",
+ " 63 21 115 3 2 2868 764 6735 2637 10 113 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n",
+ "\n",
+ "Embedded sentence [[[ 0.04358969 0.00608678 -0.02475305 ... 0.02248098 -0.00060068\n",
+ " -0.02649772]\n",
+ " [ 0.01575196 -0.01732622 -0.03623853 ... 0.04600047 0.02817501\n",
+ " 0.01843751]\n",
+ " [ 0.02404206 -0.04182126 0.01860196 ... -0.02644104 0.04451705\n",
+ " 0.03283714]\n",
+ " ...\n",
+ " [ 0.02993966 -0.0383271 0.00891661 ... 0.04420439 -0.01741441\n",
+ " -0.01684239]\n",
+ " [ 0.02993966 -0.0383271 0.00891661 ... 0.04420439 -0.01741441\n",
+ " -0.01684239]\n",
+ " [ 0.02993966 -0.0383271 0.00891661 ... 0.04420439 -0.01741441\n",
+ " -0.01684239]]]\n",
+ "Embedded sentence shape: (1, 55, 128)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Original sentence {random_sentence}\\n\")\n",
+ "print(f\"Vectorized sentence {text_tokenize([random_sentence])}\\n\")\n",
+ "print(f\"Embedded sentence {token_embedding(text_tokenize([random_sentence]))}\")\n",
+ "print(f\"Embedded sentence shape: {token_embedding(text_tokenize([random_sentence])).shape}\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c2e466a4",
+ "metadata": {},
+ "source": [
+ "The tf.data.Dataset.from_tensor_slices() function is a utility in TensorFlow that creates a tf.data.Dataset object from one or more input tensors. This function is particularly useful for creating an input pipeline for training or inference tasks. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "79270549",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_dataset=tf.data.Dataset.from_tensor_slices((train_sentences,train_labels_one_hot))\n",
+ "val_dataset=tf.data.Dataset.from_tensor_slices((val_sentences,val_labels_one_hot))\n",
+ "test_dataset=tf.data.Dataset.from_tensor_slices((test_sentences,test_label_one_hot))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "2ee4c907",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<_TensorSliceDataset element_spec=(TensorSpec(shape=(), dtype=tf.string, name=None), TensorSpec(shape=(5,), dtype=tf.float64, name=None))>"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "4cec70fc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<_PrefetchDataset element_spec=(TensorSpec(shape=(None,), dtype=tf.string, name=None), TensorSpec(shape=(None, 5), dtype=tf.float64, name=None))>"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_dataset = train_dataset.batch(32).prefetch(tf.data.AUTOTUNE)\n",
+ "val_dataset = val_dataset.batch(32).prefetch(tf.data.AUTOTUNE)\n",
+ "test_dataset = test_dataset.batch(32).prefetch(tf.data.AUTOTUNE)\n",
+ "\n",
+ "train_dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "17e8f7a7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "inputs=tf.keras.layers.Input(shape=(1,), dtype=\"string\")\n",
+ "text_vector=text_tokenize(inputs)\n",
+ "text_embedding=token_embedding(text_vector)\n",
+ "x=tf.keras.layers.Conv1D(64,kernel_size=5,padding=\"same\",activation=\"relu\")(text_embedding)\n",
+ "x=tf.keras.layers.GlobalAveragePooling1D()(x)\n",
+ "outputs=tf.keras.layers.Dense(len(class_names),activation=\"softmax\")(x)\n",
+ "model_1=tf.keras.Model(inputs,outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "69b5a4f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_1.compile(loss=tf.keras.losses.categorical_crossentropy,\n",
+ " optimizer=tf.keras.optimizers.legacy.Adam(),\n",
+ " metrics=[\"accuracy\"])\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "b31bba3f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model\"\n",
+ "_________________________________________________________________\n",
+ " Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ " input_1 (InputLayer) [(None, 1)] 0 \n",
+ " \n",
+ " text_vectorization_1 (TextV (None, 55) 0 \n",
+ " ectorization) \n",
+ " \n",
+ " embedding (Embedding) (None, 55, 128) 8192000 \n",
+ " \n",
+ " conv1d (Conv1D) (None, 55, 64) 41024 \n",
+ " \n",
+ " global_average_pooling1d (G (None, 64) 0 \n",
+ " lobalAveragePooling1D) \n",
+ " \n",
+ " dense (Dense) (None, 5) 325 \n",
+ " \n",
+ "=================================================================\n",
+ "Total params: 8,233,349\n",
+ "Trainable params: 8,233,349\n",
+ "Non-trainable params: 0\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model_1.summary()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "be4038e3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/3\n",
+ "562/562 [==============================] - 27s 47ms/step - loss: 0.9223 - accuracy: 0.6340 - val_loss: 0.6906 - val_accuracy: 0.7307\n",
+ "Epoch 2/3\n",
+ "562/562 [==============================] - 24s 44ms/step - loss: 0.6571 - accuracy: 0.7563 - val_loss: 0.6362 - val_accuracy: 0.7689\n",
+ "Epoch 3/3\n",
+ "562/562 [==============================] - 27s 48ms/step - loss: 0.6151 - accuracy: 0.7751 - val_loss: 0.5962 - val_accuracy: 0.7836\n"
+ ]
+ }
+ ],
+ "source": [
+ "model_1_history = model_1.fit(train_dataset,\n",
+ " steps_per_epoch=int(0.1 * len(train_dataset)),\n",
+ " epochs=3,\n",
+ " validation_data=val_dataset,\n",
+ " validation_steps=int(0.1 * len(val_dataset)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "52cd33b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "945/945 [==============================] - 2s 2ms/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[4.7636923e-01, 1.2716618e-01, 5.3757947e-02, 3.2397968e-01,\n",
+ " 1.8726962e-02],\n",
+ " [3.8611493e-01, 3.2393026e-01, 1.3540406e-02, 2.6583520e-01,\n",
+ " 1.0579119e-02],\n",
+ " [1.3623297e-01, 6.9641406e-03, 1.8214269e-03, 8.5494816e-01,\n",
+ " 3.3247936e-05],\n",
+ " ...,\n",
+ " [1.3169743e-05, 6.1650638e-04, 8.4461336e-04, 5.1141324e-06,\n",
+ " 9.9852055e-01],\n",
+ " [5.5400979e-02, 4.4984341e-01, 8.8301055e-02, 7.4640714e-02,\n",
+ " 3.3181381e-01],\n",
+ " [1.5156463e-01, 7.0157272e-01, 4.8869491e-02, 4.7299001e-02,\n",
+ " 5.0694138e-02]], dtype=float32)"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_probs=model_1.predict(val_dataset)\n",
+ "model_probs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "2af9cf78",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_1_pred=tf.argmax(model_probs,axis=1)\n",
+ "model_1_pred"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "5058b7a1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_1_results=calculate_results(val_labels_encoder,model_1_pred)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "8be33cf9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'accuracy': 78.7104461803257,\n",
+ " 'precision': 78.3333456187092,\n",
+ " 'recall': 78.7104461803257,\n",
+ " 'F1-score': 78.41304194274046}"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_1_results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "c733c9fc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Model-2 Using Pretrained Model\n",
+ "import tensorflow_hub as hub\n",
+ "tf_hub_embedding_layer=hub.KerasLayer(\"https://tfhub.dev/google/universal-sentence-encoder/4\",\n",
+ " trainable=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "61745f58",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Random training sentence:\n",
+ "missing data were imputed using multiple imputation .\n",
+ "\n"
+ ]
+ },
+ {
+ "ename": "NameError",
+ "evalue": "name 'tf_hub_embedding_layer' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[36], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m random_training_sentence \u001b[38;5;241m=\u001b[39m random\u001b[38;5;241m.\u001b[39mchoice(train_sentences)\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRandom training sentence:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mrandom_training_sentence\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 4\u001b[0m use_embedded_sentence \u001b[38;5;241m=\u001b[39m \u001b[43mtf_hub_embedding_layer\u001b[49m([random_training_sentence])\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSentence after embedding:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00muse_embedded_sentence[\u001b[38;5;241m0\u001b[39m][:\u001b[38;5;241m30\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLength of sentence embedding:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(use_embedded_sentence[\u001b[38;5;241m0\u001b[39m])\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'tf_hub_embedding_layer' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "import random\n",
+ "random_training_sentence = random.choice(train_sentences)\n",
+ "print(f\"Random training sentence:\\n{random_training_sentence}\\n\")\n",
+ "use_embedded_sentence = tf_hub_embedding_layer([random_training_sentence])\n",
+ "print(f\"Sentence after embedding:\\n{use_embedded_sentence[0][:30]}\\n\")\n",
+ "print(f\"Length of sentence embedding:\\n{len(use_embedded_sentence[0])}\")\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "583d8417",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "inputs = tf.keras.layers.Input(shape=[], dtype=tf.string)\n",
+ "pre_trained_embedding=tf_hub_embedding_layer(inputs)\n",
+ "x=tf.keras.layers.Dense(128,activation=\"relu\")(pre_trained_embedding)\n",
+ "outputs=tf.keras.layers.Dense(len(class_names),activation=\"softmax\")(x)\n",
+ "model_2=tf.keras.Model(inputs,outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "id": "fa1a7665",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_1\"\n",
+ "_________________________________________________________________\n",
+ " Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ " input_2 (InputLayer) [(None,)] 0 \n",
+ " \n",
+ " keras_layer (KerasLayer) (None, 512) 256797824 \n",
+ " \n",
+ " dense_1 (Dense) (None, 128) 65664 \n",
+ " \n",
+ " dense_2 (Dense) (None, 5) 645 \n",
+ " \n",
+ "=================================================================\n",
+ "Total params: 256,864,133\n",
+ "Trainable params: 66,309\n",
+ "Non-trainable params: 256,797,824\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model_2.summary()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "6653f2a6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_2.compile(loss=\"categorical_crossentropy\",\n",
+ " optimizer=tf.keras.optimizers.legacy.Adam(),\n",
+ " metrics=[\"accuracy\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "106a4b02",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/3\n",
+ "562/562 [==============================] - 49s 86ms/step - loss: 0.9129 - accuracy: 0.6509 - val_loss: 0.7937 - val_accuracy: 0.6912\n",
+ "Epoch 2/3\n",
+ "562/562 [==============================] - 45s 80ms/step - loss: 0.7674 - accuracy: 0.7020 - val_loss: 0.7538 - val_accuracy: 0.7061\n",
+ "Epoch 3/3\n",
+ "562/562 [==============================] - 61s 109ms/step - loss: 0.7503 - accuracy: 0.7122 - val_loss: 0.7382 - val_accuracy: 0.7131\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Fit feature extractor model for 3 epochs\n",
+ "model_2.fit(train_dataset,\n",
+ " steps_per_epoch=int(0.1 * len(train_dataset)),\n",
+ " epochs=3,\n",
+ " validation_data=val_dataset,\n",
+ " validation_steps=int(0.1 * len(val_dataset)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "id": "7dd2f572",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "945/945 [==============================] - 82s 86ms/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[4.4031423e-01, 3.4722412e-01, 2.5081097e-03, 1.9981924e-01,\n",
+ " 1.0134370e-02],\n",
+ " [3.3964318e-01, 4.9833187e-01, 3.6500413e-03, 1.5515944e-01,\n",
+ " 3.2154536e-03],\n",
+ " [2.6505971e-01, 1.5719941e-01, 1.9075207e-02, 5.1727098e-01,\n",
+ " 4.1394755e-02],\n",
+ " ...,\n",
+ " [1.8576552e-03, 6.5741059e-03, 5.2557763e-02, 9.0209109e-04,\n",
+ " 9.3810833e-01],\n",
+ " [4.2318460e-03, 4.7142524e-02, 1.9696368e-01, 1.3423875e-03,\n",
+ " 7.5031954e-01],\n",
+ " [1.6839372e-01, 2.3914343e-01, 5.2446765e-01, 5.4206112e-03,\n",
+ " 6.2574625e-02]], dtype=float32)"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_2_pred_probs = model_2.predict(val_dataset)\n",
+ "model_2_pred_probs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "id": "8b855f9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_2_preds = tf.argmax(model_2_pred_probs, axis=1)\n",
+ "model_2_preds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "id": "98ac4f0e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'accuracy': 71.39216205481266,\n",
+ " 'precision': 71.42823673632186,\n",
+ " 'recall': 71.39216205481266,\n",
+ " 'F1-score': 71.10159521803406}"
+ ]
+ },
+ "execution_count": 69,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_2_results = calculate_results(val_labels_encoder,\n",
+ " model_2_preds)\n",
+ "model_2_results\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a70d9099",
+ "metadata": {},
+ "source": [
+ "# model 3-conv 1D using character embeddings\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "id": "dfea44d8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['to investigate the efficacy of @ weeks of daily low-dose oral prednisolone in improving pain , mobility , and systemic low-grade inflammation in the short term and whether the effect would be sustained at @ weeks in older adults with moderate to severe knee osteoarthritis ( oa ) .',\n",
+ " 'a total of @ patients with primary knee oa were randomized @:@ ; @ received @ mg/day of prednisolone and @ received placebo for @ weeks .',\n",
+ " 'outcome measures included pain reduction and improvement in function scores and systemic inflammation markers .',\n",
+ " 'pain was assessed using the visual analog pain scale ( @-@ mm ) .',\n",
+ " 'secondary outcome measures included the western ontario and mcmaster universities osteoarthritis index scores , patient global assessment ( pga ) of the severity of knee oa , and @-min walk distance ( @mwd ) .']"
+ ]
+ },
+ "execution_count": 70,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_sentences[:5]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "6938a248",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'random_training_sentence' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[35], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msplit_to_char\u001b[39m(text):\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;28mlist\u001b[39m(text))\n\u001b[0;32m----> 4\u001b[0m split_to_char(\u001b[43mrandom_training_sentence\u001b[49m)\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'random_training_sentence' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "def split_to_char(text):\n",
+ " return \" \" .join(list(text))\n",
+ "\n",
+ "split_to_char(random_training_sentence)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "id": "2a52b468",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_chars=[split_to_char(sentence) for sentence in train_sentences]\n",
+ "val_chars=[split_to_char(sentence) for sentence in val_sentences]\n",
+ "test_chars=[split_to_char(sentence) for sentence in test_sentences]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "id": "0e2a6583",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['t o i n v e s t i g a t e t h e e f f i c a c y o f @ w e e k s o f d a i l y l o w - d o s e o r a l p r e d n i s o l o n e i n i m p r o v i n g p a i n , m o b i l i t y , a n d s y s t e m i c l o w - g r a d e i n f l a m m a t i o n i n t h e s h o r t t e r m a n d w h e t h e r t h e e f f e c t w o u l d b e s u s t a i n e d a t @ w e e k s i n o l d e r a d u l t s w i t h m o d e r a t e t o s e v e r e k n e e o s t e o a r t h r i t i s ( o a ) .',\n",
+ " 'a t o t a l o f @ p a t i e n t s w i t h p r i m a r y k n e e o a w e r e r a n d o m i z e d @ : @ ; @ r e c e i v e d @ m g / d a y o f p r e d n i s o l o n e a n d @ r e c e i v e d p l a c e b o f o r @ w e e k s .',\n",
+ " 'o u t c o m e m e a s u r e s i n c l u d e d p a i n r e d u c t i o n a n d i m p r o v e m e n t i n f u n c t i o n s c o r e s a n d s y s t e m i c i n f l a m m a t i o n m a r k e r s .',\n",
+ " 'p a i n w a s a s s e s s e d u s i n g t h e v i s u a l a n a l o g p a i n s c a l e ( @ - @ m m ) .',\n",
+ " 's e c o n d a r y o u t c o m e m e a s u r e s i n c l u d e d t h e w e s t e r n o n t a r i o a n d m c m a s t e r u n i v e r s i t i e s o s t e o a r t h r i t i s i n d e x s c o r e s , p a t i e n t g l o b a l a s s e s s m e n t ( p g a ) o f t h e s e v e r i t y o f k n e e o a , a n d @ - m i n w a l k d i s t a n c e ( @ m w d ) .']"
+ ]
+ },
+ "execution_count": 73,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_chars[:5]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "id": "4795ada4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(149.3662574983337,)"
+ ]
+ },
+ "execution_count": 74,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "char_length=[len(sentence) for sentence in train_sentences]\n",
+ "mean_length=np.mean(char_length)\n",
+ "mean_length,"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "id": "92d8585d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "char_percentile =np.percentile(char_length,95)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "id": "8c709205",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "290.0"
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "char_percentile # most characters are 290 or less"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "id": "c6390ae9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGdCAYAAAD+JxxnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAz6UlEQVR4nO3df3BU9b3/8VdCyA/Q3fCjybI1QG7L5UdJQYmEINI67BBLtDeVtgRTpJrC1SZKDPJLMGKrDcZrBfxBSntbmCkUZEZSDRhMgxKVGCAQIUginSKgdBP7DdmVKBDI+f7h5FwWEMRuiMnn+Zg5M+75vM/nfD6fMdnXnJxzCLEsyxIAAICBQjt6AAAAAB2FIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMFZYRw/g66y1tVXHjh3Ttddeq5CQkI4eDgAA+BIsy9Inn3wit9ut0NBLX/MhCF3CsWPHFBcX19HDAAAAX8HRo0d13XXXXbKGIHQJ1157raTPF9LhcHTwaAAAwJfh9/sVFxdnf49fCkHoEtr+HOZwOAhCAAB0Ml/mthZulgYAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgrCsOQuXl5br99tvldrsVEhKioqKiL6y99957FRISoqVLlwbsb2xsVEZGhhwOh6Kjo5WZmakTJ04E1Ozdu1c333yzIiMjFRcXp4KCggv637Bhg4YMGaLIyEglJCRo8+bNAe2WZSkvL0/9+vVTVFSUPB6PDh48eKVTBgAAXVTYlR7Q3NysESNG6J577tEdd9zxhXUbN27UO++8I7fbfUFbRkaG/vnPf6q0tFQtLS26++67NXPmTK1du1aS5Pf7NXHiRHk8HhUWFmrfvn265557FB0drZkzZ0qStm/frqlTpyo/P1+33Xab1q5dq7S0NO3evVvDhw+XJBUUFGj58uVavXq14uPj9cgjjyglJUXvvfeeIiMjr3TqQTdw/qaOHkKH+mBJakcPAQBguBDLsqyvfHBIiDZu3Ki0tLSA/R999JGSkpK0ZcsWpaamKicnRzk5OZKkAwcOaNiwYdq5c6cSExMlSSUlJZo0aZI+/PBDud1urVixQgsXLpTX61V4eLgkaf78+SoqKlJtba0kacqUKWpublZxcbF93jFjxmjkyJEqLCyUZVlyu92aPXu2HnroIUmSz+dTbGysVq1apfT09MvOz+/3y+l0yufzyeFwfNVl+kIEIYIQACD4ruT7O+j3CLW2tmratGmaM2eOvvOd71zQXlFRoejoaDsESZLH41FoaKgqKyvtmvHjx9shSJJSUlJUV1en48eP2zUejyeg75SUFFVUVEiSDh06JK/XG1DjdDqVlJRk15zv1KlT8vv9ARsAAOi6gh6EnnzySYWFhemBBx64aLvX61VMTEzAvrCwMPXu3Vter9euiY2NDahp+3y5mnPbzz3uYjXny8/Pl9PptLe4uLjLzhcAAHReQQ1CVVVVWrZsmVatWqWQkJBgdn1VLFiwQD6fz96OHj3a0UMCAADtKKhB6M0331RDQ4P69++vsLAwhYWF6fDhw5o9e7YGDhwoSXK5XGpoaAg47syZM2psbJTL5bJr6uvrA2raPl+u5tz2c4+7WM35IiIi5HA4AjYAANB1BTUITZs2TXv37lV1dbW9ud1uzZkzR1u2bJEkJScnq6mpSVVVVfZxW7duVWtrq5KSkuya8vJytbS02DWlpaUaPHiwevXqZdeUlZUFnL+0tFTJycmSpPj4eLlcroAav9+vyspKuwYAAJjtih+fP3HihP7+97/bnw8dOqTq6mr17t1b/fv3V58+fQLqu3fvLpfLpcGDB0uShg4dqltvvVUzZsxQYWGhWlpalJ2drfT0dPtR+zvvvFOPPfaYMjMzNW/ePNXU1GjZsmV65pln7H5nzZql733ve3r66aeVmpqqdevWadeuXVq5cqWkz59oy8nJ0eOPP65BgwbZj8+73e4LnnIDAABmuuIgtGvXLt1yyy3259zcXEnS9OnTtWrVqi/Vx5o1a5Sdna0JEyYoNDRUkydP1vLly+12p9Op1157TVlZWRo1apT69u2rvLw8+x1CkjR27FitXbtWixYt0sMPP6xBgwapqKjIfoeQJM2dO1fNzc2aOXOmmpqaNG7cOJWUlHwt3iEEAAA63r/1HqGujvcItS/eIwQAaA8d+h4hAACAzoIgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGCsKw5C5eXluv322+V2uxUSEqKioiK7raWlRfPmzVNCQoJ69uwpt9utu+66S8eOHQvoo7GxURkZGXI4HIqOjlZmZqZOnDgRULN3717dfPPNioyMVFxcnAoKCi4Yy4YNGzRkyBBFRkYqISFBmzdvDmi3LEt5eXnq16+foqKi5PF4dPDgwSudMgAA6KKuOAg1NzdrxIgRev755y9o+/TTT7V792498sgj2r17t1566SXV1dXphz/8YUBdRkaG9u/fr9LSUhUXF6u8vFwzZ8602/1+vyZOnKgBAwaoqqpKTz31lBYvXqyVK1faNdu3b9fUqVOVmZmpPXv2KC0tTWlpaaqpqbFrCgoKtHz5chUWFqqyslI9e/ZUSkqKTp48eaXTBgAAXVCIZVnWVz44JEQbN25UWlraF9bs3LlTo0eP1uHDh9W/f38dOHBAw4YN086dO5WYmChJKikp0aRJk/Thhx/K7XZrxYoVWrhwobxer8LDwyVJ8+fPV1FRkWprayVJU6ZMUXNzs4qLi+1zjRkzRiNHjlRhYaEsy5Lb7dbs2bP10EMPSZJ8Pp9iY2O1atUqpaenX3Z+fr9fTqdTPp9PDofjqy7TFxo4f1PQ++xMPliS2tFDAAB0QVfy/d3u9wj5fD6FhIQoOjpaklRRUaHo6Gg7BEmSx+NRaGioKisr7Zrx48fbIUiSUlJSVFdXp+PHj9s1Ho8n4FwpKSmqqKiQJB06dEherzegxul0Kikpya4536lTp+T3+wM2AADQdbVrEDp58qTmzZunqVOn2onM6/UqJiYmoC4sLEy9e/eW1+u1a2JjYwNq2j5frubc9nOPu1jN+fLz8+V0Ou0tLi7uiucMAAA6j3YLQi0tLfrpT38qy7K0YsWK9jpNUC1YsEA+n8/ejh492tFDAgAA7SisPTptC0GHDx/W1q1bA/4+53K51NDQEFB/5swZNTY2yuVy2TX19fUBNW2fL1dzbnvbvn79+gXUjBw58qLjjoiIUERExJVOFwAAdFJBvyLUFoIOHjyov/3tb+rTp09Ae3JyspqamlRVVWXv27p1q1pbW5WUlGTXlJeXq6Wlxa4pLS3V4MGD1atXL7umrKwsoO/S0lIlJydLkuLj4+VyuQJq/H6/Kisr7RoAAGC2Kw5CJ06cUHV1taqrqyV9flNydXW1jhw5opaWFv34xz/Wrl27tGbNGp09e1Zer1der1enT5+WJA0dOlS33nqrZsyYoR07dujtt99Wdna20tPT5Xa7JUl33nmnwsPDlZmZqf3792v9+vVatmyZcnNz7XHMmjVLJSUlevrpp1VbW6vFixdr165dys7OlvT5E205OTl6/PHH9fLLL2vfvn2666675Ha7L/mUGwAAMMcVPz7/xhtv6JZbbrlg//Tp07V48WLFx8df9LjXX39d3//+9yV9/kLF7OxsvfLKKwoNDdXkyZO1fPlyXXPNNXb93r17lZWVpZ07d6pv3766//77NW/evIA+N2zYoEWLFumDDz7QoEGDVFBQoEmTJtntlmXp0Ucf1cqVK9XU1KRx48bphRde0H/+539+qbny+Hz74vF5AEB7uJLv73/rPUJdHUGofRGEAADt4Wv1HiEAAICvK4IQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLGuOAiVl5fr9ttvl9vtVkhIiIqKigLaLctSXl6e+vXrp6ioKHk8Hh08eDCgprGxURkZGXI4HIqOjlZmZqZOnDgRULN3717dfPPNioyMVFxcnAoKCi4Yy4YNGzRkyBBFRkYqISFBmzdvvuKxAAAAc11xEGpubtaIESP0/PPPX7S9oKBAy5cvV2FhoSorK9WzZ0+lpKTo5MmTdk1GRob279+v0tJSFRcXq7y8XDNnzrTb/X6/Jk6cqAEDBqiqqkpPPfWUFi9erJUrV9o127dv19SpU5WZmak9e/YoLS1NaWlpqqmpuaKxAAAAc4VYlmV95YNDQrRx40alpaVJ+vwKjNvt1uzZs/XQQw9Jknw+n2JjY7Vq1Sqlp6frwIEDGjZsmHbu3KnExERJUklJiSZNmqQPP/xQbrdbK1as0MKFC+X1ehUeHi5Jmj9/voqKilRbWytJmjJlipqbm1VcXGyPZ8yYMRo5cqQKCwu/1Fgux+/3y+l0yufzyeFwfNVl+kID528Kep+dyQdLUjt6CACALuhKvr+Deo/QoUOH5PV65fF47H1Op1NJSUmqqKiQJFVUVCg6OtoOQZLk8XgUGhqqyspKu2b8+PF2CJKklJQU1dXV6fjx43bNuedpq2k7z5cZy/lOnTolv98fsAEAgK4rqEHI6/VKkmJjYwP2x8bG2m1er1cxMTEB7WFhYerdu3dAzcX6OPccX1RzbvvlxnK+/Px8OZ1Oe4uLi/sSswYAAJ0VT42dY8GCBfL5fPZ29OjRjh4SAABoR0ENQi6XS5JUX18fsL++vt5uc7lcamhoCGg/c+aMGhsbA2ou1se55/iimnPbLzeW80VERMjhcARsAACg6wpqEIqPj5fL5VJZWZm9z+/3q7KyUsnJyZKk5ORkNTU1qaqqyq7ZunWrWltblZSUZNeUl5erpaXFriktLdXgwYPVq1cvu+bc87TVtJ3ny4wFAACY7YqD0IkTJ1RdXa3q6mpJn9+UXF1drSNHjigkJEQ5OTl6/PHH9fLLL2vfvn2666675Ha77SfLhg4dqltvvVUzZszQjh079Pbbbys7O1vp6elyu92SpDvvvFPh4eHKzMzU/v37tX79ei1btky5ubn2OGbNmqWSkhI9/fTTqq2t1eLFi7Vr1y5lZ2dL0pcaCwAAMFvYlR6wa9cu3XLLLfbntnAyffp0rVq1SnPnzlVzc7NmzpyppqYmjRs3TiUlJYqMjLSPWbNmjbKzszVhwgSFhoZq8uTJWr58ud3udDr12muvKSsrS6NGjVLfvn2Vl5cX8K6hsWPHau3atVq0aJEefvhhDRo0SEVFRRo+fLhd82XGAgAAzPVvvUeoq+M9Qu2L9wgBANpDh71HCAAAoDMhCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYK+hB6OzZs3rkkUcUHx+vqKgofetb39Kvf/1rWZZl11iWpby8PPXr109RUVHyeDw6ePBgQD+NjY3KyMiQw+FQdHS0MjMzdeLEiYCavXv36uabb1ZkZKTi4uJUUFBwwXg2bNigIUOGKDIyUgkJCdq8eXOwpwwAADqpoAehJ598UitWrNBzzz2nAwcO6Mknn1RBQYGeffZZu6agoEDLly9XYWGhKisr1bNnT6WkpOjkyZN2TUZGhvbv36/S0lIVFxervLxcM2fOtNv9fr8mTpyoAQMGqKqqSk899ZQWL16slStX2jXbt2/X1KlTlZmZqT179igtLU1paWmqqakJ9rQBAEAnFGKde6kmCG677TbFxsbqf//3f+19kydPVlRUlP785z/Lsiy53W7Nnj1bDz30kCTJ5/MpNjZWq1atUnp6ug4cOKBhw4Zp586dSkxMlCSVlJRo0qRJ+vDDD+V2u7VixQotXLhQXq9X4eHhkqT58+erqKhItbW1kqQpU6aoublZxcXF9ljGjBmjkSNHqrCw8LJz8fv9cjqd8vl8cjgcQVujNgPnbwp6n53JB0tSO3oIAIAu6Eq+v4N+RWjs2LEqKyvT+++/L0l699139dZbb+kHP/iBJOnQoUPyer3yeDz2MU6nU0lJSaqoqJAkVVRUKDo62g5BkuTxeBQaGqrKykq7Zvz48XYIkqSUlBTV1dXp+PHjds2552mraTvP+U6dOiW/3x+wAQCAriss2B3Onz9ffr9fQ4YMUbdu3XT27Fk98cQTysjIkCR5vV5JUmxsbMBxsbGxdpvX61VMTEzgQMPC1Lt374Ca+Pj4C/poa+vVq5e8Xu8lz3O+/Px8PfbYY19l2gAAoBMK+hWhF198UWvWrNHatWu1e/durV69Wv/zP/+j1atXB/tUQbdgwQL5fD57O3r0aEcPCQAAtKOgXxGaM2eO5s+fr/T0dElSQkKCDh8+rPz8fE2fPl0ul0uSVF9fr379+tnH1dfXa+TIkZIkl8ulhoaGgH7PnDmjxsZG+3iXy6X6+vqAmrbPl6tpaz9fRESEIiIivsq0AQBAJxT0K0KffvqpQkMDu+3WrZtaW1slSfHx8XK5XCorK7Pb/X6/KisrlZycLElKTk5WU1OTqqqq7JqtW7eqtbVVSUlJdk15eblaWlrsmtLSUg0ePFi9evWya849T1tN23kAAIDZgh6Ebr/9dj3xxBPatGmTPvjgA23cuFG//e1v9aMf/UiSFBISopycHD3++ON6+eWXtW/fPt11111yu91KS0uTJA0dOlS33nqrZsyYoR07dujtt99Wdna20tPT5Xa7JUl33nmnwsPDlZmZqf3792v9+vVatmyZcnNz7bHMmjVLJSUlevrpp1VbW6vFixdr165dys7ODva0AQBAJxT0P409++yzeuSRR/TLX/5SDQ0Ncrvd+u///m/l5eXZNXPnzlVzc7NmzpyppqYmjRs3TiUlJYqMjLRr1qxZo+zsbE2YMEGhoaGaPHmyli9fbrc7nU699tprysrK0qhRo9S3b1/l5eUFvGto7NixWrt2rRYtWqSHH35YgwYNUlFRkYYPHx7saQMAgE4o6O8R6kp4j1D74j1CAID20KHvEQIAAOgsCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjNUuQeijjz7Sz372M/Xp00dRUVFKSEjQrl277HbLspSXl6d+/fopKipKHo9HBw8eDOijsbFRGRkZcjgcio6OVmZmpk6cOBFQs3fvXt18882KjIxUXFycCgoKLhjLhg0bNGTIEEVGRiohIUGbN29ujykDAIBOKOhB6Pjx47rpppvUvXt3vfrqq3rvvff09NNPq1evXnZNQUGBli9frsLCQlVWVqpnz55KSUnRyZMn7ZqMjAzt379fpaWlKi4uVnl5uWbOnGm3+/1+TZw4UQMGDFBVVZWeeuopLV68WCtXrrRrtm/frqlTpyozM1N79uxRWlqa0tLSVFNTE+xpAwCATijEsiwrmB3Onz9fb7/9tt58882LtluWJbfbrdmzZ+uhhx6SJPl8PsXGxmrVqlVKT0/XgQMHNGzYMO3cuVOJiYmSpJKSEk2aNEkffvih3G63VqxYoYULF8rr9So8PNw+d1FRkWprayVJU6ZMUXNzs4qLi+3zjxkzRiNHjlRhYeFl5+L3++V0OuXz+eRwOP6tdbmYgfM3Bb3PzuSDJakdPQQAQBd0Jd/fQb8i9PLLLysxMVE/+clPFBMTo+uvv16///3v7fZDhw7J6/XK4/HY+5xOp5KSklRRUSFJqqioUHR0tB2CJMnj8Sg0NFSVlZV2zfjx4+0QJEkpKSmqq6vT8ePH7Zpzz9NW03YeAABgtqAHoX/84x9asWKFBg0apC1btui+++7TAw88oNWrV0uSvF6vJCk2NjbguNjYWLvN6/UqJiYmoD0sLEy9e/cOqLlYH+ee44tq2trPd+rUKfn9/oANAAB0XWHB7rC1tVWJiYn6zW9+I0m6/vrrVVNTo8LCQk2fPj3Ypwuq/Px8PfbYYx09DAAAcJUE/YpQv379NGzYsIB9Q4cO1ZEjRyRJLpdLklRfXx9QU19fb7e5XC41NDQEtJ85c0aNjY0BNRfr49xzfFFNW/v5FixYIJ/PZ29Hjx79cpMGAACdUtCD0E033aS6urqAfe+//74GDBggSYqPj5fL5VJZWZnd7vf7VVlZqeTkZElScnKympqaVFVVZdds3bpVra2tSkpKsmvKy8vV0tJi15SWlmrw4MH2E2rJyckB52mraTvP+SIiIuRwOAI2AADQdQU9CD344IN655139Jvf/EZ///vftXbtWq1cuVJZWVmSpJCQEOXk5Ojxxx/Xyy+/rH379umuu+6S2+1WWlqapM+vIN16662aMWOGduzYobffflvZ2dlKT0+X2+2WJN15550KDw9XZmam9u/fr/Xr12vZsmXKzc21xzJr1iyVlJTo6aefVm1trRYvXqxdu3YpOzs72NMGAACdUNDvEbrxxhu1ceNGLViwQL/61a8UHx+vpUuXKiMjw66ZO3eumpubNXPmTDU1NWncuHEqKSlRZGSkXbNmzRplZ2drwoQJCg0N1eTJk7V8+XK73el06rXXXlNWVpZGjRqlvn37Ki8vL+BdQ2PHjtXatWu1aNEiPfzwwxo0aJCKioo0fPjwYE8bAAB0QkF/j1BXwnuE2hfvEQIAtIcOfY8QAABAZ0EQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADBWuwehJUuWKCQkRDk5Ofa+kydPKisrS3369NE111yjyZMnq76+PuC4I0eOKDU1VT169FBMTIzmzJmjM2fOBNS88cYbuuGGGxQREaFvf/vbWrVq1QXnf/755zVw4EBFRkYqKSlJO3bsaI9pAgCATqhdg9DOnTv1u9/9Tt/97ncD9j/44IN65ZVXtGHDBm3btk3Hjh3THXfcYbefPXtWqampOn36tLZv367Vq1dr1apVysvLs2sOHTqk1NRU3XLLLaqurlZOTo5+8YtfaMuWLXbN+vXrlZubq0cffVS7d+/WiBEjlJKSooaGhvacNgAA6CRCLMuy2qPjEydO6IYbbtALL7ygxx9/XCNHjtTSpUvl8/n0jW98Q2vXrtWPf/xjSVJtba2GDh2qiooKjRkzRq+++qpuu+02HTt2TLGxsZKkwsJCzZs3Tx9//LHCw8M1b948bdq0STU1NfY509PT1dTUpJKSEklSUlKSbrzxRj333HOSpNbWVsXFxen+++/X/PnzLzsHv98vp9Mpn88nh8MR7CXSwPmbgt5nZ/LBktSOHgIAoAu6ku/vdrsilJWVpdTUVHk8noD9VVVVamlpCdg/ZMgQ9e/fXxUVFZKkiooKJSQk2CFIklJSUuT3+7V//3675vy+U1JS7D5Onz6tqqqqgJrQ0FB5PB67BgAAmC2sPTpdt26ddu/erZ07d17Q5vV6FR4erujo6ID9sbGx8nq9ds25Iaitva3tUjV+v1+fffaZjh8/rrNnz160pra29qLjPnXqlE6dOmV/9vv9X2K2AACgswr6FaGjR49q1qxZWrNmjSIjI4PdfbvKz8+X0+m0t7i4uI4eEgAAaEdBD0JVVVVqaGjQDTfcoLCwMIWFhWnbtm1avny5wsLCFBsbq9OnT6upqSnguPr6erlcLkmSy+W64Cmyts+Xq3E4HIqKilLfvn3VrVu3i9a09XG+BQsWyOfz2dvRo0e/8joAAICvv6AHoQkTJmjfvn2qrq62t8TERGVkZNj/3b17d5WVldnH1NXV6ciRI0pOTpYkJScna9++fQFPd5WWlsrhcGjYsGF2zbl9tNW09REeHq5Ro0YF1LS2tqqsrMyuOV9ERIQcDkfABgAAuq6g3yN07bXXavjw4QH7evbsqT59+tj7MzMzlZubq969e8vhcOj+++9XcnKyxowZI0maOHGihg0bpmnTpqmgoEBer1eLFi1SVlaWIiIiJEn33nuvnnvuOc2dO1f33HOPtm7dqhdffFGbNv3fk1i5ubmaPn26EhMTNXr0aC1dulTNzc26++67gz1tAADQCbXLzdKX88wzzyg0NFSTJ0/WqVOnlJKSohdeeMFu79atm4qLi3XfffcpOTlZPXv21PTp0/WrX/3KromPj9emTZv04IMPatmyZbruuuv0hz/8QSkpKXbNlClT9PHHHysvL09er1cjR45USUnJBTdQAwAAM7Xbe4S6At4j1L54jxAAoD18Ld4jBAAA8HXXIX8aAySuiElcFQOAjsYVIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGCnoQys/P14033qhrr71WMTExSktLU11dXUDNyZMnlZWVpT59+uiaa67R5MmTVV9fH1Bz5MgRpaamqkePHoqJidGcOXN05syZgJo33nhDN9xwgyIiIvTtb39bq1atumA8zz//vAYOHKjIyEglJSVpx44dwZ4yAADopIIehLZt26asrCy98847Ki0tVUtLiyZOnKjm5ma75sEHH9Qrr7yiDRs2aNu2bTp27JjuuOMOu/3s2bNKTU3V6dOntX37dq1evVqrVq1SXl6eXXPo0CGlpqbqlltuUXV1tXJycvSLX/xCW7ZssWvWr1+v3NxcPfroo9q9e7dGjBihlJQUNTQ0BHvaAACgEwqxLMtqzxN8/PHHiomJ0bZt2zR+/Hj5fD594xvf0Nq1a/XjH/9YklRbW6uhQ4eqoqJCY8aM0auvvqrbbrtNx44dU2xsrCSpsLBQ8+bN08cff6zw8HDNmzdPmzZtUk1NjX2u9PR0NTU1qaSkRJKUlJSkG2+8Uc8995wkqbW1VXFxcbr//vs1f/78y47d7/fL6XTK5/PJ4XAEe2k0cP6moPeJzuWDJakdPQQA6HKu5Pu73e8R8vl8kqTevXtLkqqqqtTS0iKPx2PXDBkyRP3791dFRYUkqaKiQgkJCXYIkqSUlBT5/X7t37/frjm3j7aatj5Onz6tqqqqgJrQ0FB5PB675nynTp2S3+8P2AAAQNfVrkGotbVVOTk5uummmzR8+HBJktfrVXh4uKKjowNqY2Nj5fV67ZpzQ1Bbe1vbpWr8fr8+++wz/etf/9LZs2cvWtPWx/ny8/PldDrtLS4u7qtNHAAAdArtGoSysrJUU1OjdevWtedpgmbBggXy+Xz2dvTo0Y4eEgAAaEdh7dVxdna2iouLVV5eruuuu87e73K5dPr0aTU1NQVcFaqvr5fL5bJrzn+6q+2psnNrzn/SrL6+Xg6HQ1FRUerWrZu6det20Zq2Ps4XERGhiIiIrzZhAADQ6QT9ipBlWcrOztbGjRu1detWxcfHB7SPGjVK3bt3V1lZmb2vrq5OR44cUXJysiQpOTlZ+/btC3i6q7S0VA6HQ8OGDbNrzu2jraatj/DwcI0aNSqgprW1VWVlZXYNAAAwW9CvCGVlZWnt2rX661//qmuvvda+H8fpdCoqKkpOp1OZmZnKzc1V79695XA4dP/99ys5OVljxoyRJE2cOFHDhg3TtGnTVFBQIK/Xq0WLFikrK8u+YnPvvffqueee09y5c3XPPfdo69atevHFF7Vp0/89iZWbm6vp06crMTFRo0eP1tKlS9Xc3Ky777472NMGAACdUNCD0IoVKyRJ3//+9wP2/+lPf9LPf/5zSdIzzzyj0NBQTZ48WadOnVJKSopeeOEFu7Zbt24qLi7Wfffdp+TkZPXs2VPTp0/Xr371K7smPj5emzZt0oMPPqhly5bpuuuu0x/+8AelpKTYNVOmTNHHH3+svLw8eb1ejRw5UiUlJRfcQA0AAMzU7u8R6sx4jxDaG+8RAoDg+1q9RwgAAODriiAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGAsghAAADAWQQgAABiLIAQAAIxFEAIAAMYiCAEAAGMRhAAAgLEIQgAAwFgEIQAAYKywjh7A1fD888/rqaeektfr1YgRI/Tss89q9OjRHT0sQAPnb+roIXSoD5akdvQQABiuy18RWr9+vXJzc/Xoo49q9+7dGjFihFJSUtTQ0NDRQwMAAB2syweh3/72t5oxY4buvvtuDRs2TIWFherRo4f++Mc/dvTQAABAB+vSfxo7ffq0qqqqtGDBAntfaGioPB6PKioqLqg/deqUTp06ZX/2+XySJL/f3y7jaz31abv0C3QW7fWzBcBsbb9bLMu6bG2XDkL/+te/dPbsWcXGxgbsj42NVW1t7QX1+fn5euyxxy7YHxcX125jBEzmXNrRIwDQlX3yySdyOp2XrOnSQehKLViwQLm5ufbn1tZWNTY2qk+fPgoJCQnqufx+v+Li4nT06FE5HI6g9t1ZsAasgcQaSKyBxBpIrIEUvDWwLEuffPKJ3G73ZWu7dBDq27evunXrpvr6+oD99fX1crlcF9RHREQoIiIiYF90dHR7DlEOh8PY/+HbsAasgcQaSKyBxBpIrIEUnDW43JWgNl36Zunw8HCNGjVKZWVl9r7W1laVlZUpOTm5A0cGAAC+Drr0FSFJys3N1fTp05WYmKjRo0dr6dKlam5u1t13393RQwMAAB2sywehKVOm6OOPP1ZeXp68Xq9GjhypkpKSC26gvtoiIiL06KOPXvCnOJOwBqyBxBpIrIHEGkisgdQxaxBifZlnywAAALqgLn2PEAAAwKUQhAAAgLEIQgAAwFgEIQAAYCyCUAd4/vnnNXDgQEVGRiopKUk7duzo6CEFTX5+vm688UZde+21iomJUVpamurq6gJqTp48qaysLPXp00fXXHONJk+efMFLL48cOaLU1FT16NFDMTExmjNnjs6cOXM1pxIUS5YsUUhIiHJycux9psz/o48+0s9+9jP16dNHUVFRSkhI0K5du+x2y7KUl5enfv36KSoqSh6PRwcPHgzoo7GxURkZGXI4HIqOjlZmZqZOnDhxtafylZw9e1aPPPKI4uPjFRUVpW9961v69a9/HfBvH3W1NSgvL9ftt98ut9utkJAQFRUVBbQHa7579+7VzTffrMjISMXFxamgoKC9p/alXWoNWlpaNG/ePCUkJKhnz55yu9266667dOzYsYA+uvIanO/ee+9VSEiIli5dGrD/qq6Bhatq3bp1Vnh4uPXHP/7R2r9/vzVjxgwrOjraqq+v7+ihBUVKSor1pz/9yaqpqbGqq6utSZMmWf3797dOnDhh19x7771WXFycVVZWZu3atcsaM2aMNXbsWLv9zJkz1vDhwy2Px2Pt2bPH2rx5s9W3b19rwYIFHTGlr2zHjh3WwIEDre9+97vWrFmz7P0mzL+xsdEaMGCA9fOf/9yqrKy0/vGPf1hbtmyx/v73v9s1S5YssZxOp1VUVGS9++671g9/+EMrPj7e+uyzz+yaW2+91RoxYoT1zjvvWG+++ab17W9/25o6dWpHTOmKPfHEE1afPn2s4uJi69ChQ9aGDRusa665xlq2bJld09XWYPPmzdbChQutl156yZJkbdy4MaA9GPP1+XxWbGyslZGRYdXU1Fh/+ctfrKioKOt3v/vd1ZrmJV1qDZqamiyPx2OtX7/eqq2ttSoqKqzRo0dbo0aNCuijK6/BuV566SVrxIgRltvttp555pmAtqu5BgShq2z06NFWVlaW/fns2bOW2+228vPzO3BU7aehocGSZG3bts2yrM9/EXTv3t3asGGDXXPgwAFLklVRUWFZ1uc/RKGhoZbX67VrVqxYYTkcDuvUqVNXdwJf0SeffGINGjTIKi0ttb73ve/ZQciU+c+bN88aN27cF7a3trZaLpfLeuqpp+x9TU1NVkREhPWXv/zFsizLeu+99yxJ1s6dO+2aV1991QoJCbE++uij9ht8kKSmplr33HNPwL477rjDysjIsCyr66/B+V+AwZrvCy+8YPXq1SvgZ2HevHnW4MGD23lGV+5SIaDNjh07LEnW4cOHLcsyZw0+/PBD65vf/KZVU1NjDRgwICAIXe014E9jV9Hp06dVVVUlj8dj7wsNDZXH41FFRUUHjqz9+Hw+SVLv3r0lSVVVVWppaQlYgyFDhqh///72GlRUVCghISHgpZcpKSny+/3av3//VRz9V5eVlaXU1NSAeUrmzP/ll19WYmKifvKTnygmJkbXX3+9fv/739vthw4dktfrDVgHp9OppKSkgHWIjo5WYmKiXePxeBQaGqrKysqrN5mvaOzYsSorK9P7778vSXr33Xf11ltv6Qc/+IEkM9bgXMGab0VFhcaPH6/w8HC7JiUlRXV1dTp+/PhVmk3w+Hw+hYSE2P+upQlr0NraqmnTpmnOnDn6zne+c0H71V4DgtBV9K9//Utnz5694K3WsbGx8nq9HTSq9tPa2qqcnBzddNNNGj58uCTJ6/UqPDz8gn/M9tw18Hq9F12jtravu3Xr1mn37t3Kz8+/oM2E+UvSP/7xD61YsUKDBg3Sli1bdN999+mBBx7Q6tWrJf3fPC71s+D1ehUTExPQHhYWpt69e3eKdZg/f77S09M1ZMgQde/eXddff71ycnKUkZEhyYw1OFew5tsVfj7anDx5UvPmzdPUqVPtf2DUhDV48sknFRYWpgceeOCi7Vd7Dbr8P7GBjpOVlaWamhq99dZbHT2Uq+bo0aOaNWuWSktLFRkZ2dHD6TCtra1KTEzUb37zG0nS9ddfr5qaGhUWFmr69OkdPLqr48UXX9SaNWu0du1afec731F1dbVycnLkdruNWQN8sZaWFv30pz+VZVlasWJFRw/nqqmqqtKyZcu0e/duhYSEdPRwJHFF6Krq27evunXrdsETQvX19XK5XB00qvaRnZ2t4uJivf7667ruuuvs/S6XS6dPn1ZTU1NA/blr4HK5LrpGbW1fZ1VVVWpoaNANN9ygsLAwhYWFadu2bVq+fLnCwsIUGxvbpeffpl+/fho2bFjAvqFDh+rIkSOS/m8el/pZcLlcamhoCGg/c+aMGhsbO8U6zJkzx74qlJCQoGnTpunBBx+0rxSasAbnCtZ8u8LPR1sIOnz4sEpLS+2rQVLXX4M333xTDQ0N6t+/v/078vDhw5o9e7YGDhwo6eqvAUHoKgoPD9eoUaNUVlZm72ttbVVZWZmSk5M7cGTBY1mWsrOztXHjRm3dulXx8fEB7aNGjVL37t0D1qCurk5Hjhyx1yA5OVn79u0L+EFo+2Vx/pfr182ECRO0b98+VVdX21tiYqIyMjLs/+7K829z0003XfDahPfff18DBgyQJMXHx8vlcgWsg9/vV2VlZcA6NDU1qaqqyq7ZunWrWltblZSUdBVm8e/59NNPFRoa+Cu2W7duam1tlWTGGpwrWPNNTk5WeXm5Wlpa7JrS0lINHjxYvXr1ukqz+eraQtDBgwf1t7/9TX369Alo7+prMG3aNO3duzfgd6Tb7dacOXO0ZcsWSR2wBld8ezX+LevWrbMiIiKsVatWWe+99541c+ZMKzo6OuAJoc7svvvus5xOp/XGG29Y//znP+3t008/tWvuvfdeq3///tbWrVutXbt2WcnJyVZycrLd3vb4+MSJE63q6mqrpKTE+sY3vtGpHh8/17lPjVmWGfPfsWOHFRYWZj3xxBPWwYMHrTVr1lg9evSw/vznP9s1S5YssaKjo62//vWv1t69e63/+q//uuij1Ndff71VWVlpvfXWW9agQYO+to+On2/69OnWN7/5Tfvx+Zdeesnq27evNXfuXLumq63BJ598Yu3Zs8fas2ePJcn67W9/a+3Zs8d+IioY821qarJiY2OtadOmWTU1Nda6deusHj16fG0eHb/UGpw+fdr64Q9/aF133XVWdXV1wO/Ic59+6sprcDHnPzVmWVd3DQhCHeDZZ5+1+vfvb4WHh1ujR4+23nnnnY4eUtBIuuj2pz/9ya757LPPrF/+8pdWr169rB49elg/+tGPrH/+858B/XzwwQfWD37wAysqKsrq27evNXv2bKulpeUqzyY4zg9Cpsz/lVdesYYPH25FRERYQ4YMsVauXBnQ3traaj3yyCNWbGysFRERYU2YMMGqq6sLqPl//+//WVOnTrWuueYay+FwWHfffbf1ySefXM1pfGV+v9+aNWuW1b9/fysyMtL6j//4D2vhwoUBX3hdbQ1ef/31i/78T58+3bKs4M333XfftcaNG2dFRERY3/zmN60lS5ZcrSle1qXW4NChQ1/4O/L111+3++jKa3AxFwtCV3MNQizrnNecAgAAGIR7hAAAgLEIQgAAwFgEIQAAYCyCEAAAMBZBCAAAGIsgBAAAjEUQAgAAxiIIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAw1v8HDbjRMJahj4MAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ "
"
+ ],
+ "text/plain": [
+ " accuracy precision recall F1-score\n",
+ "baseline 72.183238 71.864670 72.183238 69.892504\n",
+ "Model_1 78.710446 78.333346 78.710446 78.413042\n",
+ "Model_2 71.392162 71.428237 71.392162 71.101595\n",
+ "Model_3 65.761949 65.443825 65.761949 64.577781\n",
+ "Model_4 74.318152 74.567916 74.318152 74.334530\n",
+ "Model_5 83.506554 83.400225 83.506554 83.359698"
+ ]
+ },
+ "execution_count": 134,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "all_model_results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "id": "1ec359e5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 135,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAHYCAYAAABN4rWHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABCE0lEQVR4nO3deViVdf7/8ddhR9bEZJlAXHMJ91TKvhoxkpVpclmZk5pLpWghlUa5lJmopZjlkobblOuvNJ0atUhtUjQ1NRs3MhJMQbMAcTkqnN8fXZ6ZM4h5PMC5hefjuu7r4nzu+3OfN/AWeXFvJovFYhEAAAAAAAbl4uwCAAAAAAC4FoIrAAAAAMDQCK4AAAAAAEMjuAIAAAAADI3gCgAAAAAwNIIrAAAAAMDQCK4AAAAAAENzc3YB/6ukpETHjx+Xn5+fTCaTs8sBAAAA4CQWi0VnzpxRWFiYXFw45ladGS64Hj9+XOHh4c4uAwAAAIBB5OTk6LbbbnN2GXAiwwVXPz8/SX80p7+/v5OrAQAAAOAshYWFCg8Pt2YEVF+GC65XTg/29/cnuAIAAADgEkJwcyYAAAAAgLERXAEAAAAAhkZwBQAAAAAYmuGucQUAAAAAexQXF+vSpUvOLgN2cHd3l6ur63VvT3AFAAAAcFOyWCzKzc1Vfn6+s0vBDQgMDFRISMh13XyL4AoAAADgpnQltNauXVs1atTg7sM3CYvFonPnzunkyZOSpNDQ0D+dQ3AFAAAAcNMpLi62htagoCBnlwM7eXt7S5JOnjyp2rVr/+lpw9ycCQAAAMBN58o1rTVq1HByJbhRV75313N9MsEVAAAAwE2L04NvXvZ87wiuAAAAAABDI7gCAAAAAAyNmzMBAAAAqFIiX/6sUt/v50kPVur7VUcccQUAAACAau56bpDkTARXAAAAAKhk69atU8eOHRUYGKigoCA99NBDOnLkiHX9sWPH1Lt3b9WsWVM+Pj5q27attm/fbl2/du1a3XnnnfLy8lKtWrX0yCOPWNeZTCatXr3a5v0CAwO1cOFCSdLPP/8sk8mk5cuXq1OnTvLy8tJHH32k06dPq3fv3vrLX/6iGjVqKCoqSkuXLrXZT0lJiaZMmaIGDRrI09NTERERevPNNyVJMTExGjZsmM32p06dkoeHh9LT0x36ehFcAQAAAKCSnT17VklJSdq5c6fS09Pl4uKiRx55RCUlJSoqKlKnTp30yy+/aM2aNdq7d69GjhypkpISSdJnn32mRx55RA888IB2796t9PR0tWvXzu4aXn75ZT3//PM6cOCA4uLidOHCBbVp00afffaZfvjhBz399NN68skn9e2331rnJCcna9KkSRozZoz279+vJUuWKDg4WJI0aNAgLVmyRGaz2br9hx9+qL/85S+KiYlx6OvFNa4AAABAGcrjWklHr3+MWhTl0Px9/fY5NB8VIz4+3ub1/Pnzdeutt2r//v3aunWrTp06pR07dqhmzZqSpAYNGli3ffPNN/X444/r9ddft461aNHC7hoSExPVs2dPm7EXX3zR+vHw4cO1fv16rVixQu3atdOZM2f0zjvv6L333lO/fv0kSfXr11fHjh0lST179tSwYcP06aef6tFHH5UkLVy4UP3793f4sUUEVwAAAKAivRbg2Py6EQ5NP9C4iUPzmxw84NB8XF1mZqbGjh2r7du369dff7UeTc3OztaePXvUqlUra2j9X3v27NHgwYMdrqFt27Y2r4uLizVx4kStWLFCv/zyiy5evCiz2awaNWpIkg4cOCCz2az77rvvqvvz8vLSk08+qfnz5+vRRx/Vd999px9++EFr1qxxuFaCKwAAAABUsm7duqlOnTqaN2+ewsLCVFJSojvuuEMXL16Ut7f3Nef+2XqTySSLxWIzdrWbL/n4+Ni8fuutt/TOO+9o+vTpioqKko+PjxITE3Xx4sXrel/pj9OFW7ZsqWPHjmnBggWKiYlRnTp1/nTen+EaVwAAAACoRKdPn9ahQ4c0evRo3XfffWrSpIl+//136/rmzZtrz549+u233646v3nz5te82dGtt96qEydOWF9nZmbq3Llzf1rXli1b1L17d/3tb39TixYtVK9ePR0+fNi6vmHDhvL29r7me0dFRalt27aaN2+elixZogEDBvzp+14PgisAAAAAVKJbbrlFQUFBmjt3rn788Ud99dVXSkpKsq7v3bu3QkJC1KNHD23ZskU//fSTPv74Y2VkZEiSxo0bp6VLl2rcuHE6cOCA9u3bp8mTJ1vnx8TE6L333tPu3bu1c+dOPfvss3J3d//Tuho2bKgvvvhCW7du1YEDB/TMM88oLy/Put7Ly0ujRo3SyJEjtXjxYh05ckTbtm1TWlqazX4GDRqkSZMmyWKx2Nzt2BEEVwAAAACoRC4uLlq2bJl27dqlO+64QyNGjNBbb71lXe/h4aENGzaodu3aeuCBBxQVFaVJkybJ1dVVktS5c2etXLlSa9asUcuWLRUTE2Nz59+pU6cqPDxc99xzj5544gm9+OKL1utUr2X06NFq3bq14uLi1LlzZ2t4/m9jxozRCy+8oLFjx6pJkyZ67LHHdPLkSZttevfuLTc3N/Xu3VteXl4OfKX+w2T535OfnaywsFABAQEqKCiQv7+/s8sBAABANVYudxX2esKh+VEO3pxpRcplh+Y78+ZM18oGFy5cUFZWlurWrVtu4Qjl4+eff1b9+vW1Y8cOtW7duszt7PkecnMmAAAAAIDDLl26pNOnT2v06NHq0KHDNUOrvThVGAAAAADgsC1btig0NFQ7duzQnDlzynXfHHEFAAAAADisc+fOpR7DU1444goAAAAAMDSCKwAAAADA0OwKrsXFxRozZozq1q0rb29v1a9fX2+88YbN4WCLxaKxY8cqNDRU3t7eio2NVWZmZrkXDgAAAACoHuwKrpMnT9bs2bP13nvv6cCBA5o8ebKmTJmid99917rNlClTNGPGDM2ZM0fbt2+Xj4+P4uLidOHChXIvHgAAAABQ9dl1c6atW7eqe/fuevDBByVJkZGRWrp0qfVhtxaLRdOnT9fo0aPVvXt3SdLixYsVHBys1atX6/HHHy/n8gEAAAAAVZ1dR1zvuusupaen6/Dhw5KkvXv36ptvvlHXrl0lSVlZWcrNzVVsbKx1TkBAgNq3b6+MjIyr7tNsNquwsNBmAQAAAADgCruC68svv6zHH39cjRs3lru7u1q1aqXExET16dNHkpSbmytJCg4OtpkXHBxsXfe/UlJSFBAQYF3Cw8Nv5PMAAAAAAJRh06ZNMplMys/PL9dtK4tdpwqvWLFCH330kZYsWaJmzZppz549SkxMVFhYmPr163dDBSQnJyspKcn6urCwkPAKAAAA4Ma9FlDJ71dQue93A+666y6dOHFCAQF//rWxZ9vKYldwfemll6xHXSUpKipKR48eVUpKivr166eQkBBJUl5enkJDQ63z8vLy1LJly6vu09PTU56enjdYPgAAAABUbRcvXpSHh4dD+/Dw8LDmtfLctrLYdarwuXPn5OJiO8XV1VUlJSWSpLp16yokJETp6enW9YWFhdq+fbuio6PLoVwAAAAAuLl17txZw4YN07BhwxQQEKBatWppzJgx1seMRkZG6o033lDfvn3l7++vp59+WpL0zTff6J577pG3t7fCw8P13HPP6ezZs9b9ms1mjRo1SuHh4fL09FSDBg2UlpYmqfTpv0ePHlW3bt10yy23yMfHR82aNdPnn39+1W0l6eOPP1azZs3k6empyMhITZ061eZzioyM1MSJEzVgwAD5+fkpIiJCc+fOLbevmV3BtVu3bnrzzTf12Wef6eeff9aqVas0bdo0PfLII5Ikk8mkxMRETZgwQWvWrNG+ffvUt29fhYWFqUePHuVWNAAAAADczBYtWiQ3Nzd9++23eueddzRt2jR98MEH1vVvv/22WrRood27d2vMmDE6cuSI7r//fsXHx+v777/X8uXL9c0332jYsGHWOX379tXSpUs1Y8YMHThwQO+//758fX2v+v4JCQkym836+uuvtW/fPk2ePLnMbXft2qVHH31Ujz/+uPbt26fXXntNY8aM0cKFC222mzp1qtq2bavdu3dr6NChGjJkiA4dOuT4F0t2nir87rvvasyYMRo6dKhOnjypsLAwPfPMMxo7dqx1m5EjR+rs2bN6+umnlZ+fr44dO2rdunXy8vIql4IBAAAA4GYXHh6u1NRUmUwm3X777dq3b59SU1M1ePBgSVJMTIxeeOEF6/aDBg1Snz59lJiYKElq2LChZsyYoU6dOmn27NnKzs7WihUr9MUXX1if8lKvXr0y3z87O1vx8fGKior6022nTZum++67T2PGjJEkNWrUSPv379dbb72l/v37W7d74IEHNHToUEnSqFGjlJqaqo0bN+r222+3/wv0P+wKrn5+fpo+fbqmT59e5jYmk0njx4/X+PHjHa0NcKrIlz9zaP7Pkx50aH7UoiiH5u/rt8+h+QAAAKg4HTp0kMlksr6Ojo7W1KlTVVxcLElq27atzfZ79+7V999/r48++sg6ZrFYVFJSoqysLO3bt0+urq7q1KnTdb3/c889pyFDhmjDhg2KjY1VfHy8mjdvftVtDxw4oO7du9uM3X333Zo+fbqKi4vl6uoqSTbzTSaTQkJCdPLkyeuq58/YFVwB2MHRu9nVjXBo+oHGTRya3+TgAYfmAwAA4Mb5+PjYvC4qKtIzzzyj5557rtS2ERER+vHHH+3a/6BBgxQXF6fPPvtMGzZsUEpKiqZOnarhw4ffcM3u7u42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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "all_model_results.plot(kind=\"bar\",figsize=(10,5)).legend(bbox_to_anchor=(1.0,1.0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 136,
+ "id": "32950eb0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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unVrjw8PAACQJAO78uBLLrkkDQ0NWbJkScexiRMndvy5vb09CxYsyGc+85mceOKJSZIbbrghdXV1ue222/Kud72rh8YGAAD4ky5dsbn99ttz1FFH5ZRTTsmYMWNyxBFH5Jprrum4f926dWlubs706dM7jtXW1mbq1KlZuXLlTp+zra0tra2tnW4AAABd0aWw+fWvf50rr7wyBxxwQO666658+MMfzkc/+tFcf/31SZLm5uYkSV1dXafvq6ur67jvz82fPz+1tbUdt4aGhu78PQAAgH6sS2GzY8eOHHnkkfn85z+fI444Ih/84AfzgQ98IFdddVW3B5g3b142bdrUcVu/fn23nwsAAOifuhQ2Y8eOzeTJkzsdO/jgg9PU1JQkqa+vT5K0tLR0ekxLS0vHfX+uuro6NTU1nW4AAABd0aWwecMb3pA1a9Z0OvbLX/4y++23X5I/fpBAfX19li9f3nF/a2tr7r333jQ2NvbAuAAAAC/UpU9FO/vss/P6178+n//85/O3f/u3+eEPf5irr746V199dZKkqqoqZ511Vi688MIccMABmThxYs4999yMGzcuJ5100p6YHwAAoGth8xd/8Rf56le/mnnz5uWCCy7IxIkTs2DBgsyaNavjMZ/85CezZcuWfPCDH8zGjRtzzDHH5M4778yQIUN6fHgAAICki2GTJG9729vytre9bZf3V1VV5YILLsgFF1ywW4MBAAC8VF16jw0AAEBfJGwAAIDiCRsAAKB4wgYAACiesAEAAIonbAAAgOIJGwAAoHjCBgAAKJ6wAQAAiidsAACA4gkbAACgeMIGAAAonrABAACKJ2wAAIDiCRsAAKB4wgYAACiesAEAAIonbAAAgOIJGwAAoHjCBgAAKJ6wAQAAiidsAACA4gkbAACgeMIGAAAonrABAACKJ2wAAIDiCRsAAKB4wgYAACiesAEAAIonbAAAgOIJGwAAoHjCBgAAKJ6wAQAAiidsAACA4gkbAACgeMIGAAAonrABAACKJ2wAAIDiCRsAAKB4wgYAACiesAEAAIonbAAAgOIJGwAAoHjCBgAAKJ6wAQAAiidsAACA4gkbAACgeMIGAAAonrABAACKJ2wAAIDiCRsAAKB4XQqb//f//l+qqqo63SZNmtRx/9atWzN79uyMHj06w4cPz8yZM9PS0tLjQwMAADxfl6/YHHLIIXns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dNJJaW9vz4UXXphrr702d911Vw488MDccsst2bFjR0455ZTU1tbmy1/+cqVH7ZOETYUNGDAgzc3NGTNmTA499NB8+tOfzqmnntpx/+23355PfOITWbNmTQWnZE977j9qd+W5K3j+o/bl6/jjj89ee+2Va6+9NmPGjOk4PmjQoDz00EOZPHlyBaejN+y33365/vrr88Y3vjFJ8rvf/S4nnHBCRo4cmdtvvz0bN250xaafGD16dO65554cdNBBGTFiREfYPPLII5k8eXKeeuqpSo/IHjJmzJgsW7Yshx9+eLZs2ZIRI0bke9/7Xo455pgkyT333JNTTz3VS5R3YWClByAd/0Hb3Nycww47rNN9r33ta7N+/fpKjEUvGjFiRP7xH/8xU6dO3en9a9euzYc+9KFenore9M1vfjOXX355jjrqqCxatChve9vbKj0SveyJJ57Ifvvt1/H1Pvvsk29/+9uZMWNG3vrWt+ZLX/pSBaejN+3YsWOnAfub3/wmI0aMqMBE9JbNmzdn1KhRSZJhw4Zl2LBhGTt2bMf9DQ0NaWlpqdR4fZ6w6QPOPffc7L333hkwYEA2bNiQQw45pOO+3//+9xk2bFgFp6M3HHnkkUmSY489dqf3jxw58kVfosTLw9lnn503velNmTVrVu64445cfvnllR6JXjR+/Pj84he/yMSJEzuOjRgxIsuWLctxxx2Xv/mbv6ngdPSm4447LgsWLMjVV1+d5I//ALp58+acf/75eetb31rh6diTxo0bl6ampowfPz5Jcumll3a6iv/EE0/kFa94RaXG6/N8KlqF/dVf/VXWrFmTBx98MJMnT37BpcVvfOMbnUKHl6d3v/vdGTJkyC7vr6+vz/nnn9+LE1Ephx9+eO6///5UVVXl8MMPF7T9yHHHHZclS5a84Pjw4cNz1113veg5gpeXf/7nf84PfvCDTJ48OVu3bs273/3uTJgwIb/97W9zySWXVHo89qDp06fn4Ycf7vj6wx/+cKerdMuWLev4x1BeyHts+rhf//rXGTx4cPbdd99KjwL0sttvvz3f/e53M2/evE7/YsfL0x/+8IcXXLV/vieffDIPPPDALq/s8vKyffv23HTTTfnxj3+czZs358gjj8ysWbMydOjQSo9GBa1bty5Dhgzp9PI0/kTYFObQQw/NN77xjY6PfqV/sgfYAewA4DzQmffYFOaRRx7JM888U+kxqDB7gB3ADry8rV27Nt/97nfz+OOPv+Ajvs8777wKTUVf4zzQmbABAOhDrrnmmnz4wx/OPvvsk/r6+k6/DqCqqkrYwC4IGwCAPuTCCy/MRRddlE996lOVHgWK4lPRAAD6kD/84Q855ZRTKj0GFEfYAAD0IaecckqWLVtW6TGgOF6KBgDQh7z61a/Oueeem1WrVuXQQw/NoEGDOt3/0Y9+tEKTQd/m454Ls3Tp0px44okZNmxYpUehguwBdgA78PI1ceLEXd5XVVWVX//61704DX2Z80BnwqaCrrjiipf8WP868/JlD7AD2AHAeWD3CZsKerF/kXk+/zrz8mYPsAPYAcB5YPcJGwCACps7d24+97nPZdiwYZk7d+6LPvayyy7rpamgLD48oI/Ztm1b1q1bl1e96lUZOND/Pf2VPcAOYAf6lwcffLDjN8g/+OCDu3zc839ZJy9/zgNd4+Oe+4innnoqZ555Zvbee+8ccsghaWpqSpLMmTMnF198cYWno7fYA+wAdqB/+u53v5uRI0d2/HlXt+985zuVHZRe4TzQPcKmj5g3b14eeuih3H333RkyZEjH8enTp+fmm2+u4GT0JnuAHcAOAM4D3eOaVh9x22235eabb87RRx/d6TLzIYcckl/96lcVnIzeZA+wA9iB/unkk09+yY+99dZb9+Ak9AXOA90jbPqIJ554ImPGjHnB8S1btng9bT9iD7AD2IH+qba2ttIj0Ic4D3SPsOkjjjrqqHz961/PnDlzkvzpzYFf+tKX0tjYWMnR6EX2ADuAHeiflixZUukR6EOcB7pH2PQRn//853P88cfn5z//ebZv354vfOEL+fnPf5577rknK1asqPR49BJ7gB3ADpAk27dvz913351f/epXefe7350RI0Zkw4YNqampyfDhwys9HnuY80D3+PCAPuKYY47Jj370o2zfvj2HHnpoli1bljFjxmTlypWZMmVKpcejl9gD7AB2gEcffTSHHnpoTjzxxMyePTtPPPFEkuSSSy7Jxz/+8QpPR29wHugev6ATAKAPOemkkzJixIgsXrw4o0ePzkMPPZT9998/d999dz7wgQ9k7dq1lR4R+iQvRaug1tbWl/zYmpqaPTgJlWQPsAPYAZ7vv//7v3PPPfdk8ODBnY5PmDAhv/3tbys0FXua88DuEzYVNHLkyJf8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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "all_model_results.sort_values(\"F1-score\", ascending=False)[\"F1-score\"].plot(kind=\"bar\", figsize=(10, 7));"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 137,
+ "id": "bf2c88d5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:absl:Found untraced functions such as lstm_cell_4_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses, lstm_cell_5_layer_call_fn, lstm_cell_5_layer_call_and_return_conditional_losses while saving (showing 4 of 4). These functions will not be directly callable after loading.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "INFO:tensorflow:Assets written to: skimlit_final_model/assets\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "INFO:tensorflow:Assets written to: skimlit_final_model/assets\n"
+ ]
+ }
+ ],
+ "source": [
+ "model_5.save(\"skimlit_final_model\") "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "4c31f7fe",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Metal device set to: Apple M2\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2023-07-08 19:38:08.228766: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz\n"
+ ]
+ }
+ ],
+ "source": [
+ "loaded_model=tf.keras.models.load_model(\"skimlit_final_model\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "33b66792",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[{'abstract': 'This RCT examined the efficacy of a manualized social intervention for children with HFASDs. Participants were randomly assigned to treatment or wait-list conditions. Treatment included instruction and therapeutic activities targeting social skills, face-emotion recognition, interest expansion, and interpretation of non-literal language. A response-cost program was applied to reduce problem behaviors and foster skills acquisition. Significant treatment effects were found for five of seven primary outcome measures (parent ratings and direct child measures). Secondary measures based on staff ratings (treatment group only) corroborated gains reported by parents. High levels of parent, child and staff satisfaction were reported, along with high levels of treatment fidelity. Standardized effect size estimates were primarily in the medium and large ranges and favored the treatment group.',\n",
+ " 'source': 'https://pubmed.ncbi.nlm.nih.gov/20232240/',\n",
+ " 'details': 'RCT of a manualized social treatment for high-functioning autism spectrum disorders'},\n",
+ " {'abstract': \"Postpartum depression (PPD) is the most prevalent mood disorder associated with childbirth. No single cause of PPD has been identified, however the increased risk of nutritional deficiencies incurred through the high nutritional requirements of pregnancy may play a role in the pathology of depressive symptoms. Three nutritional interventions have drawn particular interest as possible non-invasive and cost-effective prevention and/or treatment strategies for PPD; omega-3 (n-3) long chain polyunsaturated fatty acids (LCPUFA), vitamin D and overall diet. We searched for meta-analyses of randomised controlled trials (RCT's) of nutritional interventions during the perinatal period with PPD as an outcome, and checked for any trials published subsequently to the meta-analyses. Fish oil: Eleven RCT's of prenatal fish oil supplementation RCT's show null and positive effects on PPD symptoms. Vitamin D: no relevant RCT's were identified, however seven observational studies of maternal vitamin D levels with PPD outcomes showed inconsistent associations. Diet: Two Australian RCT's with dietary advice interventions in pregnancy had a positive and null result on PPD. With the exception of fish oil, few RCT's with nutritional interventions during pregnancy assess PPD. Further research is needed to determine whether nutritional intervention strategies during pregnancy can protect against symptoms of PPD. Given the prevalence of PPD and ease of administering PPD measures, we recommend future prenatal nutritional RCT's include PPD as an outcome.\",\n",
+ " 'source': 'https://pubmed.ncbi.nlm.nih.gov/28012571/',\n",
+ " 'details': 'Formatting removed (can be used to compare model to actual example)'},\n",
+ " {'abstract': 'Mental illness, including depression, anxiety and bipolar disorder, accounts for a significant proportion of global disability and poses a substantial social, economic and heath burden. Treatment is presently dominated by pharmacotherapy, such as antidepressants, and psychotherapy, such as cognitive behavioural therapy; however, such treatments avert less than half of the disease burden, suggesting that additional strategies are needed to prevent and treat mental disorders. There are now consistent mechanistic, observational and interventional data to suggest diet quality may be a modifiable risk factor for mental illness. This review provides an overview of the nutritional psychiatry field. It includes a discussion of the neurobiological mechanisms likely modulated by diet, the use of dietary and nutraceutical interventions in mental disorders, and recommendations for further research. Potential biological pathways related to mental disorders include inflammation, oxidative stress, the gut microbiome, epigenetic modifications and neuroplasticity. Consistent epidemiological evidence, particularly for depression, suggests an association between measures of diet quality and mental health, across multiple populations and age groups; these do not appear to be explained by other demographic, lifestyle factors or reverse causality. Our recently published intervention trial provides preliminary clinical evidence that dietary interventions in clinically diagnosed populations are feasible and can provide significant clinical benefit. Furthermore, nutraceuticals including n-3 fatty acids, folate, S-adenosylmethionine, N-acetyl cysteine and probiotics, among others, are promising avenues for future research. Continued research is now required to investigate the efficacy of intervention studies in large cohorts and within clinically relevant populations, particularly in patients with schizophrenia, bipolar and anxiety disorders.',\n",
+ " 'source': 'https://pubmed.ncbi.nlm.nih.gov/28942748/',\n",
+ " 'details': 'Effect of nutrition on mental health'},\n",
+ " {'abstract': \"Hepatitis C virus (HCV) and alcoholic liver disease (ALD), either alone or in combination, count for more than two thirds of all liver diseases in the Western world. There is no safe level of drinking in HCV-infected patients and the most effective goal for these patients is total abstinence. Baclofen, a GABA(B) receptor agonist, represents a promising pharmacotherapy for alcohol dependence (AD). Previously, we performed a randomized clinical trial (RCT), which demonstrated the safety and efficacy of baclofen in patients affected by AD and cirrhosis. The goal of this post-hoc analysis was to explore baclofen's effect in a subgroup of alcohol-dependent HCV-infected cirrhotic patients. Any patient with HCV infection was selected for this analysis. Among the 84 subjects randomized in the main trial, 24 alcohol-dependent cirrhotic patients had a HCV infection; 12 received baclofen 10mg t.i.d. and 12 received placebo for 12-weeks. With respect to the placebo group (3/12, 25.0%), a significantly higher number of patients who achieved and maintained total alcohol abstinence was found in the baclofen group (10/12, 83.3%; p=0.0123). Furthermore, in the baclofen group, compared to placebo, there was a significantly higher increase in albumin values from baseline (p=0.0132) and a trend toward a significant reduction in INR levels from baseline (p=0.0716). In conclusion, baclofen was safe and significantly more effective than placebo in promoting alcohol abstinence, and improving some Liver Function Tests (LFTs) (i.e. albumin, INR) in alcohol-dependent HCV-infected cirrhotic patients. Baclofen may represent a clinically relevant alcohol pharmacotherapy for these patients.\",\n",
+ " 'source': 'https://pubmed.ncbi.nlm.nih.gov/22244707/',\n",
+ " 'details': 'Baclofen promotes alcohol abstinence in alcohol dependent cirrhotic patients with hepatitis C virus (HCV) infection'}]"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import json\n",
+ "with open(\"skimlit_example_abstracts.json\", \"r\") as f:\n",
+ " example_abstracts = json.load(f)\n",
+ "\n",
+ "example_abstracts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "a0998e3e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ujjwalbansal/anaconda3/lib/python3.10/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+ " from .autonotebook import tqdm as notebook_tqdm\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "['This RCT examined the efficacy of a manualized social intervention for children with HFASDs.',\n",
+ " 'Participants were randomly assigned to treatment or wait-list conditions.',\n",
+ " 'Treatment included instruction and therapeutic activities targeting social skills, face-emotion recognition, interest expansion, and interpretation of non-literal language.',\n",
+ " 'A response-cost program was applied to reduce problem behaviors and foster skills acquisition.',\n",
+ " 'Significant treatment effects were found for five of seven primary outcome measures (parent ratings and direct child measures).',\n",
+ " 'Secondary measures based on staff ratings (treatment group only) corroborated gains reported by parents.',\n",
+ " 'High levels of parent, child and staff satisfaction were reported, along with high levels of treatment fidelity.',\n",
+ " 'Standardized effect size estimates were primarily in the medium and large ranges and favored the treatment group.']"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from spacy.lang.en import English\n",
+ "nlp = English() \n",
+ "sentencizer = nlp.add_pipe(\"sentencizer\") \n",
+ "\n",
+ "doc = nlp(example_abstracts[0][\"abstract\"]) \n",
+ "abstract_lines = [str(sent) for sent in list(doc.sents)] \n",
+ "abstract_lines"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "47a6506a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[{'text': 'This RCT examined the efficacy of a manualized social intervention for children with HFASDs.',\n",
+ " 'line_number': 0,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'Participants were randomly assigned to treatment or wait-list conditions.',\n",
+ " 'line_number': 1,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'Treatment included instruction and therapeutic activities targeting social skills, face-emotion recognition, interest expansion, and interpretation of non-literal language.',\n",
+ " 'line_number': 2,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'A response-cost program was applied to reduce problem behaviors and foster skills acquisition.',\n",
+ " 'line_number': 3,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'Significant treatment effects were found for five of seven primary outcome measures (parent ratings and direct child measures).',\n",
+ " 'line_number': 4,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'Secondary measures based on staff ratings (treatment group only) corroborated gains reported by parents.',\n",
+ " 'line_number': 5,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'High levels of parent, child and staff satisfaction were reported, along with high levels of treatment fidelity.',\n",
+ " 'line_number': 6,\n",
+ " 'total_lines': 7},\n",
+ " {'text': 'Standardized effect size estimates were primarily in the medium and large ranges and favored the treatment group.',\n",
+ " 'line_number': 7,\n",
+ " 'total_lines': 7}]"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "total_lines_in_sample = len(abstract_lines)\n",
+ "\n",
+ "sample_lines = []\n",
+ "for i, line in enumerate(abstract_lines):\n",
+ " sample_dict = {}\n",
+ " sample_dict[\"text\"] = str(line)\n",
+ " sample_dict[\"line_number\"] = i\n",
+ " sample_dict[\"total_lines\"] = total_lines_in_sample - 1\n",
+ " sample_lines.append(sample_dict)\n",
+ "sample_lines\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "f4fab058",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test_abstract_line_numbers = [line[\"line_number\"] for line in sample_lines]\n",
+ "test_abstract_line_numbers_one_hot = tf.one_hot(test_abstract_line_numbers, depth=15) \n",
+ "test_abstract_line_numbers_one_hot\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "58215d49",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test_abstract_total_lines = [line[\"total_lines\"] for line in sample_lines]\n",
+ "test_abstract_total_lines_one_hot = tf.one_hot(test_abstract_total_lines, depth=20)\n",
+ "test_abstract_total_lines_one_hot"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "08f1e56a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def split_to_char(text):\n",
+ " return \" \" .join(list(text))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "64d42218",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['T h i s R C T e x a m i n e d t h e e f f i c a c y o f a m a n u a l i z e d s o c i a l i n t e r v e n t i o n f o r c h i l d r e n w i t h H F A S D s .',\n",
+ " 'P a r t i c i p a n t s w e r e r a n d o m l y a s s i g n e d t o t r e a t m e n t o r w a i t - l i s t c o n d i t i o n s .',\n",
+ " 'T r e a t m e n t i n c l u d e d i n s t r u c t i o n a n d t h e r a p e u t i c a c t i v i t i e s t a r g e t i n g s o c i a l s k i l l s , f a c e - e m o t i o n r e c o g n i t i o n , i n t e r e s t e x p a n s i o n , a n d i n t e r p r e t a t i o n o f n o n - l i t e r a l l a n g u a g e .',\n",
+ " 'A r e s p o n s e - c o s t p r o g r a m w a s a p p l i e d t o r e d u c e p r o b l e m b e h a v i o r s a n d f o s t e r s k i l l s a c q u i s i t i o n .',\n",
+ " 'S i g n i f i c a n t t r e a t m e n t e f f e c t s w e r e f o u n d f o r f i v e o f s e v e n p r i m a r y o u t c o m e m e a s u r e s ( p a r e n t r a t i n g s a n d d i r e c t c h i l d m e a s u r e s ) .',\n",
+ " 'S e c o n d a r y m e a s u r e s b a s e d o n s t a f f r a t i n g s ( t r e a t m e n t g r o u p o n l y ) c o r r o b o r a t e d g a i n s r e p o r t e d b y p a r e n t s .',\n",
+ " 'H i g h l e v e l s o f p a r e n t , c h i l d a n d s t a f f s a t i s f a c t i o n w e r e r e p o r t e d , a l o n g w i t h h i g h l e v e l s o f t r e a t m e n t f i d e l i t y .',\n",
+ " 'S t a n d a r d i z e d e f f e c t s i z e e s t i m a t e s w e r e p r i m a r i l y i n t h e m e d i u m a n d l a r g e r a n g e s a n d f a v o r e d t h e t r e a t m e n t g r o u p .']"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "abstract_chars = [split_to_char(sentence) for sentence in abstract_lines]\n",
+ "abstract_chars"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "535753c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1/1 [==============================] - 2s 2s/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.26708567, 0.09977566, 0.02257598, 0.5738482 , 0.03671453],\n",
+ " [0.0666267 , 0.03083183, 0.71341974, 0.10463963, 0.08448218],\n",
+ " [0.14207463, 0.06278381, 0.53325343, 0.1764009 , 0.08548719],\n",
+ " [0.08821893, 0.13287878, 0.5818414 , 0.07643546, 0.12062543],\n",
+ " [0.05683414, 0.11416066, 0.38816544, 0.04979956, 0.39104018],\n",
+ " [0.03436745, 0.11669327, 0.5302272 , 0.04525217, 0.27345994],\n",
+ " [0.02947308, 0.14869098, 0.08467548, 0.028472 , 0.7086885 ],\n",
+ " [0.01927791, 0.1428847 , 0.27512696, 0.03265918, 0.5300512 ]],\n",
+ " dtype=float32)"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Make predictions on sample abstract features\n",
+ "test_abstract_pred_probs = loaded_model.predict(x=(test_abstract_line_numbers_one_hot,\n",
+ " test_abstract_total_lines_one_hot,\n",
+ " tf.constant(abstract_lines),\n",
+ " tf.constant(abstract_chars)))\n",
+ "test_abstract_pred_probs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "99564562",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test_abstract_preds = tf.argmax(test_abstract_pred_probs, axis=1)\n",
+ "test_abstract_preds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "ae4c4cc4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['OBJECTIVE',\n",
+ " 'METHODS',\n",
+ " 'METHODS',\n",
+ " 'METHODS',\n",
+ " 'RESULTS',\n",
+ " 'METHODS',\n",
+ " 'RESULTS',\n",
+ " 'RESULTS']"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test_abstract_pred_classes = [labelencoder.classes_[i] for i in test_abstract_preds]\n",
+ "test_abstract_pred_classes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "2fb163f4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "OBJECTIVE: This RCT examined the efficacy of a manualized social intervention for children with HFASDs.\n",
+ "METHODS: Participants were randomly assigned to treatment or wait-list conditions.\n",
+ "METHODS: Treatment included instruction and therapeutic activities targeting social skills, face-emotion recognition, interest expansion, and interpretation of non-literal language.\n",
+ "METHODS: A response-cost program was applied to reduce problem behaviors and foster skills acquisition.\n",
+ "RESULTS: Significant treatment effects were found for five of seven primary outcome measures (parent ratings and direct child measures).\n",
+ "METHODS: Secondary measures based on staff ratings (treatment group only) corroborated gains reported by parents.\n",
+ "RESULTS: High levels of parent, child and staff satisfaction were reported, along with high levels of treatment fidelity.\n",
+ "RESULTS: Standardized effect size estimates were primarily in the medium and large ranges and favored the treatment group.\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i, line in enumerate(abstract_lines):\n",
+ " print(f\"{test_abstract_pred_classes[i]}: {line}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "df64834a",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3.10 (tensorflow)",
+ "language": "python",
+ "name": "tensorflow"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}