├── .gitignore
├── Arabic_CNN.ipynb
├── Arabic_LSTM.ipynb
├── Comparison.ipynb
├── WorkOnVersion.ipynb
├── history
├── fasttext-true.db
├── fasttext.db
├── hist_sg_true_10.json
├── lstm_results.db
└── results.csv
├── readme.md
└── utils.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | data/
4 | img/
5 | arabic_bins/
6 | *.py[cod]
7 | *$py.class
8 | web*
9 | *.npy
10 | *.csv
11 | # C extensions
12 | *.so
13 | .idea
14 | # Distribution / packaging
15 | .Python
16 | build/
17 | develop-eggs/
18 | dist/
19 | downloads/
20 | eggs/
21 | .eggs/
22 | lib/
23 | lib64/
24 | parts/
25 | sdist/
26 | var/
27 | wheels/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 | MANIFEST
32 |
33 | # PyInstaller
34 | # Usually these files are written by a python script from a template
35 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
36 | *.manifest
37 | *.spec
38 |
39 | # Installer logs
40 | pip-log.txt
41 | pip-delete-this-directory.txt
42 |
43 | # Unit test / coverage reports
44 | htmlcov/
45 | .tox/
46 | .coverage
47 | .coverage.*
48 | .cache
49 | nosetests.xml
50 | coverage.xml
51 | *.cover
52 | .hypothesis/
53 | .pytest_cache/
54 |
55 | # Translations
56 | *.mo
57 | *.pot
58 |
59 | # Django stuff:
60 | *.log
61 | local_settings.py
62 | db.sqlite3
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # pyenv
81 | .python-version
82 |
83 | # celery beat schedule file
84 | celerybeat-schedule
85 |
86 | # SageMath parsed files
87 | *.sage.py
88 |
89 | # Environments
90 | .env
91 | .venv
92 | env/
93 | venv/
94 | ENV/
95 | env.bak/
96 | venv.bak/
97 |
98 | # Spyder project settings
99 | .spyderproject
100 | .spyproject
101 |
102 | # Rope project settings
103 | .ropeproject
104 |
105 | # mkdocs documentation
106 | /site
107 |
108 | # mypy
109 | .mypy_cache/
110 |
111 | # corpus text
112 | *.txt
113 |
114 | # words segmentation result
115 | *.json
116 | *.csv
117 |
118 | # models trained
119 | *.bin
120 | *.vec
121 |
--------------------------------------------------------------------------------
/Comparison.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Results and Comparison of CNN models"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import pandas \n",
17 | "import matplotlib\n",
18 | "import matplotlib.pyplot as plt\n"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "metadata": {},
25 | "outputs": [],
26 | "source": [
27 | "lines = pandas.read_csv('./history/results.csv', index_col=0)"
28 | ]
29 | },
30 | {
31 | "cell_type": "code",
32 | "execution_count": 3,
33 | "metadata": {},
34 | "outputs": [
35 | {
36 | "data": {
37 | "text/html": [
38 | "
\n",
39 | "\n",
52 | "
\n",
53 | " \n",
54 | " \n",
55 | " | \n",
56 | " train acc | \n",
57 | " train acc std | \n",
58 | " test acc | \n",
59 | " test acc std | \n",
60 | " train loss | \n",
61 | " train loss std | \n",
62 | " test loss | \n",
63 | " test loss std | \n",
64 | "
\n",
65 | " \n",
66 | " \n",
67 | " \n",
68 | " w2v sg train | \n",
69 | " 96.202 | \n",
70 | " 0.640 | \n",
71 | " 94.924 | \n",
72 | " 0.100 | \n",
73 | " 12.032 | \n",
74 | " 2.020 | \n",
75 | " 16.286 | \n",
76 | " 0.390 | \n",
77 | "
\n",
78 | " \n",
79 | " w2v cbow No train | \n",
80 | " 95.083 | \n",
81 | " 0.040 | \n",
82 | " 94.514 | \n",
83 | " 0.070 | \n",
84 | " 15.751 | \n",
85 | " 0.084 | \n",
86 | " 19.071 | \n",
87 | " 0.190 | \n",
88 | "
\n",
89 | " \n",
90 | " fasttext sg No train | \n",
91 | " 95.916 | \n",
92 | " 0.009 | \n",
93 | " 95.382 | \n",
94 | " 0.017 | \n",
95 | " 12.907 | \n",
96 | " 0.012 | \n",
97 | " 14.690 | \n",
98 | " 0.019 | \n",
99 | "
\n",
100 | " \n",
101 | " fasttext sg train | \n",
102 | " 96.865 | \n",
103 | " 0.012 | \n",
104 | " 96.166 | \n",
105 | " 0.018 | \n",
106 | " 10.102 | \n",
107 | " 0.058 | \n",
108 | " 12.812 | \n",
109 | " 0.045 | \n",
110 | "
\n",
111 | " \n",
112 | "
\n",
113 | "
"
114 | ],
115 | "text/plain": [
116 | " train acc train acc std test acc test acc std \\\n",
117 | "w2v sg train 96.202 0.640 94.924 0.100 \n",
118 | "w2v cbow No train 95.083 0.040 94.514 0.070 \n",
119 | "fasttext sg No train 95.916 0.009 95.382 0.017 \n",
120 | "fasttext sg train 96.865 0.012 96.166 0.018 \n",
121 | "\n",
122 | " train loss train loss std test loss test loss std \n",
123 | "w2v sg train 12.032 2.020 16.286 0.390 \n",
124 | "w2v cbow No train 15.751 0.084 19.071 0.190 \n",
125 | "fasttext sg No train 12.907 0.012 14.690 0.019 \n",
126 | "fasttext sg train 10.102 0.058 12.812 0.045 "
127 | ]
128 | },
129 | "execution_count": 3,
130 | "metadata": {},
131 | "output_type": "execute_result"
132 | }
133 | ],
134 | "source": [
135 | "lines.head()"
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {},
141 | "source": [
142 | "## Test accuracy"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 11,
148 | "metadata": {},
149 | "outputs": [
150 | {
151 | "data": {
152 | "image/png": "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\n",
153 | "text/plain": [
154 | ""
155 | ]
156 | },
157 | "metadata": {},
158 | "output_type": "display_data"
159 | }
160 | ],
161 | "source": [
162 | "x = list(lines.index)\n",
163 | "means = list(lines['test acc'])\n",
164 | "stds = list(lines['test acc std'])\n",
165 | "\n",
166 | "plt.figure(num=1, figsize=(16, 8))\n",
167 | "plt.rc('xtick', labelsize=16) \n",
168 | "plt.rc('ytick', labelsize=16) \n",
169 | "plt.errorbar(x, means, stds, fmt='o', color='white', ecolor='black', elinewidth=15, capsize=10);\n"
170 | ]
171 | },
172 | {
173 | "cell_type": "markdown",
174 | "metadata": {},
175 | "source": [
176 | "## Test loss"
177 | ]
178 | },
179 | {
180 | "cell_type": "code",
181 | "execution_count": 13,
182 | "metadata": {},
183 | "outputs": [
184 | {
185 | "data": {
186 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA74AAAHaCAYAAAAnhJVkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XuYZVddJ/zvL4kChuEewiUTGifAACMypFBwQAICchuBkTeQAIKSjsDIAOo7DlGwGCBeESEaIGE0KNIyGWVAbiLkQmCIvBUE5PJy7aLlmgbCrXMhpNf8sXclJ0VV96nuU13Vqz+f5znPqbP32nuvc+qcdfZ3r73XqdZaAAAAoFeHbXQFAAAAYD0JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4dsdEVmHSrW92qbdmyZaOrAQAAwDq45JJLvtZaO+pAb3dTBd8tW7ZkYWFho6sBAADAOqiqz2/Edp3qDAAAQNcEXwAAALom+AIAANA1wRcAAICuCb4AAAB0TfAFAACga4IvAAAAXRN8AQAA6JrgCwAAQNcEXwAAALom+AIAANA1wRcAAICuCb4AAAB0TfAFAACga4IvAAAAXRN8AQAA6JrgCwAAQNcEXwAAALom+ALso/n5+VTVzG7z8/Mb/ZQAALpUrbWNrsO15ubm2sLCwkZXA2DNqmqfl91M7TAAwHqqqktaa3MHert6fAEAAOia4AsAAEDXBF8AAAC6JvgCAADQNcEXAACArgm+AAAAdE3wBVgnJ510UrZv355rrrkm27dvz0knnbTRVQIAOCQdsdEVAOjRSSedlLPPPjtHHnlkkmTLli05++yzkyTbtm3byKoBABxypurxrapjquqMqnp/VV1eVa2qtqxQ7o5V9b+q6ptVtauqzq+qA/7jxAAb7fTTT7829C458sgjc/rpp29QjQAADl3Tnup8XJITk1yW5KKVClTVLZO8N8m/S/LLSZ4wzjq/qu66n/UEOKgce+yxa5oOAMD6mTb4vqe1dnRr7RFJzl2lzDOSHJ3kUa21N7TW/i7Jo5JcnuSF+19VgIPHjh071jQdAID1M1Xwba3tnqLYfZJ8urX2mYnldmXoIX5UVbmeGDhknHbaadm1a9f1pu3atSunnXbaBtUIAODQNctRna9J8r0Vpl+V5EZJ/s0MtwWwqW3bti1bt27N4uJidu/encXFxWzdutXAVgAAG2CWvbCfTPKQqrpla+3rSVJVhyX5iXH+LWa4LYBNb9u2bYIuAMAmMMse31eN6/uLqvo3VXXbJK9Icsdx/oqnS1fVqVW1UFULO3funGF1AAAAYIbBt7X2uSRPTHJ8ks8k+VKS+yZ52Vjky6ssd1Zrba61NnfUUUfNqjoAAACQZLY9vmmt/U2S2ye5W5LjWmvHJ7lxkn9prRnKFAAAgANu5iMtt9auSfKJJKmq2yV5fJI/mPV2AAAAYBpTB9+qetz45/Hj/cOrameSna21C6vqh5L8fpILk3w7yd2TPC/Jx5K8dHZVBgAAgOmtpcf33GWPzxzvL0xyQpKW5E5JTk5ysyRfSPJnSU5vra30M0cAAACw7qYOvq212sv87yd51H7XCAAAAGZopoNbARxK5ufnU1Wp2uNxwb1aWsf8/PxsKgYAwPVUa22j63Ctubm5trCwsNHVAAAAYB1U1SWttbkDvV09vgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAujZV8K2qY6rqjKp6f1VdXlWtqrasUO7YqnptVe0Yy32qql5cVUfOuuIAAAAwjSOmLHdckhOTXJLkoiQPXV5gDLfvSvJDSZ6fZEeSeyd5YZI7JXn8DOoLAAAAazJt8H1Pa+3oJKmqU7JC8E3yHzIE3J9trb1znHZ+Vd0iya9X1Y+01i7f7xoDAADAGkx1qnNrbfcUxX54vP/2sunfHLdTa6gXAAAAzMQsB7d6V5JPJ/m9qrpbVd24qh6U5NlJXtVa2zXDbQEAAMBUZhZ8W2tXJrnfuM6PJflOkncneUuSX1ltuao6taoWqmph586ds6oOAAAAJJlh8K2qGyZ5Q5JbJ3lykgck+X8zDGr1p6st11o7q7U211qbO+qoo2ZVHQAAAEgy/eBW03hakhOSHNda++w47T1V9a0kZ1XVq1prH57h9gAAAGCvZnmN748luWwi9C75wHh/1xluCwAAAKYyy+D7lSQ3r6rjlk3/yfH+izPcFgAAAExl6lOdq+px45/Hj/cPr6qdSXa21i5Mck6SX03ytqp6SZIdSeaSPD/JJUneN6tKAwAAwLTWco3vucsenzneX5jkhNbaYlXdJ8l8khcnuVWSf0lyVpKXTPlbwAAAADBTUwff1lpNUebjSU7crxoBAADADM3yGl8AAADYdARfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADomuALAABA1wRfAAAAuib4AgAA0DXBFwAAgK4JvgAAAHRN8AUAAKBrgi8AAABdE3wBAADo2lTBt6qOqaozqur9VXV5VbWq2rKszPw4faXbletReQAAANibI6Ysd1ySE5NckuSiJA9docxrkrxj2bQjx2lv3tcKAgAAwP6YNvi+p7V2dJJU1SlZIfi21r6Q5AuT06rqyeM2Xruf9QQAAIB9MtWpzq213fu4/qck+WqSv9/H5QEAAGC/rNvgVlV1TJIHJvmr1tr312s7AAAAsCfrOarzk8f17/E056o6taoWqmph586d61gdAAAADkXrGXx/Ick/tdY+sqdCrbWzWmtzrbW5o446ah2rAwAAwKFoXYJvVf1Ekn8bg1oBAACwwdarx/cpSb6f5PXrtH4AAACYysyDb1X9cJInJHlba81FuwAAAGyoaX/HN1X1uPHP48f7h1fVziQ7W2sXThR9VJJbxGnOAAAAbAJTB98k5y57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\n",
187 | "text/plain": [
188 | ""
189 | ]
190 | },
191 | "metadata": {},
192 | "output_type": "display_data"
193 | }
194 | ],
195 | "source": [
196 | "x = list(lines.index)\n",
197 | "means = list(lines['test loss'])\n",
198 | "stds = list(lines['test loss std'])\n",
199 | "\n",
200 | "plt.figure(num=1, figsize=(16, 8))\n",
201 | "plt.rc('xtick', labelsize=16) \n",
202 | "plt.rc('ytick', labelsize=16) \n",
203 | "plt.errorbar(x, means, stds, fmt='o', color='white', ecolor='black', elinewidth=15, capsize=10);\n"
204 | ]
205 | },
206 | {
207 | "cell_type": "markdown",
208 | "metadata": {},
209 | "source": [
210 | "## Train-Test accuracy difference"
211 | ]
212 | },
213 | {
214 | "cell_type": "code",
215 | "execution_count": 16,
216 | "metadata": {},
217 | "outputs": [
218 | {
219 | "data": {
220 | "image/png": "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\n",
221 | "text/plain": [
222 | ""
223 | ]
224 | },
225 | "metadata": {},
226 | "output_type": "display_data"
227 | }
228 | ],
229 | "source": [
230 | "x = list(lines.index)\n",
231 | "means = list(lines['train acc'] - lines['test acc'])\n",
232 | "stds = [0]*4\n",
233 | "\n",
234 | "plt.figure(num=1, figsize=(16, 8))\n",
235 | "plt.rc('xtick', labelsize=16) \n",
236 | "plt.rc('ytick', labelsize=16) \n",
237 | "plt.errorbar(x, means, stds, fmt='o', color='red', ecolor='black', elinewidth=15, capsize=10);\n"
238 | ]
239 | },
240 | {
241 | "cell_type": "markdown",
242 | "metadata": {},
243 | "source": [
244 | "## Train-Test loss difference"
245 | ]
246 | },
247 | {
248 | "cell_type": "code",
249 | "execution_count": 18,
250 | "metadata": {},
251 | "outputs": [
252 | {
253 | "data": {
254 | "image/png": "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\n",
255 | "text/plain": [
256 | ""
257 | ]
258 | },
259 | "metadata": {},
260 | "output_type": "display_data"
261 | }
262 | ],
263 | "source": [
264 | "x = list(lines.index)\n",
265 | "means = list(lines['test loss'] - lines['train loss'])\n",
266 | "stds = [0]*4\n",
267 | "\n",
268 | "plt.figure(num=1, figsize=(16, 8))\n",
269 | "plt.rc('xtick', labelsize=16) \n",
270 | "plt.rc('ytick', labelsize=16) \n",
271 | "plt.errorbar(x, means, stds, fmt='o', color='red', ecolor='black', elinewidth=15, capsize=10);\n"
272 | ]
273 | },
274 | {
275 | "cell_type": "code",
276 | "execution_count": null,
277 | "metadata": {},
278 | "outputs": [],
279 | "source": []
280 | }
281 | ],
282 | "metadata": {
283 | "kernelspec": {
284 | "display_name": "Python 3",
285 | "language": "python",
286 | "name": "python3"
287 | },
288 | "language_info": {
289 | "codemirror_mode": {
290 | "name": "ipython",
291 | "version": 3
292 | },
293 | "file_extension": ".py",
294 | "mimetype": "text/x-python",
295 | "name": "python",
296 | "nbconvert_exporter": "python",
297 | "pygments_lexer": "ipython3",
298 | "version": "3.6.5"
299 | }
300 | },
301 | "nbformat": 4,
302 | "nbformat_minor": 2
303 | }
304 |
--------------------------------------------------------------------------------
/WorkOnVersion.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## WorkOnVersion"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [
15 | {
16 | "name": "stderr",
17 | "output_type": "stream",
18 | "text": [
19 | "Using TensorFlow backend.\n"
20 | ]
21 | }
22 | ],
23 | "source": [
24 | "from keras.layers import Embedding, Dense, Dropout, Input#, LSTM, Bidirectional\n",
25 | "from keras.layers import MaxPooling1D, Conv1D, Flatten\n",
26 | "from keras.preprocessing import sequence#, text\n",
27 | "from keras.models import Model\n",
28 | "from keras.utils import np_utils\n",
29 | "from keras.callbacks import Callback\n",
30 | "\n",
31 | "from gensim.models.keyedvectors import KeyedVectors\n",
32 | "\n",
33 | "from time import time\n",
34 | "import pandas as pd\n",
35 | "import numpy as np\n",
36 | "import matplotlib.pyplot as plt\n",
37 | "\n",
38 | "from sklearn import preprocessing\n",
39 | "from sklearn.model_selection import train_test_split\n",
40 | "from sklearn.metrics import (\n",
41 | " confusion_matrix as confmat,\n",
42 | " classification_report as creport\n",
43 | ")\n",
44 | "\n",
45 | "from utils import *\n",
46 | "\n",
47 | "np.random.seed(42)"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "## Language Model and Data"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 2,
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "algo = 'cbow' # or 'cbow'"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": 3,
69 | "metadata": {
70 | "scrolled": true
71 | },
72 | "outputs": [
73 | {
74 | "name": "stdout",
75 | "output_type": "stream",
76 | "text": [
77 | "Dataset splited.\n",
78 | "Label categories: ['0' '1' '2' '3' '4']\n",
79 | "Converting data to trainable form...\n",
80 | "Number of training examples: 89382\n",
81 | "Number of testing examples: 22346\n"
82 | ]
83 | }
84 | ],
85 | "source": [
86 | "# language model\n",
87 | "WORD_MODEL, _, MAX_FEATURES, EMBED_SIZE = get_init_parameters('./arabic_bins/web_{}_300'.format(algo))\n",
88 | "\n",
89 | "# load data\n",
90 | "data_paths = ['arabic_dataset_classifiction.csv']\n",
91 | "x_train, x_test, y_train, y_test, MAX_TEXT_LENGTH = split_datasets(data_paths, test_size=0.2, seed=42)\n",
92 | "CLASSES_LIST = np.unique(y_train)\n",
93 | "print('Label categories: ' + str(CLASSES_LIST))\n",
94 | "\n",
95 | "# \n",
96 | "x_train, x_test, y_train, y_test, train_y_cat, word_index = class_str_2_ind(x_train, x_test, \n",
97 | " y_train, y_test,\n",
98 | " CLASSES_LIST, MAX_FEATURES,\n",
99 | " MAX_TEXT_LENGTH)\n",
100 | "test_cat_y = np_utils.to_categorical(y_test, len(CLASSES_LIST))"
101 | ]
102 | },
103 | {
104 | "cell_type": "code",
105 | "execution_count": 4,
106 | "metadata": {},
107 | "outputs": [
108 | {
109 | "data": {
110 | "image/png": "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\n",
111 | "text/plain": [
112 | ""
113 | ]
114 | },
115 | "metadata": {},
116 | "output_type": "display_data"
117 | }
118 | ],
119 | "source": [
120 | "LABELS = (\n",
121 | " 'Culture', 'Events', 'Business', 'Politics', 'Sports'\n",
122 | ")\n",
123 | "\n",
124 | "tmp = np.concatenate((y_train, y_test))\n",
125 | "unique, counts = np.unique(tmp, return_counts=True)\n",
126 | "del tmp\n",
127 | "plt.figure(\"Target Pie\", figsize=(10, 10))\n",
128 | "plt.title(\"Pie plot of the class frequencies\")\n",
129 | "plt.pie(counts, labels=LABELS)\n",
130 | "plt.legend(unique)\n",
131 | "plt.savefig(\"./img/stats_classes.png\")\n",
132 | "plt.show();"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "**Try less timesteps**"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 5,
145 | "metadata": {},
146 | "outputs": [
147 | {
148 | "name": "stdout",
149 | "output_type": "stream",
150 | "text": [
151 | "Original sequence length : 5049\n"
152 | ]
153 | }
154 | ],
155 | "source": [
156 | "# Sequence length\n",
157 | "print(\"Original sequence length : \"+str(MAX_TEXT_LENGTH))\n",
158 | "\n",
159 | "# CHANGE MAX LENGTH (timesteps)\n",
160 | "MAX_TEXT_LENGTH = 2000"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 6,
166 | "metadata": {},
167 | "outputs": [],
168 | "source": [
169 | "def get_model(embedding_weights, word_index, vocab_dim, max_length, print_summary=True):\n",
170 | " inp = Input(shape=(max_length,))\n",
171 | " model = Embedding(input_dim=len(word_index)+1,\n",
172 | " output_dim=vocab_dim,\n",
173 | " trainable=False,\n",
174 | " weights=[embedding_weights])(inp)\n",
175 | "\n",
176 | " model = Conv1D(filters=32, kernel_size=5, padding='same', activation='relu')(model)\n",
177 | " model = MaxPooling1D(pool_size=2)(model)\n",
178 | " model = Flatten()(model)\n",
179 | " model = Dropout(0.1)(model)\n",
180 | " model = Dense(200, activation='relu')(model)\n",
181 | " model = Dropout(0.1)(model)\n",
182 | " model = Dense(5, activation='softmax')(model)\n",
183 | " model = Model(inputs=inp, outputs=model)\n",
184 | " \n",
185 | " model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])\n",
186 | " if print_summary:\n",
187 | " model.summary()\n",
188 | " return model\n",
189 | "\n",
190 | "\n",
191 | "def get_main_model(word_index, WORD_MODEL, EMBED_SIZE, MAX_TEXT_LENGTH):\n",
192 | " tmp = get_embedding_matrix(word_index, WORD_MODEL, EMBED_SIZE)\n",
193 | " model = get_model(tmp, word_index, EMBED_SIZE, MAX_TEXT_LENGTH, print_summary=True)\n",
194 | " return model\n",
195 | "\n",
196 | "\n",
197 | "class TestCallback(Callback):\n",
198 | " def __init__(self, test_data):\n",
199 | " self.test_data = test_data\n",
200 | "\n",
201 | " def on_epoch_end(self, epoch, logs={}):\n",
202 | " x, y = self.test_data\n",
203 | " loss, acc = self.model.evaluate(x, y, verbose=0)\n",
204 | " print('\\nTesting loss: {}, acc: {}\\n'.format(loss, acc))\n",
205 | "\n",
206 | "def train_fit_predict(model, x_train, x_test, y_train, y_test, batch_size, epochs, TestCallback=TestCallback):\n",
207 | " history = model.fit(x_train, y_train,\n",
208 | " batch_size=batch_size,\n",
209 | " epochs=epochs, verbose=1,\n",
210 | " validation_data=(x_test, y_test))\n",
211 | " #callbacks=[TestCallback((x_test, y_test))])\n",
212 | " return history, model"
213 | ]
214 | },
215 | {
216 | "cell_type": "code",
217 | "execution_count": 7,
218 | "metadata": {},
219 | "outputs": [
220 | {
221 | "name": "stdout",
222 | "output_type": "stream",
223 | "text": [
224 | "Building embedding matrix...\n",
225 | "Embedding matrix built.\n",
226 | "_________________________________________________________________\n",
227 | "Layer (type) Output Shape Param # \n",
228 | "=================================================================\n",
229 | "input_1 (InputLayer) (None, 2000) 0 \n",
230 | "_________________________________________________________________\n",
231 | "embedding_1 (Embedding) (None, 2000, 300) 115239600 \n",
232 | "_________________________________________________________________\n",
233 | "conv1d_1 (Conv1D) (None, 2000, 32) 48032 \n",
234 | "_________________________________________________________________\n",
235 | "max_pooling1d_1 (MaxPooling1 (None, 1000, 32) 0 \n",
236 | "_________________________________________________________________\n",
237 | "flatten_1 (Flatten) (None, 32000) 0 \n",
238 | "_________________________________________________________________\n",
239 | "dropout_1 (Dropout) (None, 32000) 0 \n",
240 | "_________________________________________________________________\n",
241 | "dense_1 (Dense) (None, 200) 6400200 \n",
242 | "_________________________________________________________________\n",
243 | "dropout_2 (Dropout) (None, 200) 0 \n",
244 | "_________________________________________________________________\n",
245 | "dense_2 (Dense) (None, 5) 1005 \n",
246 | "=================================================================\n",
247 | "Total params: 121,688,837\n",
248 | "Trainable params: 6,449,237\n",
249 | "Non-trainable params: 115,239,600\n",
250 | "_________________________________________________________________\n"
251 | ]
252 | }
253 | ],
254 | "source": [
255 | "model = get_main_model(word_index, WORD_MODEL, EMBED_SIZE, MAX_TEXT_LENGTH)"
256 | ]
257 | },
258 | {
259 | "cell_type": "code",
260 | "execution_count": 8,
261 | "metadata": {},
262 | "outputs": [],
263 | "source": [
264 | "del WORD_MODEL\n",
265 | "del word_index"
266 | ]
267 | },
268 | {
269 | "cell_type": "markdown",
270 | "metadata": {},
271 | "source": [
272 | "## Start Learning"
273 | ]
274 | },
275 | {
276 | "cell_type": "code",
277 | "execution_count": null,
278 | "metadata": {
279 | "scrolled": true
280 | },
281 | "outputs": [],
282 | "source": [
283 | "time_start = time()\n",
284 | "history, model = train_fit_predict(model,\n",
285 | " x_train[:, :MAX_TEXT_LENGTH],\n",
286 | " x_test[:, :MAX_TEXT_LENGTH],\n",
287 | " train_y_cat, test_cat_y,\n",
288 | " batch_size=10, epochs=20)\n",
289 | "time_start = time() - time_start\n",
290 | "\n",
291 | "print(\"Took : \"+str(np.round(time_start, 2))+\" (s)\") "
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": 10,
297 | "metadata": {
298 | "scrolled": true
299 | },
300 | "outputs": [
301 | {
302 | "data": {
303 | "text/plain": [
304 | "dict_keys(['acc', 'val_loss', 'val_acc', 'loss'])"
305 | ]
306 | },
307 | "execution_count": 10,
308 | "metadata": {},
309 | "output_type": "execute_result"
310 | }
311 | ],
312 | "source": [
313 | "history.history.keys()"
314 | ]
315 | },
316 | {
317 | "cell_type": "code",
318 | "execution_count": 11,
319 | "metadata": {},
320 | "outputs": [
321 | {
322 | "name": "stdout",
323 | "output_type": "stream",
324 | "text": [
325 | "22346/22346 [==============================] - 3s 121us/step\n"
326 | ]
327 | },
328 | {
329 | "data": {
330 | "text/plain": [
331 | "[0.42280422965826653, 0.9407947731137564]"
332 | ]
333 | },
334 | "execution_count": 11,
335 | "metadata": {},
336 | "output_type": "execute_result"
337 | }
338 | ],
339 | "source": [
340 | "model.evaluate(x_test[:, :MAX_TEXT_LENGTH], test_cat_y)"
341 | ]
342 | },
343 | {
344 | "cell_type": "code",
345 | "execution_count": 12,
346 | "metadata": {},
347 | "outputs": [
348 | {
349 | "name": "stdout",
350 | "output_type": "stream",
351 | "text": [
352 | "Confusion Matrix :\n",
353 | "\n",
354 | " [[2631 21 25 61 31]\n",
355 | " [ 36 3181 22 76 26]\n",
356 | " [ 66 30 2564 182 47]\n",
357 | " [ 154 121 272 3570 52]\n",
358 | " [ 45 23 12 21 9077]]\n",
359 | "\n",
360 | " precision recall f1-score support\n",
361 | "\n",
362 | " 0 0.90 0.95 0.92 2769\n",
363 | " 1 0.94 0.95 0.95 3341\n",
364 | " 2 0.89 0.89 0.89 2889\n",
365 | " 3 0.91 0.86 0.88 4169\n",
366 | " 4 0.98 0.99 0.99 9178\n",
367 | "\n",
368 | " micro avg 0.94 0.94 0.94 22346\n",
369 | " macro avg 0.92 0.93 0.93 22346\n",
370 | "weighted avg 0.94 0.94 0.94 22346\n",
371 | "\n"
372 | ]
373 | }
374 | ],
375 | "source": [
376 | "y_pred = np.argmax(model.predict(x_test[:, :MAX_TEXT_LENGTH]), axis=1)\n",
377 | "# y_pred = np_utils.to_categorical(np.argmax(y_pred, axis=1), len(CLASSES_LIST))\n",
378 | "\n",
379 | "cm = confmat(np.argmax(test_cat_y, axis=1), y_pred)\n",
380 | "# tn, fp, fn, tp = confmat().ravel()\n",
381 | "print(\"Confusion Matrix :\\n\\n {}\\n\".format(cm))\n",
382 | "print(creport(np.argmax(test_cat_y, axis=1), y_pred))"
383 | ]
384 | },
385 | {
386 | "cell_type": "markdown",
387 | "metadata": {},
388 | "source": [
389 | "**Early Stopping**"
390 | ]
391 | },
392 | {
393 | "cell_type": "code",
394 | "execution_count": 13,
395 | "metadata": {
396 | "scrolled": false
397 | },
398 | "outputs": [
399 | {
400 | "name": "stdout",
401 | "output_type": "stream",
402 | "text": [
403 | "Accuracy on train : 95.06 %\n",
404 | "Accuracy on test : 94.55 %\n",
405 | "Loss on train : 15.79 %\n",
406 | "Loss on test : 18.8 %\n"
407 | ]
408 | }
409 | ],
410 | "source": [
411 | "n = np.argmin(history.history['val_loss'])\n",
412 | "\n",
413 | "print(\"Accuracy on train : {} %\".format(np.round(history.history['acc'][n]*100, 2)))\n",
414 | "print(\"Accuracy on test : {} %\".format(np.round(history.history['val_acc'][n]*100, 2)))\n",
415 | "print(\"Loss on train : {} %\".format(np.round(history.history['loss'][n]*100, 2)))\n",
416 | "print(\"Loss on test : {} %\".format(np.round(history.history['val_loss'][n]*100, 2)))"
417 | ]
418 | },
419 | {
420 | "cell_type": "code",
421 | "execution_count": 16,
422 | "metadata": {},
423 | "outputs": [
424 | {
425 | "data": {
426 | "image/png": "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L709dHcxoguu05UkqV6tWAHnnw9TpmSvp0yBCy6AF16o+q0eeOABzj//fADe9773cf/99wNw/PHHs3TpUpYuXcrHPvYx7r//fh5++GGOOuooAO666y6uvvpqFi5cyEknncTWrVvp6Ojg2GOP5W/+5m/4/Oc/T3t7O5MnT664lvvvv5/zzjuPcePGsc8++3DiiSf23vOmm27iqquu4vHHH2fatGkcdNBBrFixgg9/+MP86Ec/Yvr06VX9Xgy6kpSXznZomgDT9n3j8d4WQytHuiJJkjQS9tsPpk/PRnWbm7Pn6dNh330HvrZKTjjhBO677z4eeughzjjjDIrFIvfeey/HH388kE0zvu2221i+fDnLly+no6ODQw89lPPPP58f/OAHTJ48mTPOOIP//u//rkotS5cu5YADDuDiiy/m61//OoVCgccee4yTTjqJG264gfe///3Dvk9fBl1JykuxA2bMhqZxbzw+Yw4Q9tKVJKme/epX8MEPwoMPZs85bUj1zne+k29/+9sAfPOb3+wNsosXL+anP/0pTU1NNDc3s3DhQv7xH/+RE044AYBTTz2V6667jpQSAD//+c8BWLFiBQcddBCXXXYZZ599Nr/4xS+YNm0aGzZsGLCW448/nltvvZXu7m7Wrl3L0qVLWbx4Me3t7eyzzz584AMf4P3vfz+PPvoo69ato6enh3POOYfPfOYzPProo1X9XlyjK0l5Kba/dSMqgPETYfoBjuhKklTPvvvdnT9/+ctV+cjNmzcze/bs3tcf/ehHue6667jkkku45pprmDVrFjfddBMAkyZNYs6cORxzzDFAFkJvueUW5s+fD8AnPvEJ/vzP/5wFCxbQ09PD3Llz+Y//+A++853v8I1vfIMJEyaw77778vGPf5w999yT4447jnnz5nH66adzzTXX7LK+9773vTzwwAMcccQRRAR/+7d/y7777svXvvY1rrnmGiZMmMDUqVP5+te/zpo1a7jkkkvoKW3O+bnPfa4q31FZlBN8PVi0aFFatmxZrcuQpMw1vw6HnA5nXffWczedCakb/uhHI1+XJEkatKeffppDDz201mU0lF195xHxSEpp0UDXOnVZkvKwbRNsWvvWjajK7KUrSZKUG4OuJOWhWOqhu7ug29KatRfavnXX5yVJkjRkBl1JykO5tdCu1ujCzp2Xu1aNSDmSJEmNxKAr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\n",
427 | "text/plain": [
428 | ""
429 | ]
430 | },
431 | "metadata": {
432 | "needs_background": "light"
433 | },
434 | "output_type": "display_data"
435 | }
436 | ],
437 | "source": [
438 | "plt.figure(\"Loss Plot\", figsize=(16, 8))\n",
439 | "plt.plot(range(1, len(history.history['loss'])+1), history.history['loss'], label=\"train loss\")\n",
440 | "plt.plot(range(1, len(history.history['val_loss'])+1), history.history['val_loss'], label=\"test loss\")\n",
441 | "plt.plot(n+1,history.history[\"val_loss\"][n],\"r*\", label=\"Lowest loss\")\n",
442 | "plt.legend()\n",
443 | "plt.title(\"Learning Curve\")\n",
444 | "plt.ylabel(\"loss (cross_entropy)\")\n",
445 | "plt.xlabel(\"epochs\")\n",
446 | "#plt.savefig(\"./img/loss_500_2000_sg_true_40.png\")\n",
447 | "plt.show();"
448 | ]
449 | },
450 | {
451 | "cell_type": "code",
452 | "execution_count": 17,
453 | "metadata": {},
454 | "outputs": [
455 | {
456 | "data": {
457 | "image/png": "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\n",
458 | "text/plain": [
459 | ""
460 | ]
461 | },
462 | "metadata": {
463 | "needs_background": "light"
464 | },
465 | "output_type": "display_data"
466 | }
467 | ],
468 | "source": [
469 | "plt.figure(\"Accuracy Plot\", figsize=(16, 8))\n",
470 | "plt.plot(range(1, len(history.history['acc'])+1), history.history['acc'], label=\"train accuracy\")\n",
471 | "plt.plot(range(1, len(history.history['val_acc'])+1), history.history['val_acc'], label=\"test accuracy\")\n",
472 | "plt.plot(n+1,history.history[\"val_acc\"][n],\"r*\", label=\"Opt. Acc. (csp. Lowest loss)\")\n",
473 | "plt.legend()\n",
474 | "plt.title(\"Accuracy Curve\")\n",
475 | "plt.ylabel(\"accuracy\")\n",
476 | "plt.xlabel(\"epochs\")\n",
477 | "#plt.savefig(\"./img/acc_500_2000_sg_true_40.png\")\n",
478 | "plt.show()"
479 | ]
480 | }
481 | ],
482 | "metadata": {
483 | "kernelspec": {
484 | "display_name": "Python 3",
485 | "language": "python",
486 | "name": "python3"
487 | },
488 | "language_info": {
489 | "codemirror_mode": {
490 | "name": "ipython",
491 | "version": 3
492 | },
493 | "file_extension": ".py",
494 | "mimetype": "text/x-python",
495 | "name": "python",
496 | "nbconvert_exporter": "python",
497 | "pygments_lexer": "ipython3",
498 | "version": "3.5.3"
499 | }
500 | },
501 | "nbformat": 4,
502 | "nbformat_minor": 2
503 | }
504 |
--------------------------------------------------------------------------------
/history/fasttext-true.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ismailhachimi/Text-Classification/dabc42fe970ce28c9b85edc889cadfaad56dc998/history/fasttext-true.db
--------------------------------------------------------------------------------
/history/fasttext.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ismailhachimi/Text-Classification/dabc42fe970ce28c9b85edc889cadfaad56dc998/history/fasttext.db
--------------------------------------------------------------------------------
/history/hist_sg_true_10.json:
--------------------------------------------------------------------------------
1 | {"histories": [{"val_acc": [0.9367671994783987, 0.9432113057954836, 0.9165846162203826, 0.9159133550058726, 0.9499686679481169, 0.9488946495653212, 0.9484023919445244, 0.9447328309966726, 0.9499686675480141, 0.9483576411421207], "acc": [0.910518889413808, 0.9465664159051016, 0.9546888571237809, 0.9621735860500612, 0.9693003014106487, 0.9760018752385247, 0.9810252587333955, 0.9865073477658269, 0.9898413529607529, 0.9926830889573658], "val_loss": [0.19893465467018095, 0.18101920540518676, 0.24057828282207552, 0.2646416127645017, 0.1646435671975449, 0.18138429793427174, 0.18727710825099395, 0.20537735617229325, 0.20423660150087222, 0.20904433203058764], "loss": [0.27414566198557483, 0.17081394367577207, 0.14223958309651527, 0.11899526745341552, 0.09691917481857915, 0.07759046197950178, 0.060777262810199045, 0.04593987015431495, 0.03527709956128818, 0.027566617913299563]}, {"val_acc": [0.934798167053379, 0.9461201041374063, 0.9453145908144288, 0.9495211604255428, 0.9495211603188487, 0.9489841519756688, 0.9501029198218575, 0.9477311310020842, 0.9487156474013086, 0.9490289023512961], "acc": [0.9088630751460528, 0.946599979671217, 0.9552146898281368, 0.9624085329103416, 0.9685395217339812, 0.9754648542538079, 0.9813832727365438, 0.9861940855637531, 0.989886104617787, 0.9923138870299563], "val_loss": [0.21034979094379064, 0.16769331665991927, 0.1705687659888736, 0.15609147102216162, 0.16108275763479318, 0.16875199289308485, 0.174681825734911, 0.18506558913010457, 0.19078036113703456, 0.20959828927517998], "loss": [0.2785527036560972, 0.1712198272376549, 0.14186773919252704, 0.11916453988589172, 0.098177855091003, 0.07812796809028388, 0.06121879085688519, 0.04665120442804122, 0.03537503705908532, 0.027780377439364092]}, {"val_acc": [0.9360064367977836, 0.939675997446892, 0.9473283739618314, 0.9473283743405955, 0.9475968786482204, 0.9437483148428445, 0.9496106620890318, 0.9422715403373652, 0.9473283737537781, 0.948312890179676], "acc": [0.9055178829452887, 0.9459622672747889, 0.9549126159531035, 0.9623078413185799, 0.9694681205012986, 0.9757781164998941, 0.9815287159319913, 0.9861493337533428, 0.9890805732507427, 0.9914300400130324], "val_loss": [0.20531874990100438, 0.19220247038972801, 0.16304211552942177, 0.1645599808087397, 0.1654309294998345, 0.19074049428895298, 0.187963104372525, 0.21775771949886533, 0.20203972681571786, 0.21165696710526635], "loss": [0.285667455385242, 0.17124268602094297, 0.14260289921352617, 0.11918736431204081, 0.09737023335265163, 0.07739137735897424, 0.060746379107189774, 0.04680705731217625, 0.03709099437761636, 0.03063528629821756]}, {"val_acc": [0.9411527718990244, 0.941466027169094, 0.9496554126513738, 0.9494764096018004, 0.9499686679214434, 0.9494764098685355, 0.9484918934426375, 0.9485366443250617, 0.9506846799330223, 0.9504609260810454], "acc": [0.9096797946207431, 0.9463762209192493, 0.9547447968624536, 0.9626994190611695, 0.9697366309236374, 0.9763598892083302, 0.9817412865596417, 0.9859143871037879, 0.9895169027637314, 0.9917768660452395], "val_loss": [0.19676309556084068, 0.1886305352102378, 0.1624925240959776, 0.16485557859602978, 0.16408765362897673, 0.172538202239932, 0.1911536731829714, 0.18826788601572564, 0.19869800438589064, 0.20909186407930852], "loss": [0.27950917622885624, 0.17291577551998558, 0.14372235047811688, 0.11901762566447298, 0.0963168946510863, 0.07688624654451189, 0.059588463489451855, 0.04668067241640392, 0.03612873973065506, 0.02834626403102065]}, {"val_acc": [0.9390047360510021, 0.9442405730237853, 0.9321131222166776, 0.9347086653418777, 0.9497449140908052, 0.9492526555844475, 0.9510426851466084, 0.9490289019725321, 0.9515349434395779, 0.9497001628082782], "acc": [0.9084379337457115, 0.9462195897228525, 0.9541518360096947, 0.9618491360797695, 0.9688415961424969, 0.9759794993166482, 0.9814727762106568, 0.9860374543706905, 0.9892595802256426, 0.9922691352928998], "val_loss": [0.20577427319250877, 0.17671398141888092, 0.21065657086855072, 0.2050068801912736, 0.1681154088287906, 0.16931459838592916, 0.1764996162501668, 0.18438988332639236, 0.1882768616327003, 0.20438481822349935], "loss": [0.2816499243872643, 0.1725734329471178, 0.14408687920883959, 0.12051941940290962, 0.0991861337199054, 0.07911792923607175, 0.059949337735451365, 0.04624032346338096, 0.03607873275707087, 0.02818731296541775]}]}
--------------------------------------------------------------------------------
/history/lstm_results.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ismailhachimi/Text-Classification/dabc42fe970ce28c9b85edc889cadfaad56dc998/history/lstm_results.db
--------------------------------------------------------------------------------
/history/results.csv:
--------------------------------------------------------------------------------
1 | ,train acc,train acc std,test acc,test acc std,train loss,train loss std,test loss,test loss std
2 | w2v sg train,96.202,0.64,94.924,0.1,12.032,2.02,16.286,0.39
3 | w2v cbow No train,95.083,0.04,94.514,0.07,15.751,0.084,19.071,0.19
4 | fasttext sg No train,95.916,0.009,95.382,0.017,12.907,0.012,14.690,0.019
5 | fasttext sg train,96.865,0.012,96.166,0.018,10.102,0.058,12.812,0.045
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 |
2 | # Comparative Study of CNN and RNN for Arabic TextClassification
3 |
4 | **Under supervision of Mr. [Stéphane Canu](https://scholar.google.fr/citations?user=PpibCZUAAAAJ&hl=fr&oi=ao)**
5 |
6 | This project is a step towards understanding the state of the art of text classification in deep learning. As a result, we compare CNN and RNN to understand the pros and cons of each architecture.
7 |
8 | ## Project Plan
9 | 1. [Introduction](#1-introduction)
10 | 2. [State of the art](#2-state-of-the-art)
11 | 1. [Word representation](#i-word-representation)
12 | 2. [Text classification](#ii-text-classification)
13 | 3. [Data for Arabic text classification](#3-data-for-arabic-text-classification)
14 | 4. [Implementation and results](#4-implementation-and-results)
15 | 5. [Perspectives](#5-perspectives)
16 | 6. [Conclusion](#6-conclusion)
17 | 7. [Bibliography](#7-bibliography)
18 |
19 | ## 1. Introduction
20 |
21 | This project is an assembly of research and learning processes which aims to understand the state-of-the-art of text classification in deep learning as it requires us to look for a relevant data source, go through word representation models and compare them as a first step. In the second phase, we compare text classification based technologies and we try to understand how they work. Finally, we explain in detail text classification in deep learning and propose an attention-based architecture as a result of this project.
22 |
23 | ## 2. State of the art
24 |
25 | ### i. Word representation
26 |
27 | Word representation is a major change in NLP research due to its great help in late advances in different problems related to text analysis for specific topic : Text classification, Topic modeling, intention recognition etc.
28 |
29 | In this project, we try to elaborate the state of the art of text classification in Arabic using language models and deep learning. The use of language models is due to simplicity of intergration in a neural network and its intuition of representiong words in a vectorial space which helps calculating dependencies between words.
30 |
31 | The main state of the art Word Representation models are :
32 |
33 | > - [Word2Vec](https://arxiv.org/pdf/1310.4546) (2013)
34 | > - [GloVe](https://nlp.stanford.edu/pubs/glove.pdf) (2015)
35 | > - [FastText](https://arxiv.org/pdf/1607.04606) (2017)
36 | > - [ELMo](https://arxiv.org/pdf/1802.05365) (2018)
37 |
38 | For the first part, we use a pretrained language model Word2Vec taken from this [Github Repository](https://github.com/bakrianoo/aravec) as a result of research paper mentioned in [Citation](#Citation). Thanks [bakrianoo - Abu Bakr Soliman](https://github.com/bakrianoo).
39 |
40 | #### Citation
41 |
42 | > Abu Bakr Soliman, Kareem Eisa, and Samhaa R. El-Beltagy, “AraVec: A set of Arabic Word Embedding Models for use in Arabic NLP”, in proceedings of the 3rd International Conference on Arabic Computational Linguistics (ACLing 2017), Dubai, UAE, 2017.
43 |
44 | ### ii. Text classification
45 |
46 | In this part, we explain the state-of-the-art of text classification in deep learning by going through the relevant research result of previous years.
47 |
48 | ## 3. Data for Arabic text classification
49 |
50 | In this part, we cite text data that we choosed to train our text classification model using Word2Vec word embedding model as marked in this [Section](#i-word-representation).
51 |
52 | The dataset is a collection of Arabic texts, which covers modern Arabic language used in newspapers articles. For this, we thank Mohamed BINIZ for making it available.
53 |
54 | #### Citation
55 |
56 | > Mohamed, BINIZ (2018), “DataSet for Arabic Classification”, Mendeley Data, v2
57 | > [DOI](http://dx.doi.org/10.17632/v524p5dhpj.2)
58 | > Dataset: DataSet for Arabic Classification
59 |
60 | ## 4. Implementation and results
61 |
62 | ## 5. Perspectives
63 |
64 | As future work, we plan to focus on Attention Models using CNN.
65 |
66 | ## 6. Conclusion
67 |
68 | A brief resume on the work during the project period, the achieved results and the future advances that might be applied to improve our solution.
69 |
70 | ## 7. Bibliography
71 |
72 | > [1] Piotr Bojanowski, Edouard Grave, Armand Joulin, and Tomas Mikolov. Enriching word vectors with subword information. arXiv preprint arXiv:1607.04606, 2016.
73 | >
74 | > [2] Junyoung Chung, Caglar Gulcehre, KyungHyun Cho, and Yoshua Bengio. Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555, 2014.
75 | >
76 | > [3] Jeffrey L Elman. Finding structure in time. Cognitive science, 14(2):179–211, 1990.
77 | >
78 | > [4] Sepp Hochreiter and Jürgen Schmidhuber. Long short-term memory. Neural computation, 9(8):1735–1780, 1997.
79 | >
80 | > [5] Yann LeCun, Léon Bottou, Yoshua Bengio, and Patrick Haffner. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11):2278–2324, 1998.
81 | >
82 | > [6] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg S Corrado, and Jeff Dean. Distributed representations of words and phrases and their compositionality. In Advances in neural information processing systems, pages 3111–3119, 2013.
83 | >
84 | > [7] Jeffrey Pennington, Richard Socher, and Christopher Manning. Glove: Global vectors for word representation. In Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP), pages 1532–1543, 2014.
85 |
--------------------------------------------------------------------------------
/utils.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import io
3 |
4 | from keras.layers import Embedding, Dense, LSTM, Dropout, Input
5 | #from keras.layers import GRU, MaxPooling1D, Conv1D, Flatten
6 | from keras.preprocessing import text, sequence
7 | from keras.models import Model
8 | from keras.utils import np_utils
9 |
10 | from gensim.models.keyedvectors import KeyedVectors
11 |
12 | import pandas as pd
13 | import numpy as np
14 |
15 | from sklearn import preprocessing
16 | from sklearn.model_selection import train_test_split
17 |
18 | def get_embedding_matrix(word_index, embedding_index, vocab_dim):
19 | print('Building embedding matrix...')
20 | embedding_matrix = np.zeros((len(word_index) + 1, vocab_dim))
21 | for word, i in word_index.items():
22 | try:
23 | embedding_matrix[i] = embedding_index.get_vector(word)
24 | except:
25 | pass
26 | print('Embedding matrix built.')
27 | return embedding_matrix
28 |
29 |
30 | def get_model_first(embedding_weights, word_index, vocab_dim, max_length, print_summary=True):
31 | inp = Input(shape=(max_length,))
32 | model = Embedding(input_dim=len(word_index)+1,
33 | output_dim=vocab_dim,
34 | trainable=False,
35 | weights=[embedding_weights])(inp)
36 |
37 | model = LSTM(vocab_dim, return_sequences=True)(model)
38 | model = Dropout(0.2)(model)
39 | model = LSTM(vocab_dim, return_sequences=False)(model)
40 | model = Dropout(0.1)(model)
41 | model = Dense(int(vocab_dim/10), activation='relu')(model)
42 | model = Dropout(0.1)(model)
43 | model = Dense(5, activation='softmax')(model)
44 | model = Model(inputs=inp, outputs=model)
45 | model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
46 | if print_summary:
47 | model.summary()
48 | return model
49 |
50 | def train_fit_predict(model, x_train, x_test, y_train, batch_size, epochs):
51 | history = model.fit(x_train, y_train,
52 | batch_size=batch_size,
53 | epochs=epochs, verbose=1)
54 | score = model.predict(x_test)
55 | return history, score, model
56 |
57 | def get_init_parameters(path, ext=None):
58 | if ext == 'vec':
59 | word_model = KeyedVectors.load_word2vec_format(path).wv
60 | else:
61 | word_model = KeyedVectors.load(path).wv
62 | n_words = len(word_model.vocab)
63 | vocab_dim = word_model[word_model.index2word[0]].shape[0]
64 | index_dict = dict()
65 | for i in range(n_words):
66 | index_dict[word_model.index2word[i]] = i+1
67 | return word_model, index_dict, n_words, vocab_dim
68 |
69 | def get_max_length(text_data, return_line=False):
70 | max_length = 0
71 | long_line = ""
72 | for line in text_data:
73 | new = len(line.split())
74 | if new > max_length:
75 | max_length = new
76 | long_line = line
77 | if return_line:
78 | return long_line, max_length
79 | else:
80 | return max_length
81 |
82 | def split_datasets(data_paths, test_size, header=True, seed=42):
83 | x = []
84 | y = []
85 | for data_path in data_paths:
86 | with open(data_path, 'r') as f:
87 | for line in f:
88 | if header:
89 | header = False
90 | else:
91 | temp = line.split(',')
92 | x.append(temp[0])
93 | y.append(temp[1].replace('\n', ''))
94 | max_length = get_max_length(x)
95 | x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_size, random_state=seed)
96 | print('Dataset splited.')
97 | return x_train, x_test, y_train, y_test, max_length
98 |
99 | def get_train_test(train_raw_text, test_raw_text, n_words, max_length):
100 | tokenizer = text.Tokenizer(num_words=n_words)
101 | tokenizer.fit_on_texts(list(train_raw_text))
102 | word_index = tokenizer.word_index
103 | train_tokenized = tokenizer.texts_to_sequences(train_raw_text)
104 | test_tokenized = tokenizer.texts_to_sequences(test_raw_text)
105 | return sequence.pad_sequences(train_tokenized, maxlen=max_length, padding='post', truncating='post'),\
106 | sequence.pad_sequences(test_tokenized, maxlen=max_length, padding='post', truncating='post'),\
107 | word_index
108 |
109 | def class_str_2_ind(x_train, x_test, y_train, y_test, classes, n_words, max_length):
110 | print('Converting data to trainable form...')
111 | y_encoder = preprocessing.LabelEncoder()
112 | y_encoder.fit(classes)
113 | y_train = y_encoder.transform(y_train)
114 | y_test = y_encoder.transform(y_test)
115 | train_y_cat = np_utils.to_categorical(y_train, len(classes))
116 | x_vec_train, x_vec_test, word_index = get_train_test(x_train, x_test, n_words, max_length)
117 | print('Number of training examples: ' + str(len(x_vec_train)))
118 | print('Number of testing examples: ' + str(len(x_vec_test)))
119 | return x_vec_train, x_vec_test, y_train, y_test, train_y_cat, word_index
120 |
121 | def get_main_model(word_index, WORD_MODEL, EMBED_SIZE, MAX_TEXT_LENGTH):
122 | tmp = get_embedding_matrix(word_index, WORD_MODEL, EMBED_SIZE)
123 | model = get_model(tmp, word_index, EMBED_SIZE, MAX_TEXT_LENGTH, print_summary=True)
124 | return model
125 |
126 | def get_embedding_vectors(vectors, index_dict, n_words, vocab_dim):
127 | embedding_weights = np.zeros((n_words+1, vocab_dim))
128 | for word, index in index_dict.items():
129 | embedding_weights[index, :] = vectors[word]
130 | return embedding_weights
131 |
132 | def load_vectors(fname):
133 | fin = io.open(fname, 'r', encoding='utf-8', newline='\n', errors='ignore')
134 | n, d = map(int, fin.readline().split())
135 | data = {}
136 | for line in fin:
137 | tokens = line.rstrip().split(' ')
138 | data[tokens[0]] = map(float, tokens[1:])
139 | return data
140 |
141 |
142 | # ==========Deprecated Code===========
143 |
144 |
145 | def error_on_batch(res, y_test):
146 | y_pred = [np.argmax(tmp) for tmp in res]
147 | y_real = [np.argmax(tmp) for tmp in y_test]
148 | true = [1 for i, j in zip(y_pred, y_real) if i == j]
149 | err = len(true)/len(y_pred)
150 | return err
151 |
152 | def convert_data(data, vocab, index):
153 | new = []
154 | for word in data.split():
155 | if word in vocab:
156 | new.append(index[word])
157 | else:
158 | new.append(index[''])
159 | return new
--------------------------------------------------------------------------------