{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.simplefilter(action='ignore')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "import re\n", "import tarfile\n", "import urllib.request\n", "\n", "import tensorflow as tf\n", "from tensorflow.keras.preprocessing import sequence\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. 数据预处理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.1 定义函数用于删除文字中的 HTML 标签" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def rm_tags(text):\n", " re_tag = re.compile(r'<[^>]+>')\n", " return re_tag.sub('', text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.2 定义函数用于读取 IMDb 文件目录" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def read_files(file_type):\n", " path = 'data/aclImdb/'\n", " file_list = []\n", " \n", " positive_path = path + file_type + '/pos/'\n", " for f in os.listdir(positive_path):\n", " file_list += [positive_path + f]\n", " \n", " negative_path = path + file_type + '/neg/'\n", " for f in os.listdir(negative_path):\n", " file_list += [negative_path + f]\n", " \n", " print('read', file_type, 'files:', len(file_list))\n", " \n", " all_labels = ([1] * 12500 + [0] * 12500)\n", " all_texts = []\n", " for file in file_list:\n", " with open(file, encoding='utf8') as f:\n", " all_texts += [rm_tags(\" \".join(f.readlines()))]\n", " \n", " return all_labels, all_texts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.3 读取数据集" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "read train files: 25000\n", "read test files: 25000\n" ] } ], "source": [ "y_train, train_text = read_files('train')\n", "y_test, test_text = read_files('test')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.4 建立 token" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "token = Tokenizer(num_words=2500) # 将字典的单词数目增大为2500\n", "token.fit_on_texts(train_text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.5 将 \"影评文字\" 转换成 \"数字列表\"" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "x_train_seq = token.texts_to_sequences(train_text)\n", "x_test_seq = token.texts_to_sequences(test_text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.6 截长补短让所有 \"数字列表\" 的长度都为150" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "x_train = sequence.pad_sequences(x_train_seq, maxlen=150) # 将\"数字列表\"的长度增大为150\n", "x_test = sequence.pad_sequences(x_test_seq, maxlen=150)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. 建立模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 建立 Sequential 模型" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.models.Sequential([\n", "\n", " # 嵌入层\n", " tf.keras.layers.Embedding(input_length=150, input_dim=2500, output_dim=32),\n", " tf.keras.layers.Dropout(0.2),\n", " \n", " # RNN层(16个神经元)\n", " tf.keras.layers.SimpleRNN(units=16),\n", " \n", " # 隐藏层\n", " tf.keras.layers.Dense(units=256, activation='relu'),\n", " tf.keras.layers.Dropout(0.2),\n", " \n", " # 输出层\n", " tf.keras.layers.Dense(units=1, activation='sigmoid')\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 查看模型的摘要" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "embedding (Embedding) (None, 150, 32) 80000 \n", "_________________________________________________________________\n", "dropout (Dropout) (None, 150, 32) 0 \n", "_________________________________________________________________\n", "simple_rnn (SimpleRNN) (None, 16) 784 \n", "_________________________________________________________________\n", "dense (Dense) (None, 256) 4352 \n", "_________________________________________________________________\n", "dropout_1 (Dropout) (None, 256) 0 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 1) 257 \n", "=================================================================\n", "Total params: 85,393\n", "Trainable params: 85,393\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n" ] } ], "source": [ "print(model.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. 训练模型" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 20000 samples, validate on 5000 samples\n", "Epoch 1/10\n", " - 11s - loss: 0.6622 - acc: 0.6248 - val_loss: 0.9930 - val_acc: 0.0000e+00\n", "Epoch 2/10\n", " - 11s - loss: 0.6443 - acc: 0.6301 - val_loss: 0.8296 - val_acc: 0.5188\n", "Epoch 3/10\n", " - 11s - loss: 0.5821 - acc: 0.6883 - val_loss: 1.1692 - val_acc: 0.0000e+00\n", "Epoch 4/10\n", " - 13s - loss: 0.6347 - acc: 0.6368 - val_loss: 0.8651 - val_acc: 0.2194\n", "Epoch 5/10\n", " - 14s - loss: 0.6052 - acc: 0.6611 - val_loss: 0.7075 - val_acc: 0.5838\n", "Epoch 6/10\n", " - 12s - loss: 0.5669 - acc: 0.6980 - val_loss: 0.6381 - val_acc: 0.6754\n", "Epoch 7/10\n", " - 12s - loss: 0.5157 - acc: 0.7483 - val_loss: 0.9720 - val_acc: 0.3192\n", "Epoch 8/10\n", " - 11s - loss: 0.5116 - acc: 0.7441 - val_loss: 1.4460 - val_acc: 0.1446\n", "Epoch 9/10\n", " - 12s - loss: 0.4598 - acc: 0.7867 - val_loss: 0.4969 - val_acc: 0.8100\n", "Epoch 10/10\n", " - 12s - loss: 0.4330 - acc: 0.8026 - val_loss: 0.2970 - val_acc: 0.8818\n" ] } ], "source": [ "train_history = model.fit(x=x_train, y=y_train, validation_split=0.2, \n", " epochs=10, batch_size=100, verbose=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. 以图形显示训练过程" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def show_train_history(train_history, train, validation):\n", " plt.plot(train_history.history[train])\n", " plt.plot(train_history.history[validation])\n", " plt.title('Train History')\n", " plt.xlabel('Epoch')\n", " plt.ylabel(train)\n", " plt.legend(['train', 'validation'], loc='upper left')\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xl4leWZ+PHvnYWEQAghhC1hCRD2nYAoIiiyuNdaRattdVSs1Vo7XYZ2fm1tp+10Oq21ndFOrdpaV6itFbcCLogbWdjCJiSsJ2xZIJAASUjy/P54zgkhhKznPe9Z7s915cpZ3vO+d45y7vNs9yPGGJRSSimAKLcDUEopFTw0KSillGqgSUEppVQDTQpKKaUaaFJQSinVQJOCUkqpBpoUVMQTkWgRqRSRQQ6df6iIVDpxbqX8TZOCCjneD3DfT72InG50//b2ns8YU2eM6W6M2d+BWIaLyHmLfUTkeRF5xHv+3caY7m041z0isrq9MSjlTzFuB6BUezX+gBWRvcA9xph3LnS8iMQYY2oDEZubIuXvVM7SloIKOyLyUxFZKiIviUgFcIeIXCwia0WkXEQOicjvRCTWe3yMiBgRGeK9/7z3+bdFpEJEPhWRjE7Ec05rQkTuFpG93nPvFpFbRWQ88L/ALG+Lp9R7bE9vPCXe13xPRMT73D0issYb61Hgp96/b3Sja/UXkVMiktLR+FVk0aSgwtWNwItAErAUqAW+AfQGZgILgftaeP0XgR8AvYD9wH/4IygR6QE8CswzxiR6Y8k3xmwGHgQ+9HZl9fa+5AkgARgKXAHcDXy50SkvAbYDqcCPgWXAHU3+jhXGmDJ/xK/CnyYFFa4+Msa8boypN8acNsbkGmOyjTG1xpjdwJPA7BZe/4oxJs8YcwZ4AZjU0sW839AbfoBbWjjcAONEJN4Yc8gYs+0C54z1nmeJMabCG/dvgC81Omy/Meb33nGR08CzwBd9rQnvsc+1FLtSjWlSUOHK0/iOiIwSkTdF5LCInAB+gm01XMjhRrdPAS0OFBtjejb+wX5jb+64E8BtwAPAYRF5Q0RGXOC0fYBoYF+jx/YBaY3un/N3GmM+xraKLhWRccAg4M2WYleqMU0KKlw1nRH0B2ALMNwY0wP4ISDnvSoAjDFvG2OuBPoDhd7Y4PyYi4E6YHCjxwYBBxqfrplL/AXbhfQlYJkxptofcavIoElBRYpE4Dhw0jsQ29J4gmO8A7/XiUgCUAOcBOq9Tx8B0n0D4N6uq1eAn4tId+9g9zeB51u5zHPAF7DjCX9x4M9QYUyTgooU3wK+AlRgv5kvdSmOaOA7wCGgDDtQ/ID3uVVAAXBERHzdV1/DJo+9wAfYMYMWP+iNMXuBzUC1MeYT/4avwp3oJjtKhR8R+Quw2xjziNuxqNCii9eUCjMiMhS4ARjvdiwq9Gj3kVJhRET+E9gE/LwjZTuU0u4jpZRSDbSloJRSqkHIjSn07t3bDBkyxO0wlFIqpKxbt67UGJPa2nEhlxSGDBlCXl6e22EopVRIEZF9rR+l3UdKKaUa0aSglFKqgSYFpZRSDUJuTKE5Z86coaioiKqqKrdDCQvx8fGkp6cTGxvrdihKqQALi6RQVFREYmIiQ4YM4WwZedURxhjKysooKioiI6PDm40ppUJUWHQfVVVVkZKSognBD0SElJQUbXUpFaHCIikAmhD8SN9LpSJX2CQFpZQKWydL4d3/gNJCxy+lScEPysvLeeKJJ9r9uquvvpry8nIHIlJKhYXjRfD2v8FvxsGHv4Y9qx2/pCYFP7hQUqitrW3xdW+99RY9e/Z0KiylVKgqLYTXHoDfToLcp2Dc5+GBHJh2j+OXDovZR25bsmQJu3btYtKkScTGxhIfH09ycjKfffYZO3fu5HOf+xwej4eqqiq+8Y1vsHjxYuBsyY7KykquuuoqLr30Uj755BPS0tJ47bXX6Nq1q8t/mVIqoA5tgg8fhW2vQUwcZN0Fl3wdeg4KWAhhlxR+/PpWth084ddzjhnQgx9dN/aCz//iF79gy5YtbNy4kdWrV3PNNdewZcuWhimdzzzzDL169eL06dNMmzaNm266iZSUlHPOUVBQwEsvvcQf//hHbrnlFv72t79xxx13+PXvUEoFqX2f2u6hwlUQ1wMu/SbMuB+69wl4KGGXFILB9OnTz5nj/7vf/Y5XX30VAI/HQ0FBwXlJISMjg0mTJgEwdepU9u7dG7B4lVIuMAYK37XJYP8nkJACV/zAdhF1da9bOeySQkvf6AOlW7duDbdXr17NO++8w6effkpCQgJz5sxpdg1AXFxcw+3o6GhOnz4dkFiVUgFWXwfbX7fJ4HA+9EiDhf8FU74MXRLcji78koIbEhMTqaioaPa548ePk5ycTEJCAp999hlr164NcHRKqaBQWwObl8FHv4GyQkgZDtf/L0xYBDFd3I6ugSYFP0hJSWHmzJmMGzeOrl270rdv34bnFi5cyP/93/8xevRoRo4cyYwZM1yMVCkVcDWnYMNz8PHv4EQR9BsPN/8ZRl8PUdFuR3eekNujOSsryzTdZGf79u2MHj3apYjCk76nSnVS1XE7nfTTJ+BUKQy6GGZ9C4ZfCS5UDRCRdcaYrNaO05aCUkr5U2UJrH3CJoTqEzB8Hsz6Vxh8iduRtYkmBaWU8odyD3zyP7D+WaithjE32GTQf6LbkbWLJgWllOqMkp3w8WOQv9Ten3ArXPow9M50N64O0qSglFIdcXAjfPQobFsOMfF2fcHFD0LPgW5H1imaFJRSqj32feJdffyOXX0861/hovuhe6rbkfmFJgWllGqNMTYJfPhr2P8pJPSGuT+0rYP4JLej8ytHq6SKyEIR2SEihSKypJnnB4nI+yKyQUTyReRqJ+MJFt27dwfg4MGDfOELX2j2mDlz5tB06m1Tjz32GKdOnWq4r6W4lXLArvfgD7PghS/YweSrfgkPb7bTS8MsIYCDSUFEooHHgauAMcBtIjKmyWH/D1hmjJkM3Aq0f1OCEDZgwABeeeWVDr++aVLQUtxK+VndGVj6JaiugBuegIc2wEX3BUU5Cqc42VKYDhQaY3YbY2qAl4EbmhxjgB7e20nAQQfjccySJUt4/PHHG+4/8sgj/PSnP2Xu3LlMmTKF8ePH89prr533ur179zJu3DgATp8+za233sro0aO58cYbz6l9dP/995OVlcXYsWP50Y9+BNgiewcPHuTyyy/n8ssvB2wp7tLSUgAeffRRxo0bx7hx43jssccarjd69Gjuvfdexo4dy/z587XGklItObIFaiptV9Hk2x0vR1FbV8/B8tOs33+Mtzcf4k8f7+E/397Owy9v4NYnP+WdbUccvT44O6aQBnga3S8CLmpyzCPAShH5OtANuLLTV317CRze3OnTnKPfeLjqFxd8etGiRTz88MM88MADACxbtowVK1bw0EMP0aNHD0pLS5kxYwbXX3/9Bfc//v3vf09CQgLbt28nPz+fKVOmNDz3s5/9jF69elFXV8fcuXPJz8/noYce4tFHH+X999+nd+/e55xr3bp1/OlPfyI7OxtjDBdddBGzZ88mOTlZS3Qr1R6eHPt7YNOPrvYxxlBRXcuR41UcPlHF4eNVHDnhu13dcLu0spqmRSa6REfRp0cc/XrEUx+AChRuDzTfBvzZGPNrEbkYeE5Exhlj6hsfJCKLgcUAgwYFbrOJtpo8eTLFxcUcPHiQkpISkpOT6devH9/85jdZs2YNUVFRHDhwgCNHjtCvX79mz7FmzRoeeughACZMmMCECRManlu2bBlPPvkktbW1HDp0iG3btp3zfFMfffQRN954Y0O11s9//vN8+OGHXH/99VqiW6n28GTbKqZJ6Rc8pLaunpLK6rMf9MerOHyiuuG27wP/VE3dea/tmRBLvx7x9O0Rz5j+PeibFE+/HvH0S4qjbw97OzmhC1FRgSuL4WRSOAA0nrCb7n2ssbuBhQDGmE9FJB7oDRQ3PsgY8yTwJNjaRy1etYVv9E66+eabeeWVVzh8+DCLFi3ihRdeoKSkhHXr1hEbG8uQIUOaLZndmj179vCrX/2K3NxckpOTufPOOzt0Hh8t0a1UO3hyONV3KusLSjl8ovGH/tnbpZXV1Df5VIqNFvokxtMvKZ7R/XswZ2Sfcz7o+yXZRBAfG3wF8ZxMCrlApohkYJPBrcAXmxyzH5gL/FlERgPxQImDMTlm0aJF3HvvvZSWlvLBBx+wbNky+vTpQ2xsLO+//z779u1r8fWXXXYZL774IldccQVbtmwhPz8fgBMnTtCtWzeSkpI4cuQIb7/9NnPmzAHOluxu2n00a9Ys7rzzTpYsWYIxhldffZXnnnvOkb9bqXBTdaaO7D1HWb95K9887uG/S+fwp83ZDc8ndfV+u0+KZ1S/xIbbvm/8/ZLi6RXgb/f+5FhSMMbUisiDwAogGnjGGLNVRH4C5BljlgPfAv4oIt/EDjrfaUKtbKvX2LFjqaioIC0tjf79+3P77bdz3XXXMX78eLKyshg1alSLr7///vu56667GD16NKNHj2bq1KkATJw4kcmTJzNq1CgGDhzIzJkzG16zePFiFi5cyIABA3j//fcbHp8yZQp33nkn06dPB+Cee+5h8uTJ2lWkVDOMMewtO8XqHcV8sLOEtbvLqDpTz/WxORANky5ZwMujZzR86HftEnzf7v1JS2erZul7qsLZqZpaPt1VxuodJXyws4T9R+3U7qG9u3HZiFTmjEzl0sJfE7PhWfieB6JjXY6487R0tlJKeRljKCiu5IMdJazeWUzunmPU1NXTNTaamcNTuHdWBrNH9GFQSqP1B2tyIW1KWCSE9tCkoJQKSxVVZ/i4sJQPdpbwwY4SDh63EzRG9O3OnTOHMHtEKllDkomLaaY76MxpOLQJLvl6gKN2X9gkBWPMBdcAqPYJtS5FpcD+f7vt0Ak+2FnC6h0lrN93jNp6Q2JcDDOH9+brc1OZPSKVAT27tn6ygxugvrbT6xNCUVgkhfj4eMrKykhJSdHE0EnGGMrKyoiPj3c7FKVaVX6qhg8LvK2BnSWUVFQDMHZADxZfNpTZI1KZMjiZ2Oh2Fm/weGcbpU/3c8TBLyySQnp6OkVFRZSUhORs1qATHx9PevqFF+so5Zb6esPmA8e9A8TFbPSUU2/sIrBZmbYlcFlmb/r06OSXGk8OpAyHbin+CTyEhEVSiI2NJSMjw+0wlAp5x07WsGLrYT47XEFstBAXE02XmCj7E21/x8Wc+7tLdDRxsWef9x0bFxtFXPTZ10d3cN5+aWU1HxbYLqEPC0o5erIGEZiQ3pMHr8hkzshUJqb37PD5z2OMbSmMWOif84WYsEgKSqmO8yWCNzcf4pNdZdTVG7rHxVBvDNW19dQ1Xa7bQTFRcoEEYxNHXJOk0yUmij2lJ8kvOg5ASrcuzBmRyuyRqczKTKVXN4eK0x3dDafKYGDkdR2BJgWlIlJziWBwSgKLLxvKNeP7M3ZAj4bxubp6Q01tPTW19VTX1lFdW09NXX2jx7y36+oa7jc85j22+szZ5xs/Vt3oPDW19ZyqqaX89Nn7qYlxfHv+CGaP6MPYAT0Cs0rYN54QgYPMoElBqYhx7GQNK7cd5o381hNBY9FRQtcu0d6VvBEwZ9+TDXFJ0Huk25G4QpOCUmHMlwje3HyYTwpLqa03DOrVeiKIaJ4cGDgNohzdmDJoaVJQKsxcKBHcM2so107QRNCi0+VQvB3G3uh2JK7RpKBUGCg/VcPKrUd4Y/OhhkQwsFdX7pllWwTj0jQRtMmBPMBE7CAzaFJQKmT5EsGbmw/xcaNEcPesDK4dP0ATQUd4ckCiIG2q25G4RpOCUiGkpURwzfj+jE9L0kTQGZ5s6DsW4hLdjsQ1mhSUCnLHT51hxbbDvJl/NhGkJ2si8Lv6OijKg4m3uR2JqzQpKBWEfIngrc2H+KigUSK4NIOrx/dnQromAr8r3gY1lRG7PsFHk4JSQeLw8SrWFJTwlrdr6EydIa2nJoKAaVi0FrmDzKBJQSlXGGMoOnaa7D1Hyd5dRs7eo+wrs7t/pfXsyl0zbdeQJoIA8uRA937Qc5DbkbhKk0KEOlVTS5QI8bHhvd9ssDDGsKf0JNl7jpLjTQS+TV+SusYybUgvvjRjMDOGpug6ArfsX2tbCRH+3mtSiCD19YZPd5exLM/D21sOExMlzB3dl+sm9Gf2yNTmd6BSHVJfb7d/zN5T1pAIfLX+e3fvwvSMXtyXkcL0jF6M7JsYmJo+6sIqDkP5Ppi+2O1IXKdJIQIcLD/NK+uK+Os6D56jp+kRH8OirIHUGcPbmw/x+qaDJMbFMH9sP66d2J9Lh/du/6YkEa6u3rD90AnW7i4jZ89Rcvce5dipMwD06xHPJcNSuMibBIaldtOWQLDx5NjfET7IDJoUwlZNbT3vbD/C0lwPawpKMAZmDk/h2/NHsmBsv4Zuox9fP5aPC0t5I/8QK7Ye5m/ri0hOiGXhuH5cN2EAFw1N8V+d+jBypq6ezQeOk737KDl7ysjbe4yK6loABvVKYO7ovlyU0YuLMlIY2Ktr25JAXS2cKILkIc4Gr87nyYboOOg/we1IXCehth9vVlaWycvLczuMoLXjcAVLcz38Y+MBjp6soX9SPDdPTefmrIEM7JXQ4mura+tYs7OU1zcd5J3tRzhVU0fv7nFcM74f104cwNRByRHbzVF1po5NnnI7HrDnKOv2HeP0mToAhqV2Y3pGCjOG9mLakF5t2wO4qf1r4c1v2WmRi1dD/4l+jV+14ql5diXz3SvcjsQxIrLOGJPV2nHaUggDFVVneH3TIZbmedjkKSc2Wpg3pi+3ZA1kVmZqm7/px8VEM29MX+aN6cvpmjre31HM65sO8nKuh2c/3Uf/pHiuGd+f6yYOCPtZMadqalm/r5ycPWWs3XOUjZ5yamrrARjVL5FbstK5aGgK04b0IjUxruMXOlkKq34EG5+HHukQEw/ZT8LnHvfTX6JadaYKDm2Ei77qdiRBQZNCiDLGkLPnKEvzPLy1+RBVZ+oZ2TeRH1w7hhsnp3V6V6quXaK5enx/rh7fn8rqWt7ZdoQ38g/y7Kd7eeqjPQzqlcC1E/pz7YQBjO6fGPIJoqLqDHn7jpG9+yjZe8rYXHSc2npDlMC4tCS+PGOwNwkk0zPBDzt+1dfB+mfhnR/bBVMzH4bZ34UV/w4bX4T5/wEJvTp/HdW6Q5ugrkbHE7w0KYSY4hNVvLK+iL/mFbGn9CTd42K4cXI6i6YNZKJD3967x8XwuclpfG5yWsNK29c3HeQPa3bzxOpdDEvtxrUTBnDdxAEM79Pd79f3p/JTNRQWV1JYXEmB93dhcSUHyk8DdsvICelJ3HvZUKZn9CJrcDKJ8X7eWObgBnjjX+HgehgyC67+FfQZZZ+bvhjW/QnW/wUufdi/11XN00Vr59AxhRBwpq6e9z4rZlmuh9U7S6irN0zP6MUtWQO5enw/Erq4k9vLKqt5e8th3sg/SPaeoxhju1aumziA6yYMYFBKy2MYTjHGUFxRTcGRSgqLKygsOfvhX1pZ03BcXEwUw1K7M7xPdzL7dGfK4GSmDEr27jDmgNPH4L2fQu7T0C0VFvwMxt98/rz4P18Lx/bBNzZClE4TdtzLt8ORrfb9DmNtHVPQpBDECosr+Wueh7+tP0BpZTV9EuO4aWo6t2QNJKN3N7fDO8eRE1W85Z3eun5/OQAT05O4dsIArpnQv2ODr62oqzcUHTt13rf+XcWVDTOBABLjYxo++If7flITSUvuGpiZVcbAppdh5f+D00dta+Dy70N8UvPHb1sOy74Et74Io65xPr5IZgz8agQMuwI+/we3o3GUJoUQdbK6ljc3H2JZroe8fceIjhKuGNWHRVkDmTMylZgQWD9QdOwUb+Yf4o38Q2w+cByArMHJXDdxAFeN70efxPh2na+6to69pacaPvQLSyopOFLBntKTVHsHfwFSE+MYnnr2g9+XBFIT49wb8ziyzc4q2v8JpE+Da37d+syiulr47QRIGQ5fWR6YOCPV0T3wu0lwzaMw7W63o3GUJoUQYoxh/f5yluV6eCP/ICdr6hjauxu3TBvI56ektftDNJjsLT3JG/kHeX3TIXYcqSBKYMbQFK6dMICF4/qdMyB+srqWXSXn9vfvKq5k39FT1NWf/f80Pblrs9/8kxKCaFP56gpY/QtY+3uI7wFX/hgmf6nt+/6u+RW89x/wQA6kRuYG8gGxaSm8uhi++jH0G+d2NI7SpBACSiureXX9AZbmeSgsrqRrbDTXTujPomkDmTo4OeRn9DS180gFb2w6yBv5h9hdepKYKOHiYSmICIVHKhpqAYEd8B3Su9s53/yH9+nOsNTuzvX5+4MxsO0f8M/vQ8VBmPJlmPsIdEtp33lOlsKjo+3rr/m1I6Eq7IB//jJYsi/sx280KQQZYwzVtfVUn6ln3f6jLM318O72YmrrDZMH9WRR1kCunTiA7nHhPyHMGMPWgyd4I/8Qq7YdJj42+rxv/oNTuoVeqY2yXfDWt2HXe9BvPFzzGxg4rePne/WrdnzhW9svPP6gOuf3l0K33vDlf7gdieN08Vor6uoNVWfq7E9t/dnbZ+qpPlNHVa297XusqtFj1Y2OtY81Pqb556tr62mcf1O6deGumUO4JWsgmX0ja+s/EWFcWhLj0pJYctUot8PpvDOn4cNfw8e/tYvPrvolZN0N0Z385zV9MWx6yQ5SX3Sff2JVZ1WdgOKtcNl33Y4kqERMUnju07389t3Chg/8M3UdbyF1iYkiPiaK+Nho74/3dkw0PeJjiE+M896POvf52GjiYqIY1CuBOSP70CUmxL4Jq/Pt+Ce8/V1bYXP8LTD/p5DY1z/nTpsCaVmQ8yRMu7ft4xGqbQ6sA1Ov6xOaiJikMCilG/PG9CEupukH+bkf7nHeD/fGH+TxsVHex+yHeqTW/1GNlO+Ht5fAjjeh90j4yhuQMcv/17noPvj7vbD7fRg+1//nj2SeHEAgvdUelYgSMUlh9ohUZo9IdTsMFepqq+GT/7Gzg0TsrKIZX4MYP5S+aM6YG2DF921rQZOCf3myoc8YHa9pwtH2qIgsFJEdIlIoIksucMwtIrJNRLaKyItOxqNUp+xeDb+faaeKZl5pp4te+rBzCQEgJg6m3gk7V9g59co/6uuhKFe7jprhWFIQkWjgceAqYAxwm4iMaXJMJvA9YKYxZiygxV5U8DlxCF75F/jLDVBfC7f/DRY9Dz0HBub6Wf9iyzrnPhWY60WCks+g+oQWwWuGky2F6UChMWa3MaYGeBm4ockx9wKPG2OOARhjih2MR6n2qauFT5+A/50G29+AOd+Dr621rYRA6jEARl8HG56DmlOBvXa48hXBG6RJoSknk0Ia4Gl0v8j7WGMjgBEi8rGIrBWRhc2dSEQWi0ieiOSVlJQ4FK5SjexfC0/OhhXfg0Ez4IG1MGcJxLq0uvyi+6DqOGz+qzvXDzeeHFuUMDnD7UiCjttz3GKATGAOcBvwRxHp2fQgY8yTxpgsY0xWaqoOFisHnSyFfzwAzyyA0+W2m+j2v0Kvoe7GNehi6DvODjiH2ILToOTJtl1HYVY1wB+cTAoHgMadrunexxorApYbY84YY/YAO7FJQqnAqq+HvGfgf6ZC/st205sHc2y3TTB8cIjYxWxHtsD+T92OJrSdLIWju3SQ+QKcTAq5QKaIZIhIF+BWoGnJx39gWwmISG9sd9JuB2NS6nxVJ+CZ+fDGN215iq9+DPN+DF2Cqzw542+20yezw7vEs+M8Ofa3DjI3y7GkYIypBR4EVgDbgWXGmK0i8hMRud572AqgTES2Ae8D3zHGlDkVk1LN2vC8nZ54w+PwldfP7oIWbLok2Eqr21+HEwfdjiZ0ebIhKhb6T3I7kqDk6JiCMeYtY8wIY8wwY8zPvI/90Biz3HvbGGP+1Rgzxhgz3hjzspPxKHWe+no71TN9Oky+Izi6iloy7R5bmiHvGbcjCV2ebBgwyb1JA0HO7YFmpdy15wPbvzztHrcjaZteGTBiAaz7s11drdqntgYOrNeuoxZoUlCRLfcpSEix5SRCxfTFcLIEtr3mdiSh53A+1FXrIHMLNCmoyHX8AOx4y/bTh1JXwtDL7VadOuDcfr5Fa+maFC5Ek4KKXOv+bOf8Z93ldiTtExVlWwsH8mz5Z9V2nmzoOQh69Hc7kqClSUFFptoaWP8sZM6H5CFuR9N+E2+DLt0h549uRxI6jLHTUXU8oUWaFFRk+uwNqDwSOgPMTcX3gIm3wpa/2cVYqnXHPVBxSJNCKzQpqMiU+zT0HBzaexRMXwx1NbYbTLWuYdGajie0RJOCijzF22HfR7YkdVS029F0XOpIyJht1yzU1bodTfDzZENsN+gz1u1IgpomBRV5cp+G6Dg76yjUXXQfnPDOolIt82RD+lSIjpgNJztEk4KKLNUVsOllGHsjdEtxO5rOG7EQkgbZ6qnqwqor4fAWHU9oA00KKrLkL4OaitAdYG4qKhqm3Q17P4Qj29yOJngdXA+mTpNCG2hSCLS6WjhT5XYUkckY23XUbwKkZ7kdjf9M+TLExGtroSUNi9bC6L+7QzQpBNpb34anrtSNUtywfy0Ub7WthGAvfNceCb1g3Bcgf6ndGEidz5MDqaOga7LbkQQ9TQqBVF9n69Uc2Qxlu9yOJvLkPgVxSTD+C25H4n/T74Uzp2Dji25HEnzq672L1nQqaltoUgikA+vg9FF7u2CFu7FEmspim5AnfTH4Ns/xhwGTbH957h/th6A6q6wAqsp1PKGNNCkEUsFKkCg7W6RgpdvRRJb1f4H6M3ZQNlxNXwxHd8Oud92OJLj4xhM0KbSJJoVAKlhpqzOOvQH2fmynySnn1ddB3p/sQq/eYbwF+OjroXtfrZ7alCfbjiWkDHc7kpCgSSFQKg7DoU0wYj5kLrDfWnevdjuqyLBzBZwoCp9pqBcS08Wu0i5cpWNWjfmK4IXT5AIHaVIIlIJV9nfmfBg0A+J6aBdSoOQ+BYn9YeTVbkfivKl3QlSM/ZsVnDoKpTu166gdNCkESsEKSBwAfcdBdCwMu9wmCp2a6qyyXbaPfepdkVHeILGf3UVuwwvaPQknzrE8AAAd2klEQVRQlGt/a1JoM00KgVBbA7tWQ+a8s03YzPlQcRCObHE1tLCX94z95jzly25HEjjT74Pq47B5mduRuM+Tbf/7D5jsdiQhQ5NCIOz/1JZWyJx/9rHh8+zvnTo11TFnTsPGF2DUtZG109bA6XbVdvaT2hL15Nj3okuC25GEDE0KgVCwEqJiYeics48l9oX+k86ONSj/2/oqnD4W/gPMTYnY6qkl22HvR25H4566M3ZtkHYdtYsmhUAoWAlDZkJc93Mfz5wPRTl2MEz5X+5T0HskDLnU7UgCb9xN0LUX5ETw9NQjW+wqb13J3C5tSgoicqOIJDW631NEPudcWGHk6B47+yFzwfnPjVgAph52vRf4uMLdgfX2W2K41Tlqq9iudhzlszeh3ON2NO5o2GlNWwrt0daWwo+MMcd9d4wx5cCPnAkpzBS+Y383Hk/wGTAZElJ0aqoT8p62u2xNXOR2JO7J+hf7O+8Zd+NwiycbeqRDUprbkYSUtiaF5o6LgPl9frBzBfQaCr2bWU0ZFW0HnAtW2VW3yj9OH4PNr8CEWyA+qfXjw1XyYBhxFax/NjLLte/P1q6jDmhrUsgTkUdFZJj351FgnZOBhYWaU3bzk+ZaCT6Z82yRvAPrAxdXuNv4ItRWhXedo7a6aDGcKrOD7pHkeJFdxa5dR+3W1qTwdaAGWAq8DFQBDzgVVNjY+6H9cGopKQyfa4vkadVU/6ivtxvpDJwB/ca7HY37MmbbwfacP0TW9NSG8QRtKbRXm5KCMeakMWaJMSbLGDPNGPN9Y8xJp4MLeQUrITYBBs+88DFdk+23GR1X8I89q+HorsibhnohInavhYMb7MB7pPDkQExX/WLQAW2dfbRKRHo2up8sIvrVtiXGwM6V9ptabHzLx2bOs8XyKg4HJrZwlvs0JPSGMde7HUnwmHgrdEmMrOqpnmxIm2pLyqh2aWv3UW/vjCMAjDHHgD7OhBQmSnbA8f22KmprfNNVdSFb5xwvgh1vefcsjnM7muARlwiTb7fjCpXFbkfjvJpTcDhfu446qK1JoV5EBvnuiMgQIII6KDvAN0bgK2fRkr5joUeadiF11ro/2xZa1l1uRxJ8pt1jy7Wv+7PbkTjv4Aaor9VB5g5qa1L4d+AjEXlORJ4HPgC+51xYYaBgFfQZCz0Htn6siO1C2vW+LZ6n2q+2BtY9axcE9hzU+vGRpncmDLvCrlmoO+N2NM7y7bSWPs3dOEJUWwea/wlkATuAl4BvAacdjCu0VR23RfAy29BK8Mmcb4vmedY6F1c4++x1OFmsA8wtmX4fVByCz95wOxJneXIgJRO6pbgdSUhq60DzPcC72GTwbeA54BHnwgpxu963zdcRzZS2uJCM2RDdRaumdlTu09BzMAyb63YkwStznn2Psp90OxLnGGNbCtp11GFt7T76BjAN2GeMuRyYDJS3/BIQkYUiskNECkVkSQvH3SQiRkSy2hhPcCtYZVfSprdjoCuuu526qoPN7XdkG+z72C5Wi9IajxcUFW2np+7/BA5vdjsaZ5TtsotBdZC5w9r6L6jKGFMFICJxxpjPgJEtvUBEooHHgauAMcBtIjKmmeMSsUknuz2BB636ejtgPGxu+3f6GrEASnfAsb2OhBa28p6G6DiYdIfbkQS/Sbfb+fs5Ydpa8I0naEuhw9qaFIq86xT+AawSkdeAfa28ZjpQaIzZbYypwa6EvqGZ4/4D+C/sKunQd3iT7dtuaRXzhfheo62FtquugE0vw7jPax9yWyT0sjWh8v8aniXbPdm2ld57hNuRhKy2DjTfaIwpN8Y8AvwAeBporXR2GtC4Zm+R97EGIjIFGGiMebOlE4nIYhHJE5G8kpKStoTsnp0rAYHhV7b/tSnDbPE8HVdou/ylUFOpA8ztMf1eqD0NG553OxL/8+TYblvtRuywdr9zxpgPjDHLvd/+O0xEooBHsYPXrV3zSW+JjazU1NTOXNZ5BSshbQp072CcmQtszaSaU/6NKxwZYweY+0+0q1dV2/QbD4MusZsQhVN13tPldrc57TrqFCfT6QGg8ST9dO9jPonAOGC1iOwFZgDLQ3qw+WSprS/Tka4jn8x5toheJG+j2Fb7P4XibZG7kU5nXLQYyveFV1dlUZ79rYPMneJkUsgFMkUkQ0S6ALcCy31PGmOOG2N6G2OGGGOGAGuB640xeQ7G5KzCdwDTuaQw5FJbRE+rprYu9ymIS4JxX3A7ktAz6lpIHBBe23V6skGitdXYSY4lBWNMLfAgsALYDiwzxmwVkZ+ISHhWKytYCd36QP9JHT9HTBwMnWPPFUmljtur4ghsW25r+nRJcDua0BMda3dm2/UelBa4HY1/eLKh37jz90JX7eLoaIwx5i1jzAhjzDBjzM+8j/3QGLO8mWPnhHQroa7WthQy53V+kCtzPpTvt0X1VPM2/MXW8vFtOanab+pX7ILJnD+6HUnn1dXarlsdT+g0HaL3l6JcW96iPaUtLsR3Di2Q17y6Wsj7s21R9c50OZgQ1r0PjL3R7lRXXeF2NJ1TvM3OQtOk0GmaFPylYIXtzxx2RefPlZQOfcdpUriQghV2q0Wdhtp50xfbmlubXnY7ks5pWLSmg8ydpUnBXwpWwaCL/bdRfOY8O7um6rh/zhdOcp+yg6QjrnI7ktCXNhUGTLZdSKE8huXJgcT+kNSGqsSqRZoU/OF4ERzZ4p+uI5/M+bao3u7V/jtnOCjbZQdHs+5qfxkRdT4RWz21dAfs+cDtaDrOk21bCTo1udM0KfiDb653e6qitiZ9um117NQupHPkPQNRMXZ3NeUfY2+EhJTQrZ5acdiuudDxBL/QpOAPBatsszV1lP/OGR1ji+oVrrJF9pRd5b3heRh9HST2czua8BEbD1PvhJ1vw7HWSpoFIU+O/a1JwS80KXRWbbXt4smc7/+m64gFUHnEFtlTsPXvUFWuA8xOyPoXQGzF2VDjybZVcvtNcDuSsKBJobP2fQxnTnZuFfOFDL8SkPAqRdAZuU/Z1tjgmW5HEn6S0mHUNbD+L3AmxDZV9OTYemMxXdyOJCxoUuisnSvtt5SMy/x/7m697ewQrZpqFyYd3KB1jpw0fTGcPgZb/uZ2JG13pgoObdSpqH6kSaGzClZCxiznSi1kzrcfiCdLnTl/qMh9GmK7wYRFbkcSvoZcCn3GQPYfQmd66qGNUFej4wl+pEmhM8p2wdFdtty1UzLnAQYK33XuGsHu1FH77XXiIojv4XY04UvE7rVwOP/s4G2w8y1aa8/Wt6pFmhQ6w7fi2J/rE5rqP8kW2YvkqqkbX7TlxLPudjuS8Df+Flt5NlSqp3py7MZUHd2/RJ1Hk0Jn7FwBKZnQK8O5a0RF2aRT+K6t+RNp6uvtjJhBF9sKmMpZcd1tobwtf4dtr7kdTcuM8S5a064jf9Kk0FHVlXbmkT8XrF1I5nw7FbMo1/lrBZvd78PR3ToNNZAu/z6kT4O/Lz67cU0wOrYHTpboILOfaVLoqD1r7ACXk11HPsMut6t4I7FAXu7T0C3VLlhTgRHbFW57yS4QfHERHN3jdkTN00VrjtCk0FEFK6BLd7vXrdPik2z3SaQlhXKPXWU75ct28yEVON16w+2v2PpbL95ip6oGG082xPXwbyUBpUmhQ4yxC8qGzgncgpnMebbo3vEDrR8bLtb92f6eeqebUUSu3plw64twbC8s/RLU1rgd0bk8OZCeBVHRbkcSVjQpdMSRrXDiQGDGE3x8014jpbVQWwPrn4URC6HnILejiVxDZsINj8PeD2H514Nn/ULVCfvvULuO/E6TQkf4PpiHB2A8wSd1JCQNipySF9uX20HEaToN1XUTboHL/x3yX4YP/svtaKwDeYDRQWYHaFLoiIKVtvhWj/6Bu6aI7ULavdoW4Qt3uU9DcgYM9cNOdqrzLvsOTLodVv8nbHzJ7Wi8g8wCaVluRxJ2NCm01+ljdoDLiQJ4rRmxwBbf2/dx4K8dSEe2wv5PbCshSv8XDQoicO1jtsbX8q/Dng/djceTDX3H6gp3B+i/uPba9R6YeneSwpBZEBMf/l1IuU/bv3PS7W5HohqL6QK3PAcpw2Dp7VCyw5046uvs+gkdT3CEJoX22rkSuibbWQ+B1iXBJoZwrppadQLyl8K4myChl9vRqKa69oQvLrOVgV+4GSpLAh9DyWdQfUKTgkM0KbRHfb3dCW34le5Ng8ucb4vwle1y5/pOy18KNZU6wBzMkgfDF1+GymJ46dbA77/gK4Kng8yO0KTQHgfXw6kyZ6uitsa3gjocp6YaY7uOBky2+0io4JU2FW56ypZ1//u9gd0y1pNji0QmDwncNSOIJoX2KFgJEgXD57oXQ68M6D0iPJPCvk+gZLvWOQoVo6+FBT+H7a/Dqh8E7rqebNtK0M2WHKFJoT12rrCFwtzu686cD3s/gpqT7sbhb7lPQXxPGPt5tyNRbTXjfrtj26f/a//7Oa2yxBZI1PEEx2hSaKuKI3aXp0AUwGtN5nxbjG/3B25H4j8VR+yCtcl3OLeLnfI/EVj4C7vy/K3v2IkYTirSInhO06TQVoXeaaBujif4DLoYuiSGVxfS+r/Y4mtZ/+J2JKq9oqLhpqeh7zh45S44lO/ctTzZEN0F+k907hoRTpNCWxWshO79oN94tyOx88WHzbExBUstms6oq4V1f4JhV9g58Cr0xHW3U1Xje9qqqk4VbvTk2N0IY+OdOb/SpNAmdWdg1/u26yhYBrcy59uifMXb3I6k83b+0/4tOsAc2nr0h9uX2Q2oXrzFrjnxp9oaOLBep6I6TJNCW+xfaxfLBLIqamt8xfjCYSFb7lPQIy04uuZU5/QdC7c8C8XbbVeSP7eQPZwPddU6nuAwTQptUbASomLt/gnBokd/W5Qv1EtelBbaLTen3gXRMW5Ho/xh+Fy49jdQ+A689W3/dXHqorWA0KTQFgUrYfAlEJfodiTnGrHA/kMJxl2x2irvGbvV6JQvux2J8qepX4FLv2nHij75nX/O6cmGnoPtNqHKMZoUWnNsn6214kYBvNZkzgdTZ4v0haLKYtjwPIy+HhL7uh2N8rcrfmjXnKz6IWx9tXPnMgb2Z2vXUQBoUmiNb9pnMI0n+KRNha69QrMLyRhY/hDUVsHsf3M7GuWEqCj43O/tB/nf7/PugdBB5fuh8rB2HQWAo0lBRBaKyA4RKRSRJc08/68isk1E8kXkXREZ7GQ8HVKwytZYSRnudiTni4q2xfkKVgW29ow/bHwBdr4Nc38IfXTj9bAVGw+3vgRJabZ43tHdHTuPRxetBYpjSUFEooHHgauAMcBtIjKmyWEbgCxjzATgFeCXTsXTIWdOw541dlZMsExFbSpzPpwqhYMb3I6k7Y7tg7eXwOBLYcbX3I5GOa1bCtz+it2H5IVb4NTR9p/Dkw1dukOfph8hyt+cbClMBwqNMbuNMTXAy8ANjQ8wxrxvjDnlvbsWSHcwnvbb+xHUng7O8QSf4XNtkb6CEJmaWl8P//gaYOBzT+jOapEiZZhtMZTvg6V3tH9LWU+27S7VGWqOc/JfZBrgaXS/yPvYhdwNvN3cEyKyWETyRCSvpCSAm3oUrISYrjBkZuCu2V4JvWyRvlApeZH9e9j3ka2Xkxx8vYXKQYMvtmMM+z6G1x5s+1TV6ko4skW7jgIkKL6micgdQBbw3809b4x50hiTZYzJSk1NDUxQxtiFYUNnQ2zXwFyzozLn2+6jiiNuR9Ky4s/gnR/DyKtt4TsVecZ/Aa74f7B5Gbz/87a95sA62/WkSSEgnEwKB4CBje6nex87h4hcCfw7cL0xpp1tSgeVFtimbjBURW2Nr3ur8B1342hJ3Rl4dbGtkXPdb4N3jEY5b9a37ZeCNb+EDS+0frxvkNmNLXAjkJNJIRfIFJEMEekC3Aosb3yAiEwG/oBNCMUOxtJ+vj76YB5P8Ok3HhL7B3cX0pr/hkObbELo3sftaJSbRODax2yFgNcfar0EvCcbUkfb/aGV4xxLCsaYWuBBYAWwHVhmjNkqIj8Rkeu9h/030B34q4hsFJHlFzhd4BWstP8j9hzkdiStE7Etml3v2W/kwaZoHaz5FUy8DUZf53Y0KhhEx8Itf4GUTFj6Jdu12Jz6eruHgq5PCBhHxxSMMW8ZY0YYY4YZY37mfeyHxpjl3ttXGmP6GmMmeX+ub/mMAVJ1wm4NOSIEWgk+mQts0T5ffZhgUXMKXr3PtmQW/sLtaFQwiU+yVVVj4+GFm5sfEyvdCVXHdTwhgIJioDno7F5tN3wJha4jn6GzbdG+YKua+u6PoawAPve4Nv/V+XoOgttetmttXrrVfolorKEIniaFQNGk0JyCFRCXFFr/I8Yl2qJ9wVTyYvdqyP4/uOirwVVhVgWXtClw01N2Bt3f74X6urPPeXIgIUU3XwogTQpNGWM/WIddbvs9Q8mIBVCy3daJcdvpcrtILSUT5v7I7WhUsBt1je1e/OwNWPmDs497vEXwdLZawGhSaOpwPlQeCa2uIx9fzMEwC+mfS6DiMNz4B+iS4HY0KhTM+KptVa59HHL+CCfLbNejDjIHlK4Zb2qn9wM1FNYnNJUyHJIz7N/g5taW25bDppds9dP0qe7FoULPgp/blu7b37W7t0FodeOGAW0pNFWwEgZMDs259CK2tbBnjS3m54bKYnjjYeg/ES77jjsxqNAVFW3HF/pNgLyn7QZMAya7HVVE0aTQ2MkyKMoN7b2CR8y3Rfz2fhz4a/v2SKiuhBufDL0xGRUcunSDLy6FpIGQlhX8ZWbCjHYfNbbrXcCE5niCz+BLbRG/ghWQeWVgr+3bI2HBz3WPBNU5if3gvjW25pEKKG0pNLZzBST0Du3mamy8XbNQsNJ/G6a3ReM9Ei66P3DXVeEroRd06+12FBFHk4JPfZ0tKJc5L/Rr/GfOh2N7bVG/QGjYIwHdI0GpEKf/en2K8qCqPLS7jnwCPTXVt0fCVbpHglKhTpOCT8EKkGi7aC3U9Rxoty0MxG5sjfdImHS789dTSjlKk4JPwUo7H7prstuR+EfmPNj3qS3u5xTdI0GpsKNJAeDEQTi8ObSqorYmcwHUn4E9rdSq74wPfql7JCgVZjQpwNkicuEwnuAzcLot6udU1dSiPPjw17pHglJhRpMC2K6jHum2Hz5cRMfC8CtswvP31NTGeyRc9V/+PbdSylWaFGqrbYnnzHnh1yeeOR8qD9sif/70ziNQVminn8Yn+ffcSilXaVLY9wnUVNqy0+FmuHdFsz+npu56H3L+YBeoDZ3tv/MqpYKCJoWCVRAdBxmXuR2J/3XvAwOmnK382lmny+G1B6D3CLhS90hQKhxpUihYCUMutUW4wlHmfFvk72RZ58/19r9590j4Py1SplSYiuykcHS33cQjnGYdNTViPmC8xf46YdtrkP+yLYedpnskKBWuIjspNExFDcENddqq/2Toltq5cYWKI/D6w9B/Elz2bf/FppQKOpGdFHausLuVhfOm4FFRMHyeLfbXeEP0tjIGXv8G1JyEz+seCUqFu8hNCjUnYe9H4d115JM5D04fswvO2mvD83aPhCsfgdSR/o5MKRVkIjcp7FkDddWRkRSGXWGL/bW3C+nYXvjnEhgyy26orpQKe5GbFApWQmw3GHyJ25E4r2tPGDSjfVVTG/ZIEN0jQakIEpn/0o2xc/eHXQ4xcW5HExiZ82zRvxMH23b82idg38e2jEXPQc7GppQKGpGZFIq3w4mi8J511FSmd8W2b8ZVS4q3w7s/gZHXwKQvOhuXUiqoRGZS8PWtR8J4gk+f0bboX2vjCrU18PfFEJeoeyQoFYEiNyn0HQ89BrgdSeCI2IVsu1fbD/4LWfPftoDedY9B99SAhaeUCg6RlxROl8P+tZHVdeSTOd8W/9v/SfPPN+yR8EXdI0GpCBV5SWHXe2DqwrMqamsyLrPF/5obVzhnj4RfBD42pVRQiLykULAK4ntCWpbbkQRel262+F9zu7HpHglKKSItKdTXQ+Equ89AdIzb0bhjxAJbBPDo7rOP6R4JSimvyEoKhzbAyZLImnXUVMPGO94uJN0jQSnVSGQlhYJVgJz9YIxEKcNsEUDf1FTdI0Ep1YijSUFEForIDhEpFJElzTwfJyJLvc9ni8gQJ+Nh5wpIz4JuKY5eJuhlLoA9H8Kml+0eCbO/q3skKKUAB5OCiEQDjwNXAWOA20RkTJPD7gaOGWOGA78B/supeKgshoPrz67sjWSZ82wxwH98DQZMhlnfcjsipVSQcLKlMB0oNMbsNsbUAC8DNzQ55gbgWe/tV4C5Ig4toS18x/6OxPUJTQ2+BLp0t3sj3PgH3SNBKdXAySk4aYCn0f0i4KILHWOMqRWR40AKUNr4IBFZDCwGGDSog8XZ4nvaWj79JnTs9eEkJg4W/NxWT9U9EpRSjYTEvExjzJPAkwBZWVmmQycZdbX9UdbUr7gdgVIqCDnZfXQAGNjofrr3sWaPEZEYIAkoczAmpZRSLXAyKeQCmSKSISJdgFuB5U2OWQ74vrJ+AXjPGNOxloBSSqlOc6z7yDtG8CCwAogGnjHGbBWRnwB5xpjlwNPAcyJSCBzFJg6llFIucXRMwRjzFvBWk8d+2Oh2FXCzkzEopZRqu8ha0ayUUqpFmhSUUko10KSglFKqgSYFpZRSDSTUZoCKSAmwr4Mv702T1dIRTt+Pc+n7cZa+F+cKh/djsDGm1Y3XQy4pdIaI5BljInDLtebp+3EufT/O0vfiXJH0fmj3kVJKqQaaFJRSSjWItKTwpNsBBBl9P86l78dZ+l6cK2Lej4gaU1BKKdWySGspKKWUaoEmBaWUUg0iJimIyEIR2SEihSKyxO143CIiA0XkfRHZJiJbReQbbscUDEQkWkQ2iMgbbsfiNhHpKSKviMhnIrJdRC52Oya3iMg3vf9OtojISyIS73ZMTouIpCAi0cDjwFXAGOA2ERnjblSuqQW+ZYwZA8wAHojg96KxbwDb3Q4iSPwW+KcxZhQwkQh9X0QkDXgIyDLGjMNuARD25f0jIikA04FCY8xuY0wN8DJwg8sxucIYc8gYs957uwL7Dz7N3ajcJSLpwDXAU27H4jYRSQIuw+51gjGmxhhT7m5UrooBunp3hkwADrocj+MiJSmkAZ5G94uI8A9CABEZAkwGst2NxHWPAd8F6t0OJAhkACXAn7zdaU+JSDe3g3KDMeYA8CtgP3AIOG6MWeluVM6LlKSgmhCR7sDfgIeNMSfcjsctInItUGyMWed2LEEiBpgC/N4YMxk4CUTkGJyIJGN7FDKAAUA3EbnD3aicFylJ4QAwsNH9dO9jEUlEYrEJ4QVjzN/djsdlM4HrRWQvtlvxChF53t2QXFUEFBljfK3HV7BJIhJdCewxxpQYY84AfwcucTkmx0VKUsgFMkUkQ0S6YAeLlrsckytERLD9xduNMY+6HY/bjDHfM8akG2OGYP+/eM8YE/bfBi/EGHMY8IjISO9Dc4FtLobkpv3ADBFJ8P67mUsEDLo7ukdzsDDG1IrIg8AK7AyCZ4wxW10Oyy0zgS8Bm0Vko/ex73v301YK4OvAC94vULuBu1yOxxXGmGwReQVYj521t4EIKHehZS6UUko1iJTuI6WUUm2gSUEppVQDTQpKKaUaaFJQSinVQJOCUkqpBpoUlGpCROpEZGOjH7+t6BWRISKyxV/nU8rfImKdglLtdNoYM8ntIJRyg7YUlGojEdkrIr8Ukc0ikiMiw72PDxGR90QkX0TeFZFB3sf7isirIrLJ++MrkRAtIn/01ulfKSJdXfujlGpCk4JS5+vapPtoUaPnjhtjxgP/i62uCvA/wLPGmAnAC8DvvI//DvjAGDMRWz/It4o+E3jcGDMWKAducvjvUarNdEWzUk2ISKUxpnszj+8FrjDG7PYWFTxsjEkRkVKgvzHmjPfxQ8aY3iJSAqQbY6obnWMIsMoYk+m9/29ArDHmp87/ZUq1TlsKSrWPucDt9qhudLsOHdtTQUSTglLts6jR70+9tz/h7DaNtwMfem+/C9wPDXtAJwUqSKU6Sr+hKHW+ro0qyILdr9g3LTVZRPKx3/Zv8z72dexOZd/B7lrmqyr6DeBJEbkb2yK4H7uDl1JBS8cUlGoj75hCljGm1O1YlHKKdh8ppZRqoC0FpZRSDbSloJRSqoEmBaWUUg00KSillGqgSUEppVQDTQpKKaUa/H98TzxgDGGu/QAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_train_history(train_history, 'acc', 'val_acc')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_train_history(train_history, 'loss', 'val_loss')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. 评估模型的准确率" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25000/25000 [==============================] - 12s 495us/step\n", "\n", "accuracy: 0.77672\n" ] } ], "source": [ "scores = model.evaluate(x_test, y_test)\n", "print()\n", "print('accuracy:', scores[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. 进行预测" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.1 执行预测" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "predictions = model.predict_classes(x_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.2 将预测结果转换为一维数据" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "predictions = predictions.reshape(-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.3 预测结果" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1, 1, 1, 0, 0, 1, 0, 0], dtype=int32)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predictions[:10]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype=int32)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predictions[12500:12510]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.4 对比 \"影评文字\" 与预测结果" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "Sentiment_Dict = {1: '正面的', 0: '负面的'}\n", "\n", "def display_test_sentiment(idx):\n", " print('影评文字:')\n", " print(test_text[idx])\n", " print()\n", " print('标签:', Sentiment_Dict[y_test[idx]])\n", " print('预测结果:', Sentiment_Dict[predictions[idx]])" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "影评文字:\n", "I really like this show. It has drama, romance, and comedy all rolled into one. I am 28 and I am a married mother, so I can identify both with Lorelei's and Rory's experiences in the show. I have been watching mostly the repeats on the Family Channel lately, so I am not up-to-date on what is going on now. I think females would like this show more than males, but I know some men out there would enjoy it! I really like that is an hour long and not a half hour, as th hour seems to fly by when I am watching it! Give it a chance if you have never seen the show! I think Lorelei and Luke are my favorite characters on the show though, mainly because of the way they are with one another. How could you not see something was there (or take that long to see it I guess I should say)? Happy viewing!\n", "\n", "标签: 正面的\n", "预测结果: 正面的\n" ] } ], "source": [ "display_test_sentiment(2)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "影评文字:\n", "In Los Angeles, the alcoholic and lazy Hank Chinaski (Matt Dillon) performs a wide range of non-qualified functions just to get enough money to drink and gamble in horse races. His primary and only objective is writing and having sexy with dirty women.\"Factotum\" is an uninteresting, pointless and extremely boring movie about an irresponsible drunken vagrant that works a couple of days or weeks just to get enough money to buy spirits and gamble, being immediately fired due to his reckless behavior. In accordance with IMDb, this character would be the fictional alter-ego of the author Charles Bukowski, and based on this story, I will certainly never read any of his novels. Honestly, if the viewer likes this theme of alcoholic couples, better off watching the touching and heartbreaking Hector Babenco's \"Ironweed\" or Marco Ferreri's \"Storie di Ordinaria Follia\" that is based on the life of the same writer. My vote is four.Title (Brazil): \"Factotum – Sem Destino\" (\"Factotum – Without Destiny\")\n", "\n", "标签: 负面的\n", "预测结果: 负面的\n" ] } ], "source": [ "display_test_sentiment(12502)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7. 预测新的影评" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.1 定义用于根据影评文字进行正负面预测的函数" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def predict_preview(input_text):\n", " input_seq = token.texts_to_sequences([input_text])\n", " pad_input_seq = sequence.pad_sequences(input_seq, maxlen=150)\n", " predict_result = model.predict_classes(pad_input_seq)\n", " print(Sentiment_Dict[predict_result[0][0]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2 预测某些新的影评" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "负面的\n" ] } ], "source": [ "input_text = '''\n", "It's hard to believe that the same talented director who made the influential cult action classic The Road Warrior had anything to do with this disaster.\n", "Road Warrior was raw, gritty, violent and uncompromising, and this movie is the exact opposite. It's like Road Warrior for kids who need constant action in their movies.\n", "This is the movie. The good guys get into a fight with the bad guys, outrun them, they break down in their vehicle and fix it. Rinse and repeat. The second half of the movie is the first half again just done faster.\n", "The Road Warrior may have been a simple premise but it made you feel something, even with it's opening narration before any action was even shown. And the supporting characters were given just enough time for each of them to be likable or relatable.\n", "In this movie there is absolutely nothing and no one to care about. We're supposed to care about the characters because... well we should. George Miller just wants us to, and in one of the most cringe worthy moments Charlize Theron's character breaks down while dramatic music plays to try desperately to make us care.\n", "Tom Hardy is pathetic as Max. One of the dullest leading men I've seen in a long time. There's not one single moment throughout the entire movie where he comes anywhere near reaching the same level of charisma Mel Gibson did in the role. Gibson made more of an impression just eating a tin of dog food. I'm still confused as to what accent Hardy was even trying to do.\n", "I was amazed that Max has now become a cartoon character as well. Gibson's Max was a semi-realistic tough guy who hurt, bled, and nearly died several times. Now he survives car crashes and tornadoes with ease?\n", "In the previous movies, fuel and guns and bullets were rare. Not anymore. It doesn't even seem Post-Apocalyptic. There's no sense of desperation anymore and everything is too glossy looking. And the main villain's super model looking wives with their perfect skin are about as convincing as apocalyptic survivors as Hardy's Australian accent is. They're so boring and one-dimensional, George Miller could have combined them all into one character and you wouldn't miss anyone.\n", "Some of the green screen is very obvious and fake looking, and the CGI sandstorm is laughably bad. It wouldn't look out of place in a Pixar movie.\n", "There's no tension, no real struggle, or any real dirt and grit that Road Warrior had. Everything George Miller got right with that masterpiece he gets completely wrong here. \n", "'''\n", "\n", "predict_preview(input_text)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "负面的\n" ] } ], "source": [ "input_text = '''\n", "Sure, I'm a huge film snob who (on the surface) only likes artsy-fartsy foreign films from before the 60's, but that hasn't stopped me from loving Disney's Beauty & The Beast; in fact, it's probably my favorite American animated film and is easily Disney's finest work. It's beautiful, it's breathtaking, it's warm, it's hilarious, it's captivating, and, in Disney fashion, it's magical. When I learned that Disney would be remaking their classic films, B&TB was undeniably the best wrapped package. How could they go wrong?\n", "Oh man, they went wrong.\n", "First thing's first: this film is so flat. The directing was dull and uninteresting throughout the entire film and it honestly felt like one of the Twilight sequels...and then I looked it up and found out that, yes, director Bill Condon was the man behind Breaking Dawn parts 1 & 2. Every shot looks bored and uninterested, which contrasts heavily with the original animated film that was constantly popping with vibrancy. The script too is boring because it's almost a complete remake of the original, though I guess most people won't mind that.\n", "Next: the CGI is horrid. Although I didn't care for The Jungle Book from last year, I could at least admit that the CGI was breathtaking. The same cant be said for this film. Characters like Lumière, Cogsworth, Mrs Potts, and most of the cursed appliances have very strange, lifeless faces that are pretty off putting to be looking at for such a long time. All of the sets too look artificial and fake, especially the town towards the beginning. However, the biggest offender is easily and infuriatingly the character that mattered most: The Beast. The CGI on the Beast's face is so distracting that it completely takes you out of the film. His eyes are completely devoid of soul, and his mouth is a gaping video game black hole of fiction. Klaus Kinski looked much better in the Faerie Tale Theatre episode of Beauty & The Beast, and that was a 1984 TV show episode. But do you know why it looked better? Because it was an actual face with actual eyes, not some video game computerized synthetic monstrosity. When will studios learn that practical effects will always top CGI?\n", "Finally: wasted casting. Emma Watson is beautiful, but she's no Belle. She is completely devoid of the warmth and humanity that made the animated Belle so beloved. Instead, she is cold and heartless throughout most of the film. Kevin Kline is 100% wasted and does nothing except look old. Ian McKellan, Ewan McGregor, Emma Thompson, and even Dan Stevens as the Beast are very expendable and could've been played by anyone else. The only good characters are Gaston and LeFou, mostly because they are fun and played by actors who breathe new life into their original shapes. If anything, this film should've been about Gaston and LeFou, but that would never happen because that would mean Disney couldn't cater to blind nostalgic 90's kids.\n", "Overall, this film is a complete bore. It could've been better if even the special effects were good, but the CGI in particular is horrendous. I'm all for Disney remaking their nostalgia- catering 90's films, but they need to be interesting. This film, sadly, is not. Even the Christmas sequel is better than this film because it's at least something. \n", "'''\n", "\n", "predict_preview(input_text)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "正面的\n" ] } ], "source": [ "input_text = '''\n", "I was really looking forward to this film. Not only has Disney recently made excellent live-action versions of their animated masterpieces (Jungle Book, Cinderella), but the cast alone (Emma Watson, Ian McKellen, Kevin Kline) already seemed to make this one a sure hit. Well, not so much as it turns out.\n", "Some of the animation is fantastic, but because characters like Cogsworth (the clock), Lumière (the candelabra) and Chip (the little tea cup) now look \"realistic\", they lose a lot of their animated predecessors' charm and actually even look kind of creepy at times. And ironically - unlike in the animated original - in this new realistic version they only have very limited facial expressions (which is a creative decision I can't for the life of me understand).\n", "Even when it works: there can be too much of a good thing. The film is overstuffed with lush production design and cgi (which is often weirdly artificial looking though) but sadly lacking in charm and genuine emotion. If this were a music album, I'd say it is \"over-produced\" and in need of more soul and swing. The great voice talent in some cases actually seems wasted, because it drowns in a sea of visual effects that numbs all senses. The most crucial thing that didn't work for me, though, is the Beast. He just never looks convincing. The eyes somehow don't look like real eyes and they're always slightly off.\n", "On the positive side, I really liked Gaston, and the actor who played him, Luke Evans, actually gave the perhaps most energized performance of all. Kevin Kline as Belle's father has little to do but to look fatherly and old, but he makes the most of his part. Speaking of Belle, now that I've seen the film, I think her role was miscast. I think someone like Rachel McAdams would actually have been a more natural, lively and perhaps a bit more feisty Belle than Emma Watson.\n", "If you love the original, you might want to give this one a pass, it's really not that good (although at least the songs were OK). Also, I'd think twice before bringing small children; without cute animated faces, all those \"realistic\" looking creatures and devices can be rather frightening for a child. \n", "'''\n", "\n", "predict_preview(input_text)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "负面的\n" ] } ], "source": [ "input_text = '''\n", "Full disclosure, I didn't think the first movie was as bad as it was made out to be. It wasn't good in almost any sense, but it was to be expected given the combination of source material, resources and constraints.\n", "That said, this sequel is 20x better than the first. Having established the characters in the first movie, the actors seem to be able to act now comfortably in their parts. The story becomes much more nuanced with plenty of dynamics on the go.\n", "SPOILERS from now on\n", "Can they maintain a \"vanilla\" relationship? Is he going to become controlling again and ruin things? Will she let it get out of control and ruin things also or stay on it? Who is that stalky girl and what happened to her exactly? what about his mother? and that ex of his? Will something occur with her infatuated boss?\n", "On top of all of this, I realised while watching that the series was never about a bizarre sadist control freak, it's actually about all men and the story of a woman trying to find the balance between accepting or desiring the dominant behaviour of the male archetype and maintaining strength and independence in such a relationship.\n", "While of course the fact that he is rich, while possibly relating to the power struggle, looks like it is going to be more and more used for generating further drama. The romance is much more evident in this movie to\n", "'''\n", "\n", "predict_preview(input_text)" ] } ], "metadata": { "kernelspec": { "display_name": "tensorflow-keras-practice", "language": "python", "name": "tensorflow-keras-practice" }, "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }