├── 02_nlp
├── dataset
│ └── textlist.txt
├── origin_stopwords.txt
├── main.ipynb
└── cleaning.ipynb
├── README.md
├── LICENSE
├── .gitignore
├── requirements.txt
├── 01_regression
└── main.ipynb
└── 03_deeplearning
└── main.ipynb
/02_nlp/dataset/textlist.txt:
--------------------------------------------------------------------------------
1 | akutagawa/ababababa.txt
2 | akutagawa/agunino_kami.txt
3 | akutagawa/aki.txt
4 | akutagawa/imogayu.txt
5 | akutagawa/inuto_fue.txt
6 | akutagawa/rokunomiyano_himegimi.txt
7 | akutagawa/umano_ashi.txt
8 | akutagawa/yabuno_naka.txt
9 | akutagawa/yasukichino_techokara.txt
10 |
11 | dazai/asamasiki_mono.txt
12 | dazai/bishojo.txt
13 | dazai/enten_kandan.txt
14 | dazai/goodbye.txt
15 | dazai/hashire_merosu.txt
16 | dazai/hinotori.txt
17 | dazai/ichimon_itto.txt
18 | dazai/ippo_zenshin_niho_taikyaku.txt
19 | dazai/kahei.txt
20 | dazai/uso.txt
21 | dazai/viyon.txt
22 |
23 | mori/abe_ichizoku.txt
24 | mori/bara.txt
25 | mori/jiisan_baasan.txt
26 | mori/kanazukai_iken.txt
27 | mori/maihime.txt
28 | mori/takasebune.txt
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 実践編Pythonコード
2 | 石川 聡彦 著『人工知能プログラミングのための数学がわかる本』(2018年2月/KADOKAWA社)の実践編で取り扱ったPythonコードです。
3 |
4 | ## Overview
5 | 石川 聡彦 著『人工知能プログラミングのための数学がわかる本』(2018年2月/KADOKAWA社)の実践編で取り扱ったPythonコードです。Amazonなど全国書店で発売中です。
6 | https://www.amazon.co.jp/dp/4046021969/
7 |
8 | 本著「CHAPTER 5 実践編1 回帰モデルで住宅価格を推定してみよう」が `01_regression`、「CHAPTER 6 実践編2 自然言語処理で文学作品の作者を当てよう
9 | 」が `02_nlp`、「CHAPTER 7 実践編3 ディープラーニングで手書き数字認識をしてみよう」が `03_deeplearning`フォルダのコードに該当します。
10 |
11 | Pythonコードは、コードを実行しながら中身を理解できるように、全てJupyter Notebook形式で幾つかのセルに分けて準備されています。
12 |
13 | ## Requirement
14 | - Python3.4 以上
15 | - Jupyter Notebook環境
16 | - pipでインストールする項目は `requirements.txt`を参照ください。
17 |
18 | ## How to use
19 | - `02_nlp`は、`cleaning.ipynb`を`main.ipynb`より先に実行ください。
20 | - その他のコードは`main.ipynb`を順に実行ください。
21 |
22 | ## ミスの指摘などに関して
23 | ご迷惑をおかけしており大変申し訳ございません。Pull Requestをお送り頂くか、support@aidemy.net までお気軽にご連絡くださいませ。
24 |
25 | ## さらに学習したい方は...
26 | エンジニアのテックカレッジ「Aidemy」がオススメです。Pythonの基礎からディープラーニングまで、今なら一部無料で学習できます。
27 | https://aidemy.net/
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 AkihikoIshikawa
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 |
49 | # Translations
50 | *.mo
51 | *.pot
52 |
53 | # Django stuff:
54 | *.log
55 | local_settings.py
56 |
57 | # Flask stuff:
58 | instance/
59 | .webassets-cache
60 |
61 | # Scrapy stuff:
62 | .scrapy
63 |
64 | # Sphinx documentation
65 | docs/_build/
66 |
67 | # PyBuilder
68 | target/
69 |
70 | # Jupyter Notebook
71 | .ipynb_checkpoints
72 |
73 | # pyenv
74 | .python-version
75 |
76 | # celery beat schedule file
77 | celerybeat-schedule
78 |
79 | # SageMath parsed files
80 | *.sage.py
81 |
82 | # dotenv
83 | .env
84 |
85 | # virtualenv
86 | .venv
87 | venv/
88 | ENV/
89 |
90 | # Spyder project settings
91 | .spyderproject
92 | .spyproject
93 |
94 | # Rope project settings
95 | .ropeproject
96 |
97 | # mkdocs documentation
98 | /site
99 |
100 | # mypy
101 | .mypy_cache/
102 |
103 | # Mac
104 | .DS_Store
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | alabaster==0.7.10
2 | asn1crypto==0.23.0
3 | Babel==2.5.1
4 | beautifulsoup4==4.6.0
5 | bitarray==0.8.1
6 | bkcharts==0.2
7 | blaze==0.10.1
8 | bleach==2.1.1
9 | bokeh==0.12.10
10 | boto==2.48.0
11 | bs4==0.0.1
12 | bz2file==0.98
13 | certifi==2017.7.27.1
14 | cffi==1.11.2
15 | chainer==3.0.0
16 | chardet==3.0.4
17 | click==6.7
18 | colorama==0.3.9
19 | contextlib2==0.5.5
20 | cryptography==2.1.2
21 | cycler==0.10.0
22 | Cython==0.27.2
23 | cytoolz==0.8.2
24 | dask==0.15.4
25 | datashape==0.5.2
26 | decorator==4.1.2
27 | docutils==0.14
28 | entrypoints==0.2.3
29 | filelock==2.0.12
30 | Flask==0.12.2
31 | Flask-Cors==3.0.3
32 | gensim==3.0.1
33 | get==0.0.21
34 | graphviz==0.8.1
35 | gunicorn==19.7.1
36 | h5py==2.7.1
37 | HeapDict==1.0.0
38 | html5lib==0.999999999
39 | httplib2==0.10.3
40 | idna==2.6
41 | imagesize==0.7.1
42 | ipykernel==4.6.1
43 | ipython==6.2.1
44 | ipython-genutils==0.2.0
45 | ipywidgets==7.0.3
46 | itsdangerous==0.24
47 | Janome==0.3.5
48 | jedi==0.11.0
49 | Jinja2==2.9.6
50 | jsonschema==2.6.0
51 | jupyter==1.0.0
52 | jupyter-client==5.1.0
53 | jupyter-console==5.2.0
54 | jupyter-core==4.3.0
55 | Keras==2.0.8
56 | llvmlite==0.20.0
57 | lxml==4.1.0
58 | Markdown==2.6.9
59 | MarkupSafe==1.0
60 | matplotlib==2.1.0
61 | mecab-python3==0.7
62 | mistune==0.8
63 | mock==2.0.0
64 | mpmath==1.0.0
65 | multipledispatch==0.4.9
66 | nbconvert==5.3.1
67 | nbformat==4.4.0
68 | networkx==2.0
69 | ngram==3.3.2
70 | nltk==3.2.5
71 | nose==1.3.7
72 | notebook==5.2.0
73 | numba==0.35.0
74 | numexpr==2.6.4
75 | numpy==1.13.3
76 | numpydoc==0.7.0
77 | oauthlib==2.0.6
78 | odo==0.5.0
79 | olefile==0.44
80 | opencv-python==3.3.0.10
81 | packaging==16.8
82 | pandas==0.20.3
83 | pandas-datareader==0.5.0
84 | pandocfilters==1.4.2
85 | parso==0.1.0
86 | pathlib2==2.3.0
87 | patsy==0.4.1
88 | pbr==3.1.1
89 | pep8==1.7.1
90 | pexpect==4.2.1
91 | pickleshare==0.7.4
92 | Pillow==4.3.0
93 | pip-review==1.0
94 | post==0.0.13
95 | prompt-toolkit==1.0.15
96 | protobuf==3.4.0
97 | psutil==5.4.0
98 | ptyprocess==0.5.2
99 | public==0.0.38
100 | pycparser==2.18
101 | pycrypto==2.6.1
102 | pycurl==7.43.0
103 | pydotplus==2.0.2
104 | pyflakes==1.6.0
105 | Pygments==2.2.0
106 | pyOpenSSL==17.3.0
107 | pyparsing==2.2.0
108 | pyperclip==1.5.27
109 | python-dateutil==2.6.1
110 | python-louvain==0.9
111 | pytz==2017.2
112 | PyWavelets==0.5.2
113 | PyYAML==3.12
114 | pyzmq==16.0.2
115 | QtAwesome==0.4.4
116 | qtconsole==4.3.1
117 | QtPy==1.3.1
118 | query-string==0.0.12
119 | request==0.0.13
120 | requests==2.18.4
121 | requests-file==1.4.2
122 | requests-ftp==0.3.1
123 | requests-oauthlib==0.8.0
124 | scikit-image==0.13.1
125 | scikit-learn==0.19.1
126 | scipy==1.0.0
127 | seaborn==0.8.1
128 | setupfiles==0.0.50
129 | simplegeneric==0.8.1
130 | six==1.11.0
131 | sklearn==0.0
132 | smart-open==1.5.3
133 | snowballstemmer==1.2.1
134 | Sphinx==1.6.5
135 | sphinxcontrib-websupport==1.0.1
136 | SQLAlchemy==1.1.14
137 | statsmodels==0.8.0
138 | sympy==1.1.1
139 | tables==3.4.2
140 | tensorflow==1.3.0
141 | tensorflow-gpu==1.3.0
142 | tensorflow-tensorboard==0.1.8
143 | terminado==0.6
144 | testpath==0.3.1
145 | Theano==0.9.0
146 | toolz==0.8.2
147 | tornado==4.5.2
148 | traitlets==4.3.2
149 | tweepy==3.5.0
150 | urllib3==1.22
151 | wcwidth==0.1.7
152 | webencodings==0.5.1
153 | Werkzeug==0.12.2
154 | widgetsnbextension==3.0.6
155 | xlrd==1.1.0
156 | XlsxWriter==1.0.2
157 | xlwt==1.3.0
158 | zict==0.1.3
159 |
--------------------------------------------------------------------------------
/02_nlp/origin_stopwords.txt:
--------------------------------------------------------------------------------
1 | 、
2 | の
3 | 。
4 | に
5 | は
6 | て
7 | を
8 | た
9 | 《
10 | 》
11 | が
12 | と
13 | で
14 | し
15 | も
16 |
17 | 」
18 | 「
19 | ない
20 | な
21 | い
22 | だ
23 | か
24 | ある
25 | から
26 | へ
27 | う
28 | まし
29 | いる
30 | その
31 | ます
32 | 人
33 | こと
34 | ん
35 | れ
36 | それ
37 | 私
38 | もの
39 | よう
40 | 云
41 | さ
42 | ば
43 | 一
44 | です
45 | この
46 | お
47 | ぬ
48 | する
49 | 二
50 | ふ
51 | 事
52 | ず
53 | つて
54 | 来
55 | 何
56 | つ
57 | あり
58 | や
59 | よ
60 | 中
61 | ながら
62 | なっ
63 | せ
64 | 男
65 | ね
66 | 見
67 | そう
68 | 女
69 | 御
70 | 三
71 | 十
72 | 時
73 | なら
74 | あっ
75 | なり
76 | ?
77 | ませ
78 | まで
79 | あの
80 | 顔
81 | 彼
82 | やう
83 | これ
84 | 五
85 | |
86 | ひ
87 | 日
88 | なる
89 | でも
90 | もう
91 | という
92 | ゐる
93 | 出
94 | さん
95 | 言っ
96 | き
97 | だけ
98 | たち
99 | ござい
100 | 上
101 | ゐ
102 | なく
103 | られ
104 | しかし
105 | また
106 | ——
107 | あなた
108 | 假名
109 | 前
110 | る
111 | たら
112 | いい
113 | ばかり
114 | 家
115 | たり
116 | 声
117 | いや
118 | 自分
119 | など
120 | 手
121 | 思っ
122 | おれ
123 | あ
124 | 夫
125 | 遣
126 | …
127 | ひと
128 | どう
129 | じゃ
130 | わ
131 | より
132 | り
133 | なかっ
134 | み
135 | 心
136 | たる
137 | 気
138 | ま
139 | ので
140 | ご
141 | それから
142 | こう
143 | 君
144 | とき
145 | く
146 | 見る
147 | 目
148 | ]
149 | 年
150 | たい
151 | あたし
152 | 少し
153 | 今
154 | わたし
155 | さちよ
156 | 出し
157 | 外
158 | 話
159 | まだ
160 | うち
161 | 間
162 | 様
163 | 位
164 | 又
165 | め
166 | 余
167 | けれども
168 | 方
169 | -
170 | いま
171 | 僕
172 | かけ
173 | 所
174 | 眼
175 | ら
176 | 保吉
177 | 一つ
178 | 後
179 | 誰
180 | え
181 | 我
182 | 居る
183 | まま
184 | 下
185 | 云う
186 | ため
187 | だっ
188 | そんな
189 | くれ
190 | あつ
191 | お前
192 | 者
193 | れる
194 | 犬
195 | ひとり
196 | 口
197 | ほう
198 | す
199 | ぢ
200 | 言う
201 | どこ
202 | 出来
203 | 彼女
204 | 来る
205 | 的
206 | 六
207 | らしい
208 | でしょ
209 | 店
210 | ほど
211 | なかつ
212 | ところ
213 | あれ
214 | なけれ
215 | って
216 | ここ
217 | でし
218 | 下さい
219 | 居り
220 | として
221 | ただ
222 | 無い
223 | くらい
224 | つた
225 | すぐ
226 | じ
227 | 聞い
228 | 右
229 | 知れ
230 | ふと
231 | 感じ
232 | こ
233 | 行
234 | メロス
235 | そこ
236 | 言い
237 | だろ
238 | 思う
239 | 身
240 | 四
241 | 思ひ
242 | け
243 | 思ふ
244 | まい
245 | 同じ
246 | 知ら
247 | 見え
248 | なん
249 | 言葉
250 | 父
251 | 行っ
252 | のに
253 | 忠利
254 | 信子
255 | 國
256 | 度
257 | 光
258 | ゝ
259 | やはり
260 | そうして
261 | だって
262 | 大
263 | 七
264 | 是
265 | 主人
266 | 物
267 | つけ
268 | 第
269 | 馬
270 | 來
271 | にて
272 | ち
273 | 程
274 | !
275 | 百
276 | 思い
277 | ども
278 | かも
279 | (
280 | こんな
281 | 子
282 | 知っ
283 | しまっ
284 | わたくし
285 | 人間
286 | ぞ
287 | しよ
288 | 夜
289 | ねえ
290 | ほ
291 | なつ
292 | 母
293 | さえ
294 | 仁
295 | 之
296 | 田島
297 | とも
298 | げ
299 | 酒
300 | ど
301 | 考え
302 | 部屋
303 | 郎
304 | すると
305 | 頃
306 | 利
307 | 立っ
308 | 頭
309 | 殉死
310 | 衛門
311 | 或
312 | 本
313 | よく
314 | 語
315 | のみ
316 | あら
317 | 内
318 | 風
319 | どうも
320 | 言
321 | 歩い
322 | 色
323 | 妻
324 | 婆さん
325 | いっ
326 | 姫君
327 | 持っ
328 | 斯
329 | )
330 | 八
331 | 自身
332 | わけ
333 | ああ
334 | 々
335 | ろ
336 | 皆
337 | やっ
338 | 勿論
339 | 死ん
340 | そこで
341 | 行く
342 | 申し
343 | とか
344 | 侍
345 | 髪長
346 | 彦
347 | 姫
348 | 其の
349 | 此
350 | 笑っ
351 | ほか
352 | かう
353 | 石
354 | やら
355 | 通り
356 | 朝
357 | あと
358 | 姿
359 | いけ
360 | でき
361 | 氏
362 | 数枝
363 | つい
364 | 居
365 | はいっ
366 | べき
367 | 青年
368 | 半
369 | 得
370 | まあ
371 | 足
372 | 先
373 | 用
374 | うし
375 | 字
376 | 阿部
377 | 忘れ
378 | 帰っ
379 | それでも
380 | もと
381 | 早く
382 | どんな
383 | 弟
384 | 1
385 | ちょっと
386 | キヌ子
387 | 大谷
388 | だい
389 | 彼等
390 | とうとう
391 | っ
392 | 常子
393 | 悪い
394 | 耳
395 | 音
396 | 空
397 | 胸
398 | ばか
399 | しょ
400 | 涙
401 | 有
402 | 道
403 | 山
404 | 窓
405 | 違
406 | やつ
407 | ふも
408 | 子供
409 | 神
410 | 命
411 | 聞え
412 | 行き
413 | 婆
414 | あろ
415 | 少女
416 | 思わ
417 | わから
418 | ほとんど
419 | られる
420 | 様子
421 | 数馬
422 | 乙彦
423 | つき
424 | かみ
425 | 火
426 | 水準
427 | 歳
428 | 金
429 | はじめ
430 | 相手
431 | 名
432 | 書い
433 | 昔
434 | 今日
435 | 伊織
436 | なんて
437 | 例
438 | 微笑
439 | 円
440 | しか
441 | 遠藤
442 | ましょ
443 | 妹
444 | たく
445 | 生活
446 | ゆ
447 | 唯
448 | 信じ
--------------------------------------------------------------------------------
/02_nlp/main.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "Using TensorFlow backend.\n"
13 | ]
14 | }
15 | ],
16 | "source": [
17 | "# モジュール読み込み\n",
18 | "import csv\n",
19 | "import pickle\n",
20 | "\n",
21 | "import gensim\n",
22 | "from gensim import models\n",
23 | "from sklearn.linear_model import LogisticRegression\n",
24 | "from sklearn.model_selection import train_test_split\n",
25 | "from sklearn.metrics import classification_report\n",
26 | "from sklearn.metrics import confusion_matrix"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": 2,
32 | "metadata": {
33 | "collapsed": true
34 | },
35 | "outputs": [],
36 | "source": [
37 | "dataset_file_name = './dataset/corpus.csv'\n",
38 | "model_file_name = 'logistic.pkl'"
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": 3,
44 | "metadata": {},
45 | "outputs": [
46 | {
47 | "name": "stdout",
48 | "output_type": "stream",
49 | "text": [
50 | "sum_words: 102532\n"
51 | ]
52 | }
53 | ],
54 | "source": [
55 | "# csvファイルを扱いやすいフォーマットに変形\n",
56 | "\n",
57 | "with open(dataset_file_name, 'r') as f:\n",
58 | " data = list(csv.reader(f))\n",
59 | "\n",
60 | "texts, label_ids = [], []\n",
61 | "label2id = {}\n",
62 | "idx_label, idx_sentence = 0, 1\n",
63 | "sum_words = []\n",
64 | "\n",
65 | "for counter, row in enumerate(data):\n",
66 | " if counter == 0:\n",
67 | " continue\n",
68 | " label = row[idx_label]\n",
69 | " if label not in label2id:\n",
70 | " label2id[label] = len(label2id)\n",
71 | " label_ids.append(label2id[label])\n",
72 | " word_list = row[idx_sentence].split(' ')\n",
73 | " texts.append(word_list)\n",
74 | " \n",
75 | " for line in word_list:\n",
76 | " for word in line:\n",
77 | " sum_words.append(word)\n",
78 | "\n",
79 | "print('sum_words: ', len(sum_words))\n",
80 | "id2label = {v: k for k, v in label2id.items()}"
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 4,
86 | "metadata": {
87 | "collapsed": true
88 | },
89 | "outputs": [],
90 | "source": [
91 | "# テキストとラベルのデータをtrain, testに分割します\n",
92 | "X_train_texts, X_test_texts, y_train, y_test = train_test_split(texts, label_ids, test_size=0.2, random_state=42)"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 5,
98 | "metadata": {
99 | "collapsed": true
100 | },
101 | "outputs": [],
102 | "source": [
103 | "# trainのテキストデータから、tfidfで重み付けされた単語文書行列を作成します\n",
104 | "\n",
105 | "# テキストデータから辞書を作成します\n",
106 | "dictionary = gensim.corpora.Dictionary(X_train_texts)\n",
107 | "# 辞書を用いてBoW形式に文章を行列化します\n",
108 | "corpus = [dictionary.doc2bow(text) for text in X_train_texts]\n",
109 | "\n",
110 | "# BoW形式で作成したcorpusをtfidfを用いて重み付けします\n",
111 | "tfidf_model = models.TfidfModel(corpus)\n",
112 | "tfidf_corpus = tfidf_model[corpus]\n",
113 | "\n",
114 | "num_words = len(dictionary)\n",
115 | "X_train_tfidf = gensim.matutils.corpus2dense(tfidf_corpus, num_terms=num_words).T"
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": 6,
121 | "metadata": {
122 | "collapsed": true
123 | },
124 | "outputs": [],
125 | "source": [
126 | "# testのテキストデータから、tfidfで重み付けされた単語文書行列を作成します\n",
127 | "\n",
128 | "# 辞書を用いてBoW形式に文章を行列化します\n",
129 | "corpus = [dictionary.doc2bow(text) for text in X_test_texts]\n",
130 | "# BoW形式で作成したcorpusをtfidfを用いて重み付けします\n",
131 | "tfidf_corpus = tfidf_model[corpus]\n",
132 | "\n",
133 | "num_words = len(dictionary)\n",
134 | "X_test_tfidf = gensim.matutils.corpus2dense(tfidf_corpus, num_terms=num_words).T"
135 | ]
136 | },
137 | {
138 | "cell_type": "code",
139 | "execution_count": 7,
140 | "metadata": {},
141 | "outputs": [
142 | {
143 | "data": {
144 | "text/plain": [
145 | "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
146 | " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
147 | " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
148 | " verbose=0, warm_start=False)"
149 | ]
150 | },
151 | "execution_count": 7,
152 | "metadata": {},
153 | "output_type": "execute_result"
154 | }
155 | ],
156 | "source": [
157 | "# trainデータを用いて分類器を構築します\n",
158 | "clf = LogisticRegression(C=1, penalty='l2')\n",
159 | "clf.fit(X_train_tfidf, y_train)"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": 8,
165 | "metadata": {},
166 | "outputs": [
167 | {
168 | "name": "stdout",
169 | "output_type": "stream",
170 | "text": [
171 | " precision recall f1-score support\n",
172 | "\n",
173 | " dazai 0.72 0.95 0.82 732\n",
174 | " mori 0.94 0.66 0.78 492\n",
175 | " akutagawa 0.87 0.72 0.79 551\n",
176 | "\n",
177 | "avg / total 0.83 0.80 0.80 1775\n",
178 | "\n",
179 | "[[698 8 26]\n",
180 | " [132 327 33]\n",
181 | " [143 13 395]]\n"
182 | ]
183 | }
184 | ],
185 | "source": [
186 | "# testデータを用いて分類器の精度を評価します\n",
187 | "y_pred = clf.predict(X_test_tfidf)\n",
188 | "target_names = list(id2label.values())\n",
189 | "\n",
190 | "print(classification_report(y_test, y_pred, target_names=target_names))\n",
191 | "print(confusion_matrix(y_test, y_pred))"
192 | ]
193 | }
194 | ],
195 | "metadata": {
196 | "kernelspec": {
197 | "display_name": "Python 3",
198 | "language": "python",
199 | "name": "python3"
200 | },
201 | "language_info": {
202 | "codemirror_mode": {
203 | "name": "ipython",
204 | "version": 3
205 | },
206 | "file_extension": ".py",
207 | "mimetype": "text/x-python",
208 | "name": "python",
209 | "nbconvert_exporter": "python",
210 | "pygments_lexer": "ipython3",
211 | "version": "3.6.1"
212 | }
213 | },
214 | "nbformat": 4,
215 | "nbformat_minor": 2
216 | }
217 |
--------------------------------------------------------------------------------
/02_nlp/cleaning.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "collapsed": true
8 | },
9 | "outputs": [],
10 | "source": [
11 | "import os\n",
12 | "import re\n",
13 | "import sys\n",
14 | "\n",
15 | "import MeCab"
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": 2,
21 | "metadata": {
22 | "collapsed": true
23 | },
24 | "outputs": [],
25 | "source": [
26 | "nm = MeCab.Tagger('-Owakati')\n",
27 | "\n",
28 | "# txtファイルを全部読み込んで分かち書きやクリーニングをしていく\n",
29 | "files = [f for f in os.listdir('./dataset/raw_datas') if f.split('.')[1] == 'txt']\n",
30 | "authors = {'dazai': [], 'mori': [], 'akutagawa': []}\n",
31 | "cleaned_data = []"
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 3,
37 | "metadata": {},
38 | "outputs": [
39 | {
40 | "name": "stdout",
41 | "output_type": "stream",
42 | "text": [
43 | "akutagawa\n",
44 | "mori\n",
45 | "dazai\n"
46 | ]
47 | }
48 | ],
49 | "source": [
50 | "def clean(raw_text):\n",
51 | " \"\"\"\n",
52 | " ルビや入力者注を削除して一文毎に分割,分かち書き\n",
53 | " \"\"\"\n",
54 | " text = raw_text.replace('\\n', '').replace('\\u3000', '')\n",
55 | " text = re.sub('[[《]', '/', text)\n",
56 | " text = re.sub('[]》]', '\', text)\n",
57 | " text = re.sub('/[^\]*?\', '', text)\n",
58 | " text = text.replace('。', '。\\n')\n",
59 | " text = text.replace('「', '')\n",
60 | " text = text.replace('」', '\\n').split('\\n')\n",
61 | "\n",
62 | " return [nm.parse(t).split(' ') for t in text if t]\n",
63 | "\n",
64 | "for f in files:\n",
65 | " name = f.split('.')[0]\n",
66 | " print(name)\n",
67 | " with open('./dataset/raw_datas/'+str(f), 'r') as f:\n",
68 | " clean_text = clean(f.read())\n",
69 | " authors[name] = clean_text\n",
70 | " cleaned_data += clean_text"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 4,
76 | "metadata": {},
77 | "outputs": [
78 | {
79 | "name": "stdout",
80 | "output_type": "stream",
81 | "text": [
82 | "sorted_stop:13928\n",
83 | "freq_num:417\n",
84 | "cleaned_data:8876\n"
85 | ]
86 | }
87 | ],
88 | "source": [
89 | "def make_stopdic(lines):\n",
90 | " \"\"\"\n",
91 | " 空白区切りの文の集まりのテキストのリストからストップワードの辞書を作成する。\n",
92 | " \"\"\"\n",
93 | " calc_words = {}\n",
94 | " for line in lines:\n",
95 | " for word in line:\n",
96 | " if word in calc_words:\n",
97 | " calc_words[str(word)] += 1\n",
98 | " else:\n",
99 | " calc_words[str(word)] = 1\n",
100 | " sorted_stop = sorted(calc_words.items(), key=lambda x:x[1], reverse=True)\n",
101 | " print(\"sorted_stop:\"+str(len(sorted_stop)))\n",
102 | " freq_num = int(len(sorted_stop)*0.03)\n",
103 | " n = 0\n",
104 | " stop_words = []\n",
105 | " print(\"freq_num:\"+str(freq_num))\n",
106 | " for data in sorted_stop:\n",
107 | " stop_words.append(str(data[0]))\n",
108 | " #print('High frequency word: ',str(data[0]), str(data[1]))\n",
109 | " n += 1\n",
110 | " if n > freq_num:\n",
111 | " break\n",
112 | " # 作成したストップワードの辞書の保存\n",
113 | " with open('./origin_stopwords.txt', 'w') as f:\n",
114 | " f.write('\\n'.join(stop_words))\n",
115 | "\n",
116 | "make_stopdic(cleaned_data)\n",
117 | "print(\"cleaned_data:\"+str(len(cleaned_data)))"
118 | ]
119 | },
120 | {
121 | "cell_type": "code",
122 | "execution_count": 5,
123 | "metadata": {},
124 | "outputs": [
125 | {
126 | "name": "stdout",
127 | "output_type": "stream",
128 | "text": [
129 | "akutagawa.txt\n",
130 | "mori.txt\n",
131 | "dazai.txt\n"
132 | ]
133 | }
134 | ],
135 | "source": [
136 | "# ストップワードリストの作成\n",
137 | "stop_data = {}\n",
138 | "for f in files:\n",
139 | " with open('./dataset/raw_datas/'+str(f)) as f1:\n",
140 | " print(f)\n",
141 | " nm = MeCab.Tagger('-Owakati')\n",
142 | " text = nm.parse(f1.read()).split(' ')\n",
143 | " for word in text:\n",
144 | " if word in stop_data:\n",
145 | " stop_data[str(word)] += 1\n",
146 | " else:\n",
147 | " stop_data[str(word)] = 1"
148 | ]
149 | },
150 | {
151 | "cell_type": "code",
152 | "execution_count": 6,
153 | "metadata": {},
154 | "outputs": [
155 | {
156 | "name": "stdout",
157 | "output_type": "stream",
158 | "text": [
159 | "14900\n",
160 | "447\n",
161 | "High frequency word: 、 13365\n",
162 | "High frequency word: の 8869\n",
163 | "High frequency word: 。 8102\n",
164 | "High frequency word: に 6747\n",
165 | "High frequency word: は 6410\n",
166 | "High frequency word: て 5906\n",
167 | "High frequency word: を 5388\n",
168 | "High frequency word: た 5329\n",
169 | "High frequency word: 《 4561\n",
170 | "High frequency word: 》 4556\n",
171 | "High frequency word: が 3447\n",
172 | "High frequency word: と 3082\n",
173 | "High frequency word: で 2866\n",
174 | "High frequency word: し 2176\n",
175 | "High frequency word: も 2105\n",
176 | "High frequency word: 1802\n",
177 | "High frequency word: 」 1614\n",
178 | "High frequency word: 「 1575\n",
179 | "High frequency word: ない 1194\n",
180 | "High frequency word: な 1170\n",
181 | "High frequency word: い 1092\n",
182 | "High frequency word: だ 1076\n",
183 | "High frequency word: か 1067\n",
184 | "High frequency word: ある 938\n",
185 | "High frequency word: から 894\n",
186 | "High frequency word: へ 842\n",
187 | "High frequency word: う 832\n",
188 | "High frequency word: まし 727\n",
189 | "High frequency word: いる 712\n",
190 | "High frequency word: その 693\n",
191 | "High frequency word: ます 663\n",
192 | "High frequency word: 人 653\n",
193 | "High frequency word: こと 642\n",
194 | "High frequency word: ん 608\n",
195 | "High frequency word: れ 556\n",
196 | "High frequency word: それ 543\n",
197 | "High frequency word: 私 542\n",
198 | "High frequency word: もの 530\n",
199 | "High frequency word: よう 526\n",
200 | "High frequency word: 云 513\n",
201 | "High frequency word: さ 505\n",
202 | "High frequency word: ば 505\n",
203 | "High frequency word: 一 482\n",
204 | "High frequency word: です 467\n",
205 | "High frequency word: この 448\n",
206 | "High frequency word: お 434\n",
207 | "High frequency word: ぬ 430\n",
208 | "High frequency word: する 420\n",
209 | "High frequency word: 二 409\n",
210 | "High frequency word: ふ 398\n",
211 | "High frequency word: 事 397\n",
212 | "High frequency word: ず 352\n",
213 | "High frequency word: つて 351\n",
214 | "High frequency word: 来 341\n",
215 | "High frequency word: 何 334\n",
216 | "High frequency word: つ 331\n",
217 | "High frequency word: あり 327\n",
218 | "High frequency word: や 317\n",
219 | "High frequency word: よ 308\n",
220 | "High frequency word: 中 305\n",
221 | "High frequency word: ながら 305\n",
222 | "High frequency word: なっ 299\n",
223 | "High frequency word: せ 297\n",
224 | "High frequency word: 男 293\n",
225 | "High frequency word: ね 289\n",
226 | "High frequency word: 見 285\n",
227 | "High frequency word: そう 279\n",
228 | "High frequency word: 女 275\n",
229 | "High frequency word: 御 274\n",
230 | "High frequency word: 三 273\n",
231 | "High frequency word: 十 273\n",
232 | "High frequency word: 時 265\n",
233 | "High frequency word: なら 263\n",
234 | "High frequency word: あっ 260\n",
235 | "High frequency word: なり 254\n",
236 | "High frequency word: ? 254\n",
237 | "High frequency word: ませ 252\n",
238 | "High frequency word: まで 249\n",
239 | "High frequency word: あの 246\n",
240 | "High frequency word: 顔 246\n",
241 | "High frequency word: 彼 240\n",
242 | "High frequency word: やう 240\n",
243 | "High frequency word: これ 240\n",
244 | "High frequency word: 五 235\n",
245 | "High frequency word: | 234\n",
246 | "High frequency word: ひ 233\n",
247 | "High frequency word: 日 233\n",
248 | "High frequency word: なる 230\n",
249 | "High frequency word: でも 223\n",
250 | "High frequency word: もう 220\n",
251 | "High frequency word: という 218\n",
252 | "High frequency word: ゐる 212\n",
253 | "High frequency word: 出 212\n",
254 | "High frequency word: さん 208\n",
255 | "High frequency word: 言っ 198\n",
256 | "High frequency word: き 197\n",
257 | "High frequency word: だけ 193\n",
258 | "High frequency word: たち 193\n",
259 | "High frequency word: ござい 191\n",
260 | "High frequency word: 上 183\n",
261 | "High frequency word: ゐ 181\n",
262 | "High frequency word: なく 179\n",
263 | "High frequency word: られ 178\n",
264 | "High frequency word: しかし 175\n",
265 | "High frequency word: また 173\n",
266 | "High frequency word: —— 167\n",
267 | "High frequency word: あなた 166\n",
268 | "High frequency word: 假名 165\n",
269 | "High frequency word: 前 162\n",
270 | "High frequency word: る 162\n",
271 | "High frequency word: たら 160\n",
272 | "High frequency word: いい 158\n",
273 | "High frequency word: ばかり 156\n",
274 | "High frequency word: 家 156\n",
275 | "High frequency word: たり 155\n",
276 | "High frequency word: 声 154\n",
277 | "High frequency word: いや 151\n",
278 | "High frequency word: 自分 151\n",
279 | "High frequency word: など 146\n",
280 | "High frequency word: 手 145\n",
281 | "High frequency word: 思っ 145\n",
282 | "High frequency word: おれ 144\n",
283 | "High frequency word: あ 143\n",
284 | "High frequency word: 夫 143\n",
285 | "High frequency word: 遣 143\n",
286 | "High frequency word: … 142\n",
287 | "High frequency word: ひと 142\n",
288 | "High frequency word: どう 141\n",
289 | "High frequency word: じゃ 140\n",
290 | "High frequency word: わ 139\n",
291 | "High frequency word: より 137\n",
292 | "High frequency word: り 137\n",
293 | "High frequency word: なかっ 137\n",
294 | "High frequency word: み 136\n",
295 | "High frequency word: 心 136\n",
296 | "High frequency word: たる 133\n",
297 | "High frequency word: 気 132\n",
298 | "High frequency word: ま 131\n",
299 | "High frequency word: ので 131\n",
300 | "High frequency word: ご 131\n",
301 | "High frequency word: それから 130\n",
302 | "High frequency word: こう 129\n",
303 | "High frequency word: 君 125\n",
304 | "High frequency word: とき 122\n",
305 | "High frequency word: く 121\n",
306 | "High frequency word: 見る 120\n",
307 | "High frequency word: 目 120\n",
308 | "High frequency word: ] 119\n",
309 | "High frequency word: 年 118\n",
310 | "High frequency word: たい 118\n",
311 | "High frequency word: あたし 118\n",
312 | "High frequency word: 少し 115\n",
313 | "High frequency word: 今 114\n",
314 | "High frequency word: わたし 114\n",
315 | "High frequency word: さちよ 114\n",
316 | "High frequency word: 出し 113\n",
317 | "High frequency word: 外 113\n",
318 | "High frequency word: 話 113\n",
319 | "High frequency word: まだ 111\n",
320 | "High frequency word: うち 110\n",
321 | "High frequency word: 間 109\n",
322 | "High frequency word: 様 108\n",
323 | "High frequency word: 位 107\n",
324 | "High frequency word: 又 107\n",
325 | "High frequency word: め 107\n",
326 | "High frequency word: 余 107\n",
327 | "High frequency word: けれども 106\n",
328 | "High frequency word: 方 105\n",
329 | "High frequency word: - 102\n",
330 | "High frequency word: いま 101\n",
331 | "High frequency word: 僕 101\n",
332 | "High frequency word: かけ 100\n",
333 | "High frequency word: 所 100\n",
334 | "High frequency word: 眼 100\n",
335 | "High frequency word: ら 99\n",
336 | "High frequency word: 保吉 98\n",
337 | "High frequency word: 一つ 98\n",
338 | "High frequency word: 後 98\n",
339 | "High frequency word: 誰 98\n",
340 | "High frequency word: え 98\n",
341 | "High frequency word: 我 97\n",
342 | "High frequency word: 居る 97\n",
343 | "High frequency word: まま 96\n",
344 | "High frequency word: 下 96\n",
345 | "High frequency word: 云う 96\n",
346 | "High frequency word: ため 95\n",
347 | "High frequency word: だっ 95\n",
348 | "High frequency word: そんな 95\n",
349 | "High frequency word: くれ 94\n",
350 | "High frequency word: あつ 94\n",
351 | "High frequency word: お前 94\n",
352 | "High frequency word: 者 93\n",
353 | "High frequency word: れる 93\n",
354 | "High frequency word: 犬 91\n",
355 | "High frequency word: ひとり 91\n",
356 | "High frequency word: 口 90\n",
357 | "High frequency word: ほう 90\n",
358 | "High frequency word: す 89\n",
359 | "High frequency word: ぢ 88\n",
360 | "High frequency word: 言う 88\n",
361 | "High frequency word: どこ 88\n",
362 | "High frequency word: 出来 88\n",
363 | "High frequency word: 彼女 88\n",
364 | "High frequency word: 来る 87\n",
365 | "High frequency word: 的 87\n",
366 | "High frequency word: 六 86\n",
367 | "High frequency word: らしい 86\n",
368 | "High frequency word: でしょ 85\n",
369 | "High frequency word: 店 84\n",
370 | "High frequency word: ほど 84\n",
371 | "High frequency word: なかつ 84\n",
372 | "High frequency word: ところ 84\n",
373 | "High frequency word: あれ 83\n",
374 | "High frequency word: なけれ 83\n",
375 | "High frequency word: って 83\n",
376 | "High frequency word: ここ 82\n",
377 | "High frequency word: でし 82\n",
378 | "High frequency word: 下さい 82\n",
379 | "High frequency word: 居り 81\n",
380 | "High frequency word: として 80\n",
381 | "High frequency word: ただ 80\n",
382 | "High frequency word: 無い 80\n",
383 | "High frequency word: くらい 80\n",
384 | "High frequency word: つた 78\n",
385 | "High frequency word: すぐ 77\n",
386 | "High frequency word: じ 77\n",
387 | "High frequency word: 聞い 77\n",
388 | "High frequency word: 右 77\n",
389 | "High frequency word: 知れ 76\n",
390 | "High frequency word: ふと 76\n",
391 | "High frequency word: 感じ 76\n",
392 | "High frequency word: こ 76\n",
393 | "High frequency word: 行 76\n",
394 | "High frequency word: メロス 76\n",
395 | "High frequency word: そこ 75\n",
396 | "High frequency word: 言い 75\n",
397 | "High frequency word: だろ 75\n",
398 | "High frequency word: 思う 75\n",
399 | "High frequency word: 身 75\n",
400 | "High frequency word: 四 75\n",
401 | "High frequency word: 思ひ 74\n",
402 | "High frequency word: け 74\n",
403 | "High frequency word: 思ふ 74\n",
404 | "High frequency word: まい 74\n",
405 | "High frequency word: 同じ 73\n",
406 | "High frequency word: 知ら 73\n",
407 | "High frequency word: 見え 72\n",
408 | "High frequency word: なん 72\n",
409 | "High frequency word: 言葉 72\n",
410 | "High frequency word: 父 72\n",
411 | "High frequency word: 行っ 71\n",
412 | "High frequency word: のに 70\n",
413 | "High frequency word: 忠利 70\n",
414 | "High frequency word: 信子 69\n",
415 | "High frequency word: 國 69\n",
416 | "High frequency word: 度 68\n",
417 | "High frequency word: 光 68\n",
418 | "High frequency word: ゝ 68\n",
419 | "High frequency word: やはり 67\n",
420 | "High frequency word: そうして 67\n",
421 | "High frequency word: だって 67\n",
422 | "High frequency word: 大 67\n",
423 | "High frequency word: 七 67\n",
424 | "High frequency word: 是 67\n",
425 | "High frequency word: 主人 66\n",
426 | "High frequency word: 物 66\n",
427 | "High frequency word: つけ 66\n",
428 | "High frequency word: 第 66\n",
429 | "High frequency word: 馬 66\n",
430 | "High frequency word: 來 66\n",
431 | "High frequency word: にて 66\n",
432 | "High frequency word: ち 65\n",
433 | "High frequency word: 程 65\n",
434 | "High frequency word: ! 64\n",
435 | "High frequency word: 百 64\n",
436 | "High frequency word: 思い 64\n",
437 | "High frequency word: ども 64\n",
438 | "High frequency word: かも 63\n",
439 | "High frequency word: ( 63\n",
440 | "High frequency word: こんな 63\n",
441 | "High frequency word: 子 63\n",
442 | "High frequency word: 知っ 63\n",
443 | "High frequency word: しまっ 63\n",
444 | "High frequency word: わたくし 63\n",
445 | "High frequency word: 人間 63\n",
446 | "High frequency word: ぞ 62\n",
447 | "High frequency word: しよ 62\n",
448 | "High frequency word: 夜 62\n",
449 | "High frequency word: ねえ 62\n",
450 | "High frequency word: ほ 61\n",
451 | "High frequency word: なつ 61\n",
452 | "High frequency word: 母 61\n",
453 | "High frequency word: さえ 61\n",
454 | "High frequency word: 仁 61\n",
455 | "High frequency word: 之 61\n",
456 | "High frequency word: 田島 61\n",
457 | "High frequency word: とも 60\n",
458 | "High frequency word: げ 60\n",
459 | "High frequency word: 酒 60\n",
460 | "High frequency word: ど 60\n",
461 | "High frequency word: 考え 60\n",
462 | "High frequency word: 部屋 60\n",
463 | "High frequency word: 郎 60\n",
464 | "High frequency word: すると 59\n",
465 | "High frequency word: 頃 59\n",
466 | "High frequency word: 利 59\n",
467 | "High frequency word: 立っ 58\n",
468 | "High frequency word: 頭 58\n",
469 | "High frequency word: 殉死 58\n",
470 | "High frequency word: 衛門 58\n",
471 | "High frequency word: 或 57\n",
472 | "High frequency word: 本 57\n",
473 | "High frequency word: よく 57\n",
474 | "High frequency word: 語 57\n",
475 | "High frequency word: のみ 56\n",
476 | "High frequency word: あら 56\n",
477 | "High frequency word: 内 56\n",
478 | "High frequency word: 風 56\n",
479 | "High frequency word: どうも 55\n",
480 | "High frequency word: 言 55\n",
481 | "High frequency word: 歩い 55\n",
482 | "High frequency word: 色 54\n",
483 | "High frequency word: 妻 54\n",
484 | "High frequency word: 婆さん 54\n",
485 | "High frequency word: いっ 54\n",
486 | "High frequency word: 姫君 54\n",
487 | "High frequency word: 持っ 54\n",
488 | "High frequency word: 斯 54\n",
489 | "High frequency word: ) 53\n",
490 | "High frequency word: 八 53\n",
491 | "High frequency word: 自身 52\n",
492 | "High frequency word: わけ 52\n",
493 | "High frequency word: ああ 52\n",
494 | "High frequency word: 々 52\n",
495 | "High frequency word: ろ 52\n",
496 | "High frequency word: 皆 52\n",
497 | "High frequency word: やっ 52\n",
498 | "High frequency word: 勿論 51\n",
499 | "High frequency word: 死ん 51\n",
500 | "High frequency word: そこで 51\n",
501 | "High frequency word: 行く 51\n",
502 | "High frequency word: 申し 51\n",
503 | "High frequency word: とか 51\n",
504 | "High frequency word: 侍 51\n",
505 | "High frequency word: 髪長 51\n",
506 | "High frequency word: 彦 51\n",
507 | "High frequency word: 姫 51\n",
508 | "High frequency word: 其の 51\n",
509 | "High frequency word: 此 51\n",
510 | "High frequency word: 笑っ 50\n",
511 | "High frequency word: ほか 49\n",
512 | "High frequency word: かう 49\n",
513 | "High frequency word: 石 49\n",
514 | "High frequency word: やら 49\n",
515 | "High frequency word: 通り 48\n",
516 | "High frequency word: 朝 48\n",
517 | "High frequency word: あと 48\n",
518 | "High frequency word: 姿 48\n",
519 | "High frequency word: いけ 48\n",
520 | "High frequency word: でき 48\n",
521 | "High frequency word: 氏 48\n",
522 | "High frequency word: 数枝 48\n",
523 | "High frequency word: つい 47\n",
524 | "High frequency word: 居 47\n",
525 | "High frequency word: はいっ 47\n",
526 | "High frequency word: べき 47\n",
527 | "High frequency word: 青年 47\n",
528 | "High frequency word: 半 47\n",
529 | "High frequency word: 得 47\n",
530 | "High frequency word: まあ 46\n",
531 | "High frequency word: 足 46\n",
532 | "High frequency word: 先 46\n",
533 | "High frequency word: 用 46\n",
534 | "High frequency word: うし 46\n",
535 | "High frequency word: 字 46\n",
536 | "High frequency word: 阿部 46\n",
537 | "High frequency word: 忘れ 45\n",
538 | "High frequency word: 帰っ 45\n",
539 | "High frequency word: それでも 45\n",
540 | "High frequency word: もと 45\n",
541 | "High frequency word: 早く 45\n",
542 | "High frequency word: どんな 45\n",
543 | "High frequency word: 弟 45\n",
544 | "High frequency word: 1 45\n",
545 | "High frequency word: ちょっと 45\n",
546 | "High frequency word: キヌ子 45\n",
547 | "High frequency word: 大谷 45\n",
548 | "High frequency word: だい 44\n",
549 | "High frequency word: 彼等 44\n",
550 | "High frequency word: とうとう 44\n",
551 | "High frequency word: っ 44\n",
552 | "High frequency word: 常子 44\n",
553 | "High frequency word: 悪い 43\n",
554 | "High frequency word: 耳 43\n",
555 | "High frequency word: 音 43\n",
556 | "High frequency word: 空 43\n",
557 | "High frequency word: 胸 43\n",
558 | "High frequency word: ばか 43\n",
559 | "High frequency word: しょ 43\n",
560 | "High frequency word: 涙 43\n",
561 | "High frequency word: 有 43\n",
562 | "High frequency word: 道 43\n",
563 | "High frequency word: 山 43\n",
564 | "High frequency word: 窓 42\n",
565 | "High frequency word: 違 42\n",
566 | "High frequency word: やつ 42\n",
567 | "High frequency word: ふも 42\n",
568 | "High frequency word: 子供 42\n",
569 | "High frequency word: 神 42\n",
570 | "High frequency word: 命 42\n",
571 | "High frequency word: 聞え 42\n",
572 | "High frequency word: 行き 42\n",
573 | "High frequency word: 婆 42\n",
574 | "High frequency word: あろ 42\n",
575 | "High frequency word: 少女 42\n",
576 | "High frequency word: 思わ 42\n",
577 | "High frequency word: わから 42\n",
578 | "High frequency word: ほとんど 42\n",
579 | "High frequency word: られる 42\n",
580 | "High frequency word: 様子 42\n",
581 | "High frequency word: 数馬 42\n",
582 | "High frequency word: 乙彦 42\n",
583 | "High frequency word: つき 41\n",
584 | "High frequency word: かみ 41\n",
585 | "High frequency word: 火 41\n",
586 | "High frequency word: 水準 41\n",
587 | "High frequency word: 歳 41\n",
588 | "High frequency word: 金 41\n",
589 | "High frequency word: はじめ 41\n",
590 | "High frequency word: 相手 40\n",
591 | "High frequency word: 名 40\n",
592 | "High frequency word: 書い 40\n",
593 | "High frequency word: 昔 40\n",
594 | "High frequency word: 今日 40\n",
595 | "High frequency word: 伊織 40\n",
596 | "High frequency word: なんて 40\n",
597 | "High frequency word: 例 39\n",
598 | "High frequency word: 微笑 39\n",
599 | "High frequency word: 円 39\n",
600 | "High frequency word: しか 39\n",
601 | "High frequency word: 遠藤 39\n",
602 | "High frequency word: ましょ 39\n",
603 | "High frequency word: 妹 39\n",
604 | "High frequency word: たく 39\n",
605 | "High frequency word: 生活 38\n",
606 | "High frequency word: ゆ 38\n",
607 | "High frequency word: 唯 38\n",
608 | "High frequency word: 信じ 38\n"
609 | ]
610 | }
611 | ],
612 | "source": [
613 | "sorted_stop = sorted(stop_data.items(), key=lambda x:x[1], reverse=True)\n",
614 | "\n",
615 | "print(len(sorted_stop))\n",
616 | "\n",
617 | "freq_num = int(len(sorted_stop)*0.03)\n",
618 | "n = 0\n",
619 | "stop_words = []\n",
620 | "print(freq_num)\n",
621 | "for data in sorted_stop:\n",
622 | " stop_words.append(str(data[0]))\n",
623 | " print('High frequency word: ',str(data[0]), str(data[1]))\n",
624 | " n+= 1\n",
625 | " if n > freq_num:\n",
626 | " break\n",
627 | "\n",
628 | "# 作成したストップワードの辞書の保存\n",
629 | "with open('./origin_stopwords.txt', 'w') as f:\n",
630 | " f.write('\\n'.join(stop_words))"
631 | ]
632 | },
633 | {
634 | "cell_type": "code",
635 | "execution_count": 7,
636 | "metadata": {
637 | "collapsed": true
638 | },
639 | "outputs": [],
640 | "source": [
641 | "def stopword_bydic(text):\n",
642 | " \"\"\"\n",
643 | " 辞書によるストップワードの除去\n",
644 | " \"\"\"\n",
645 | " # 読み込むストップワード辞書の指定。\n",
646 | " with open('./origin_stopwords.txt') as f:\n",
647 | " data = f.read()\n",
648 | " stopwords = data.split('\\n')\n",
649 | " lines = []\n",
650 | " for line in text:\n",
651 | " words = []\n",
652 | " for word in line:\n",
653 | " if word not in stopwords:\n",
654 | " words.append(word) \n",
655 | " lines.append(words)\n",
656 | " return lines"
657 | ]
658 | },
659 | {
660 | "cell_type": "code",
661 | "execution_count": 8,
662 | "metadata": {},
663 | "outputs": [
664 | {
665 | "name": "stdout",
666 | "output_type": "stream",
667 | "text": [
668 | "sum_lines: 8876\n",
669 | "sum_words: 13489\n"
670 | ]
671 | }
672 | ],
673 | "source": [
674 | "sum_lines = len(stopword_bydic(cleaned_data))\n",
675 | "sum_words = []\n",
676 | "for line in stopword_bydic(cleaned_data):\n",
677 | " for word in line:\n",
678 | " if word not in sum_words:\n",
679 | " sum_words.append(word)\n",
680 | "print('sum_lines: ', sum_lines)\n",
681 | "print('sum_words: ', len(sum_words))\n",
682 | "with open('origin_words.txt', 'w') as f:\n",
683 | " f.write('\\n'.join(sum_words))\n",
684 | "cleaned_data = []\n",
685 | "for author, data in authors.items():\n",
686 | " data = stopword_bydic(data)\n",
687 | " for line in data:\n",
688 | " #if len(line) > 2:\n",
689 | " cleaned_data.append(author+','+' '.join(line))"
690 | ]
691 | },
692 | {
693 | "cell_type": "code",
694 | "execution_count": 9,
695 | "metadata": {
696 | "collapsed": true
697 | },
698 | "outputs": [],
699 | "source": [
700 | "# 作成したコーパスの保存\n",
701 | "with open('./dataset/corpus.csv', 'w') as f:\n",
702 | " f.write(''.join(cleaned_data))"
703 | ]
704 | }
705 | ],
706 | "metadata": {
707 | "kernelspec": {
708 | "display_name": "Python 3",
709 | "language": "python",
710 | "name": "python3"
711 | },
712 | "language_info": {
713 | "codemirror_mode": {
714 | "name": "ipython",
715 | "version": 3
716 | },
717 | "file_extension": ".py",
718 | "mimetype": "text/x-python",
719 | "name": "python",
720 | "nbconvert_exporter": "python",
721 | "pygments_lexer": "ipython3",
722 | "version": "3.6.1"
723 | }
724 | },
725 | "nbformat": 4,
726 | "nbformat_minor": 2
727 | }
728 |
--------------------------------------------------------------------------------
/01_regression/main.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
13 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n"
14 | ]
15 | },
16 | {
17 | "data": {
18 | "text/plain": [
19 | "'%.3f'"
20 | ]
21 | },
22 | "execution_count": 1,
23 | "metadata": {},
24 | "output_type": "execute_result"
25 | }
26 | ],
27 | "source": [
28 | "# データ加工モジュール\n",
29 | "import numpy as np\n",
30 | "from pandas import DataFrame\n",
31 | "\n",
32 | "# データ可視化モジュール\n",
33 | "import matplotlib.pyplot as plt\n",
34 | "%matplotlib inline\n",
35 | "\n",
36 | "# 機械学習モジュール\n",
37 | "from sklearn import linear_model\n",
38 | "from sklearn.datasets import load_boston\n",
39 | "from sklearn.cross_validation import train_test_split\n",
40 | "from sklearn.metrics import mean_squared_error\n",
41 | "\n",
42 | "# 小数第3まで表示\n",
43 | "%precision 3"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 2,
49 | "metadata": {
50 | "collapsed": true
51 | },
52 | "outputs": [],
53 | "source": [
54 | "## データの用意\n",
55 | "# ボストンデータをインポート\n",
56 | "boston = load_boston()\n",
57 | "\n",
58 | "# 説明変数たちをDataFrameへ変換\n",
59 | "df = DataFrame(boston.data, columns = boston.feature_names)\n",
60 | "\n",
61 | "# 目的変数をDataFrameへ追加\n",
62 | "df['MEDV'] = np.array(boston.target)"
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 3,
68 | "metadata": {},
69 | "outputs": [
70 | {
71 | "data": {
72 | "text/html": [
73 | "
\n",
74 | "\n",
87 | "
\n",
88 | " \n",
89 | " \n",
90 | " | \n",
91 | " CRIM | \n",
92 | " ZN | \n",
93 | " INDUS | \n",
94 | " CHAS | \n",
95 | " NOX | \n",
96 | " RM | \n",
97 | " AGE | \n",
98 | " DIS | \n",
99 | " RAD | \n",
100 | " TAX | \n",
101 | " PTRATIO | \n",
102 | " B | \n",
103 | " LSTAT | \n",
104 | " MEDV | \n",
105 | "
\n",
106 | " \n",
107 | " \n",
108 | " \n",
109 | " | 0 | \n",
110 | " 0.00632 | \n",
111 | " 18.0 | \n",
112 | " 2.31 | \n",
113 | " 0.0 | \n",
114 | " 0.538 | \n",
115 | " 6.575 | \n",
116 | " 65.2 | \n",
117 | " 4.0900 | \n",
118 | " 1.0 | \n",
119 | " 296.0 | \n",
120 | " 15.3 | \n",
121 | " 396.90 | \n",
122 | " 4.98 | \n",
123 | " 24.0 | \n",
124 | "
\n",
125 | " \n",
126 | " | 1 | \n",
127 | " 0.02731 | \n",
128 | " 0.0 | \n",
129 | " 7.07 | \n",
130 | " 0.0 | \n",
131 | " 0.469 | \n",
132 | " 6.421 | \n",
133 | " 78.9 | \n",
134 | " 4.9671 | \n",
135 | " 2.0 | \n",
136 | " 242.0 | \n",
137 | " 17.8 | \n",
138 | " 396.90 | \n",
139 | " 9.14 | \n",
140 | " 21.6 | \n",
141 | "
\n",
142 | " \n",
143 | " | 2 | \n",
144 | " 0.02729 | \n",
145 | " 0.0 | \n",
146 | " 7.07 | \n",
147 | " 0.0 | \n",
148 | " 0.469 | \n",
149 | " 7.185 | \n",
150 | " 61.1 | \n",
151 | " 4.9671 | \n",
152 | " 2.0 | \n",
153 | " 242.0 | \n",
154 | " 17.8 | \n",
155 | " 392.83 | \n",
156 | " 4.03 | \n",
157 | " 34.7 | \n",
158 | "
\n",
159 | " \n",
160 | " | 3 | \n",
161 | " 0.03237 | \n",
162 | " 0.0 | \n",
163 | " 2.18 | \n",
164 | " 0.0 | \n",
165 | " 0.458 | \n",
166 | " 6.998 | \n",
167 | " 45.8 | \n",
168 | " 6.0622 | \n",
169 | " 3.0 | \n",
170 | " 222.0 | \n",
171 | " 18.7 | \n",
172 | " 394.63 | \n",
173 | " 2.94 | \n",
174 | " 33.4 | \n",
175 | "
\n",
176 | " \n",
177 | " | 4 | \n",
178 | " 0.06905 | \n",
179 | " 0.0 | \n",
180 | " 2.18 | \n",
181 | " 0.0 | \n",
182 | " 0.458 | \n",
183 | " 7.147 | \n",
184 | " 54.2 | \n",
185 | " 6.0622 | \n",
186 | " 3.0 | \n",
187 | " 222.0 | \n",
188 | " 18.7 | \n",
189 | " 396.90 | \n",
190 | " 5.33 | \n",
191 | " 36.2 | \n",
192 | "
\n",
193 | " \n",
194 | "
\n",
195 | "
"
196 | ],
197 | "text/plain": [
198 | " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n",
199 | "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n",
200 | "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n",
201 | "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n",
202 | "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n",
203 | "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n",
204 | "\n",
205 | " PTRATIO B LSTAT MEDV \n",
206 | "0 15.3 396.90 4.98 24.0 \n",
207 | "1 17.8 396.90 9.14 21.6 \n",
208 | "2 17.8 392.83 4.03 34.7 \n",
209 | "3 18.7 394.63 2.94 33.4 \n",
210 | "4 18.7 396.90 5.33 36.2 "
211 | ]
212 | },
213 | "execution_count": 3,
214 | "metadata": {},
215 | "output_type": "execute_result"
216 | }
217 | ],
218 | "source": [
219 | "# 最初の5行を表示\n",
220 | "df.head()"
221 | ]
222 | },
223 | {
224 | "cell_type": "code",
225 | "execution_count": 4,
226 | "metadata": {},
227 | "outputs": [
228 | {
229 | "data": {
230 | "text/plain": [
231 | "Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,\n",
232 | " normalize=False, random_state=None, solver='auto', tol=0.001)"
233 | ]
234 | },
235 | "execution_count": 4,
236 | "metadata": {},
237 | "output_type": "execute_result"
238 | }
239 | ],
240 | "source": [
241 | "# オブジェクト生成\n",
242 | "model = linear_model.Ridge()\n",
243 | "\n",
244 | "# fit関数でパラメータ推定\n",
245 | "model.fit(boston.data,boston.target)"
246 | ]
247 | },
248 | {
249 | "cell_type": "code",
250 | "execution_count": 5,
251 | "metadata": {},
252 | "outputs": [
253 | {
254 | "name": "stdout",
255 | "output_type": "stream",
256 | "text": [
257 | "[ -1.036e-01 4.741e-02 -8.547e-03 2.554e+00 -1.079e+01 3.849e+00\n",
258 | " -5.368e-03 -1.373e+00 2.896e-01 -1.291e-02 -8.766e-01 9.754e-03\n",
259 | " -5.341e-01]\n",
260 | "31.6186044111\n"
261 | ]
262 | }
263 | ],
264 | "source": [
265 | "# 回帰係数を出力\n",
266 | "print(model.coef_)\n",
267 | "print(model.intercept_)"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": 6,
273 | "metadata": {
274 | "collapsed": true
275 | },
276 | "outputs": [],
277 | "source": [
278 | "# 75%を学習用、25%を検証用データにするよう分割\n",
279 | "X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size = 0.25, random_state = 100)\n",
280 | "\n",
281 | "# 学習用データでパラメータ推定\n",
282 | "model.fit(X_train, y_train)\n",
283 | "\n",
284 | "# 作成したモデルから予測(学習用、検証用モデル使用)\n",
285 | "y_train_pred = model.predict(X_train)\n",
286 | "y_test_pred = model.predict(X_test)"
287 | ]
288 | },
289 | {
290 | "cell_type": "code",
291 | "execution_count": 7,
292 | "metadata": {},
293 | "outputs": [
294 | {
295 | "data": {
296 | "image/png": "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\nP9q1qdK/tsi/AAAAAElFTkSuQmCC\n",
297 | "text/plain": [
298 | ""
299 | ]
300 | },
301 | "metadata": {},
302 | "output_type": "display_data"
303 | }
304 | ],
305 | "source": [
306 | "# 学習用、検証用それぞれで残差をプロット\n",
307 | "plt.scatter(y_train_pred, y_train_pred - y_train, c = 'gray', marker = 'o', label = 'Train Data')\n",
308 | "plt.scatter(y_test_pred, y_test_pred - y_test, c = 'blue', marker = 's', label = 'Test Data')\n",
309 | "plt.xlabel('Predicted Values')\n",
310 | "plt.ylabel('Residuals')\n",
311 | "\n",
312 | "# 凡例を左上に表示\n",
313 | "plt.legend(loc = 'upper left')\n",
314 | "\n",
315 | "# y = 0に直線を引く\n",
316 | "plt.hlines(y = 0, xmin = -10, xmax = 50, lw = 2, color = 'black')\n",
317 | "plt.xlim([0, 50])\n",
318 | "plt.show()"
319 | ]
320 | },
321 | {
322 | "cell_type": "code",
323 | "execution_count": 8,
324 | "metadata": {},
325 | "outputs": [
326 | {
327 | "name": "stdout",
328 | "output_type": "stream",
329 | "text": [
330 | "MSE Train : 20.636, Test : 27.987\n",
331 | "R^2 Train : 0.741, Test : 0.716\n"
332 | ]
333 | }
334 | ],
335 | "source": [
336 | "# 学習用、検証用データに関して平均二乗誤差を出力\n",
337 | "print('MSE Train : %.3f, Test : %.3f' % (mean_squared_error(y_train, y_train_pred), mean_squared_error(y_test, y_test_pred)))\n",
338 | "\n",
339 | "# 学習用、検証用データに関してR^2を出力\n",
340 | "print('R^2 Train : %.3f, Test : %.3f' % (model.score(X_train, y_train), model.score(X_test, y_test)))"
341 | ]
342 | },
343 | {
344 | "cell_type": "markdown",
345 | "metadata": {},
346 | "source": [
347 | "## 参考\n",
348 | "- http://tekenuko.hatenablog.com/entry/2016/09/19/151547"
349 | ]
350 | }
351 | ],
352 | "metadata": {
353 | "kernelspec": {
354 | "display_name": "Python 3",
355 | "language": "python",
356 | "name": "python3"
357 | },
358 | "language_info": {
359 | "codemirror_mode": {
360 | "name": "ipython",
361 | "version": 3
362 | },
363 | "file_extension": ".py",
364 | "mimetype": "text/x-python",
365 | "name": "python",
366 | "nbconvert_exporter": "python",
367 | "pygments_lexer": "ipython3",
368 | "version": "3.6.1"
369 | }
370 | },
371 | "nbformat": 4,
372 | "nbformat_minor": 2
373 | }
374 |
--------------------------------------------------------------------------------
/03_deeplearning/main.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "Using TensorFlow backend.\n"
13 | ]
14 | }
15 | ],
16 | "source": [
17 | "import keras\n",
18 | "from keras.datasets import mnist\n",
19 | "from keras.models import Sequential\n",
20 | "from keras.layers import Dense, Dropout, Activation\n",
21 | "from keras.optimizers import RMSprop\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "from keras.layers.normalization import BatchNormalization\n",
24 | "import h5py\n",
25 | "%matplotlib inline"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 12,
31 | "metadata": {
32 | "collapsed": true
33 | },
34 | "outputs": [],
35 | "source": [
36 | "# 自分で設定するパラメータ\n",
37 | "\n",
38 | "# バッチサイズ\n",
39 | "batch_size = 2000\n",
40 | "\n",
41 | "# エポック数\n",
42 | "epochs = 100"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 13,
48 | "metadata": {},
49 | "outputs": [
50 | {
51 | "name": "stdout",
52 | "output_type": "stream",
53 | "text": [
54 | "60000 train samples\n",
55 | "10000 test samples\n"
56 | ]
57 | }
58 | ],
59 | "source": [
60 | "# データ抽出\n",
61 | "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
62 | "num_classes = 10\n",
63 | "x_train = x_train.reshape(60000, 784)\n",
64 | "x_test = x_test.reshape(10000, 784)\n",
65 | "x_train = x_train.astype('float32')\n",
66 | "x_test = x_test.astype('float32')\n",
67 | "x_train /= 255\n",
68 | "x_test /= 255\n",
69 | "print(x_train.shape[0], 'train samples')\n",
70 | "print(x_test.shape[0], 'test samples')\n",
71 | "\n",
72 | "# one-hot-label に変換\n",
73 | "y_train = keras.utils.to_categorical(y_train, num_classes)\n",
74 | "y_test = keras.utils.to_categorical(y_test, num_classes)"
75 | ]
76 | },
77 | {
78 | "cell_type": "code",
79 | "execution_count": 14,
80 | "metadata": {},
81 | "outputs": [
82 | {
83 | "name": "stdout",
84 | "output_type": "stream",
85 | "text": [
86 | "_________________________________________________________________\n",
87 | "Layer (type) Output Shape Param # \n",
88 | "=================================================================\n",
89 | "dense_13 (Dense) (None, 256) 200960 \n",
90 | "_________________________________________________________________\n",
91 | "dropout_10 (Dropout) (None, 256) 0 \n",
92 | "_________________________________________________________________\n",
93 | "dense_14 (Dense) (None, 128) 32896 \n",
94 | "_________________________________________________________________\n",
95 | "dropout_11 (Dropout) (None, 128) 0 \n",
96 | "_________________________________________________________________\n",
97 | "dense_15 (Dense) (None, 32) 4128 \n",
98 | "_________________________________________________________________\n",
99 | "dropout_12 (Dropout) (None, 32) 0 \n",
100 | "_________________________________________________________________\n",
101 | "dense_16 (Dense) (None, 10) 330 \n",
102 | "=================================================================\n",
103 | "Total params: 238,314\n",
104 | "Trainable params: 238,314\n",
105 | "Non-trainable params: 0\n",
106 | "_________________________________________________________________\n",
107 | "Train on 60000 samples, validate on 10000 samples\n",
108 | "Epoch 1/100\n",
109 | "60000/60000 [==============================] - 3s - loss: 2.3037 - acc: 0.1137 - val_loss: 2.2390 - val_acc: 0.1884\n",
110 | "Epoch 2/100\n",
111 | "60000/60000 [==============================] - 2s - loss: 2.2192 - acc: 0.1953 - val_loss: 2.1569 - val_acc: 0.3133\n",
112 | "Epoch 3/100\n",
113 | "60000/60000 [==============================] - 3s - loss: 2.1419 - acc: 0.2774 - val_loss: 2.0593 - val_acc: 0.4337\n",
114 | "Epoch 4/100\n",
115 | "60000/60000 [==============================] - 2s - loss: 2.0491 - acc: 0.3526 - val_loss: 1.9442 - val_acc: 0.5171\n",
116 | "Epoch 5/100\n",
117 | "60000/60000 [==============================] - 2s - loss: 1.9424 - acc: 0.4110 - val_loss: 1.8132 - val_acc: 0.5709\n",
118 | "Epoch 6/100\n",
119 | "60000/60000 [==============================] - 2s - loss: 1.8188 - acc: 0.4602 - val_loss: 1.6671 - val_acc: 0.6097\n",
120 | "Epoch 7/100\n",
121 | "60000/60000 [==============================] - 2s - loss: 1.6907 - acc: 0.4972 - val_loss: 1.5153 - val_acc: 0.6413\n",
122 | "Epoch 8/100\n",
123 | "60000/60000 [==============================] - 3s - loss: 1.5586 - acc: 0.5343 - val_loss: 1.3651 - val_acc: 0.6757\n",
124 | "Epoch 9/100\n",
125 | "60000/60000 [==============================] - 2s - loss: 1.4318 - acc: 0.5740 - val_loss: 1.2247 - val_acc: 0.7154\n",
126 | "Epoch 10/100\n",
127 | "60000/60000 [==============================] - 3s - loss: 1.3129 - acc: 0.6179 - val_loss: 1.0978 - val_acc: 0.7594\n",
128 | "Epoch 11/100\n",
129 | "60000/60000 [==============================] - 2s - loss: 1.2095 - acc: 0.6531 - val_loss: 0.9866 - val_acc: 0.7998\n",
130 | "Epoch 12/100\n",
131 | "60000/60000 [==============================] - 3s - loss: 1.1219 - acc: 0.6824 - val_loss: 0.8917 - val_acc: 0.8215\n",
132 | "Epoch 13/100\n",
133 | "60000/60000 [==============================] - 3s - loss: 1.0375 - acc: 0.7072 - val_loss: 0.8123 - val_acc: 0.8341\n",
134 | "Epoch 14/100\n",
135 | "60000/60000 [==============================] - 3s - loss: 0.9706 - acc: 0.7252 - val_loss: 0.7466 - val_acc: 0.8422\n",
136 | "Epoch 15/100\n",
137 | "60000/60000 [==============================] - 3s - loss: 0.9147 - acc: 0.7389 - val_loss: 0.6929 - val_acc: 0.8498\n",
138 | "Epoch 16/100\n",
139 | "60000/60000 [==============================] - 2s - loss: 0.8620 - acc: 0.7512 - val_loss: 0.6486 - val_acc: 0.8563\n",
140 | "Epoch 17/100\n",
141 | "60000/60000 [==============================] - 2s - loss: 0.8248 - acc: 0.7622 - val_loss: 0.6125 - val_acc: 0.8603\n",
142 | "Epoch 18/100\n",
143 | "60000/60000 [==============================] - 2s - loss: 0.7890 - acc: 0.7696 - val_loss: 0.5827 - val_acc: 0.8648\n",
144 | "Epoch 19/100\n",
145 | "60000/60000 [==============================] - 2s - loss: 0.7600 - acc: 0.7771 - val_loss: 0.5573 - val_acc: 0.8672\n",
146 | "Epoch 20/100\n",
147 | "60000/60000 [==============================] - 2s - loss: 0.7340 - acc: 0.7840 - val_loss: 0.5358 - val_acc: 0.8707\n",
148 | "Epoch 21/100\n",
149 | "60000/60000 [==============================] - 2s - loss: 0.7081 - acc: 0.7901 - val_loss: 0.5174 - val_acc: 0.8731\n",
150 | "Epoch 22/100\n",
151 | "60000/60000 [==============================] - 2s - loss: 0.6886 - acc: 0.7968 - val_loss: 0.5013 - val_acc: 0.8759\n",
152 | "Epoch 23/100\n",
153 | "60000/60000 [==============================] - 3s - loss: 0.6724 - acc: 0.7987 - val_loss: 0.4873 - val_acc: 0.8776\n",
154 | "Epoch 24/100\n",
155 | "60000/60000 [==============================] - 3s - loss: 0.6543 - acc: 0.8063 - val_loss: 0.4750 - val_acc: 0.8795\n",
156 | "Epoch 25/100\n",
157 | "60000/60000 [==============================] - 2s - loss: 0.6406 - acc: 0.8091 - val_loss: 0.4637 - val_acc: 0.8817\n",
158 | "Epoch 26/100\n",
159 | "60000/60000 [==============================] - 2s - loss: 0.6272 - acc: 0.8146 - val_loss: 0.4535 - val_acc: 0.8825\n",
160 | "Epoch 27/100\n",
161 | "60000/60000 [==============================] - 2s - loss: 0.6170 - acc: 0.8157 - val_loss: 0.4448 - val_acc: 0.8842\n",
162 | "Epoch 28/100\n",
163 | "60000/60000 [==============================] - 4s - loss: 0.6074 - acc: 0.8184 - val_loss: 0.4369 - val_acc: 0.8857\n",
164 | "Epoch 29/100\n",
165 | "60000/60000 [==============================] - 4s - loss: 0.5901 - acc: 0.8231 - val_loss: 0.4285 - val_acc: 0.8870\n",
166 | "Epoch 30/100\n",
167 | "60000/60000 [==============================] - 3s - loss: 0.5858 - acc: 0.8264 - val_loss: 0.4214 - val_acc: 0.8877\n",
168 | "Epoch 31/100\n",
169 | "60000/60000 [==============================] - 3s - loss: 0.5721 - acc: 0.8304 - val_loss: 0.4149 - val_acc: 0.8897\n",
170 | "Epoch 32/100\n",
171 | "60000/60000 [==============================] - 3s - loss: 0.5651 - acc: 0.8323 - val_loss: 0.4087 - val_acc: 0.8912\n",
172 | "Epoch 33/100\n",
173 | "60000/60000 [==============================] - 3s - loss: 0.5565 - acc: 0.8348 - val_loss: 0.4027 - val_acc: 0.8927\n",
174 | "Epoch 34/100\n",
175 | "60000/60000 [==============================] - 2s - loss: 0.5497 - acc: 0.8352 - val_loss: 0.3976 - val_acc: 0.8943\n",
176 | "Epoch 35/100\n",
177 | "60000/60000 [==============================] - 2s - loss: 0.5397 - acc: 0.8406 - val_loss: 0.3925 - val_acc: 0.8957\n",
178 | "Epoch 36/100\n",
179 | "60000/60000 [==============================] - 2s - loss: 0.5346 - acc: 0.8412 - val_loss: 0.3877 - val_acc: 0.8962\n",
180 | "Epoch 37/100\n",
181 | "60000/60000 [==============================] - 3s - loss: 0.5304 - acc: 0.8414 - val_loss: 0.3833 - val_acc: 0.8966\n",
182 | "Epoch 38/100\n",
183 | "60000/60000 [==============================] - 3s - loss: 0.5187 - acc: 0.8461 - val_loss: 0.3784 - val_acc: 0.8973\n",
184 | "Epoch 39/100\n",
185 | "60000/60000 [==============================] - 3s - loss: 0.5179 - acc: 0.8471 - val_loss: 0.3745 - val_acc: 0.8979\n",
186 | "Epoch 40/100\n",
187 | "60000/60000 [==============================] - 3s - loss: 0.5104 - acc: 0.8473 - val_loss: 0.3702 - val_acc: 0.8991\n",
188 | "Epoch 41/100\n",
189 | "60000/60000 [==============================] - 4s - loss: 0.5043 - acc: 0.8510 - val_loss: 0.3665 - val_acc: 0.9001\n",
190 | "Epoch 42/100\n",
191 | "60000/60000 [==============================] - 3s - loss: 0.4986 - acc: 0.8515 - val_loss: 0.3630 - val_acc: 0.9015\n",
192 | "Epoch 43/100\n",
193 | "60000/60000 [==============================] - 3s - loss: 0.4922 - acc: 0.8528 - val_loss: 0.3593 - val_acc: 0.9020\n",
194 | "Epoch 44/100\n",
195 | "60000/60000 [==============================] - 3s - loss: 0.4904 - acc: 0.8540 - val_loss: 0.3560 - val_acc: 0.9034\n",
196 | "Epoch 45/100\n",
197 | "60000/60000 [==============================] - 3s - loss: 0.4857 - acc: 0.8574 - val_loss: 0.3530 - val_acc: 0.9037\n",
198 | "Epoch 46/100\n",
199 | "60000/60000 [==============================] - 3s - loss: 0.4805 - acc: 0.8574 - val_loss: 0.3495 - val_acc: 0.9047\n",
200 | "Epoch 47/100\n",
201 | "60000/60000 [==============================] - 2s - loss: 0.4769 - acc: 0.8597 - val_loss: 0.3465 - val_acc: 0.9055\n",
202 | "Epoch 48/100\n",
203 | "60000/60000 [==============================] - 3s - loss: 0.4736 - acc: 0.8613 - val_loss: 0.3433 - val_acc: 0.9068\n",
204 | "Epoch 49/100\n",
205 | "60000/60000 [==============================] - 2s - loss: 0.4693 - acc: 0.8607 - val_loss: 0.3410 - val_acc: 0.9076\n",
206 | "Epoch 50/100\n",
207 | "60000/60000 [==============================] - 2s - loss: 0.4637 - acc: 0.8632 - val_loss: 0.3379 - val_acc: 0.9080\n",
208 | "Epoch 51/100\n",
209 | "60000/60000 [==============================] - 2s - loss: 0.4599 - acc: 0.8649 - val_loss: 0.3354 - val_acc: 0.9085\n",
210 | "Epoch 52/100\n",
211 | "60000/60000 [==============================] - 2s - loss: 0.4551 - acc: 0.8644 - val_loss: 0.3326 - val_acc: 0.9100\n",
212 | "Epoch 53/100\n",
213 | "60000/60000 [==============================] - 2s - loss: 0.4523 - acc: 0.8660 - val_loss: 0.3301 - val_acc: 0.9104\n",
214 | "Epoch 54/100\n"
215 | ]
216 | },
217 | {
218 | "name": "stdout",
219 | "output_type": "stream",
220 | "text": [
221 | "60000/60000 [==============================] - 2s - loss: 0.4482 - acc: 0.8670 - val_loss: 0.3275 - val_acc: 0.9109\n",
222 | "Epoch 55/100\n",
223 | "60000/60000 [==============================] - 2s - loss: 0.4431 - acc: 0.8698 - val_loss: 0.3251 - val_acc: 0.9113\n",
224 | "Epoch 56/100\n",
225 | "60000/60000 [==============================] - 2s - loss: 0.4428 - acc: 0.8684 - val_loss: 0.3228 - val_acc: 0.9114\n",
226 | "Epoch 57/100\n",
227 | "60000/60000 [==============================] - 2s - loss: 0.4383 - acc: 0.8708 - val_loss: 0.3203 - val_acc: 0.9119\n",
228 | "Epoch 58/100\n",
229 | "60000/60000 [==============================] - 2s - loss: 0.4346 - acc: 0.8714 - val_loss: 0.3179 - val_acc: 0.9123\n",
230 | "Epoch 59/100\n",
231 | "60000/60000 [==============================] - 2s - loss: 0.4306 - acc: 0.8732 - val_loss: 0.3160 - val_acc: 0.9134\n",
232 | "Epoch 60/100\n",
233 | "60000/60000 [==============================] - 2s - loss: 0.4279 - acc: 0.8747 - val_loss: 0.3134 - val_acc: 0.9136\n",
234 | "Epoch 61/100\n",
235 | "60000/60000 [==============================] - 2s - loss: 0.4225 - acc: 0.8756 - val_loss: 0.3115 - val_acc: 0.9139\n",
236 | "Epoch 62/100\n",
237 | "60000/60000 [==============================] - 2s - loss: 0.4179 - acc: 0.8768 - val_loss: 0.3090 - val_acc: 0.9141\n",
238 | "Epoch 63/100\n",
239 | "60000/60000 [==============================] - 3s - loss: 0.4195 - acc: 0.8759 - val_loss: 0.3073 - val_acc: 0.9150\n",
240 | "Epoch 64/100\n",
241 | "60000/60000 [==============================] - 2s - loss: 0.4156 - acc: 0.8778 - val_loss: 0.3050 - val_acc: 0.9151\n",
242 | "Epoch 65/100\n",
243 | "60000/60000 [==============================] - 2s - loss: 0.4097 - acc: 0.8807 - val_loss: 0.3030 - val_acc: 0.9155\n",
244 | "Epoch 66/100\n",
245 | "60000/60000 [==============================] - 2s - loss: 0.4088 - acc: 0.8799 - val_loss: 0.3010 - val_acc: 0.9164\n",
246 | "Epoch 67/100\n",
247 | "60000/60000 [==============================] - 2s - loss: 0.4079 - acc: 0.8797 - val_loss: 0.2993 - val_acc: 0.9171\n",
248 | "Epoch 68/100\n",
249 | "60000/60000 [==============================] - 2s - loss: 0.4034 - acc: 0.8830 - val_loss: 0.2974 - val_acc: 0.9176\n",
250 | "Epoch 69/100\n",
251 | "60000/60000 [==============================] - 2s - loss: 0.4015 - acc: 0.8809 - val_loss: 0.2955 - val_acc: 0.9182\n",
252 | "Epoch 70/100\n",
253 | "60000/60000 [==============================] - 2s - loss: 0.4026 - acc: 0.8817 - val_loss: 0.2938 - val_acc: 0.9185\n",
254 | "Epoch 71/100\n",
255 | "60000/60000 [==============================] - 2s - loss: 0.3967 - acc: 0.8821 - val_loss: 0.2918 - val_acc: 0.9196\n",
256 | "Epoch 72/100\n",
257 | "60000/60000 [==============================] - 2s - loss: 0.3966 - acc: 0.8842 - val_loss: 0.2903 - val_acc: 0.9196\n",
258 | "Epoch 73/100\n",
259 | "60000/60000 [==============================] - 2s - loss: 0.3940 - acc: 0.8840 - val_loss: 0.2887 - val_acc: 0.9197\n",
260 | "Epoch 74/100\n",
261 | "60000/60000 [==============================] - 2s - loss: 0.3898 - acc: 0.8874 - val_loss: 0.2871 - val_acc: 0.9201\n",
262 | "Epoch 75/100\n",
263 | "60000/60000 [==============================] - 2s - loss: 0.3882 - acc: 0.8868 - val_loss: 0.2854 - val_acc: 0.9203\n",
264 | "Epoch 76/100\n",
265 | "60000/60000 [==============================] - 2s - loss: 0.3859 - acc: 0.8864 - val_loss: 0.2839 - val_acc: 0.9209\n",
266 | "Epoch 77/100\n",
267 | "60000/60000 [==============================] - 2s - loss: 0.3841 - acc: 0.8875 - val_loss: 0.2821 - val_acc: 0.9210\n",
268 | "Epoch 78/100\n",
269 | "60000/60000 [==============================] - 2s - loss: 0.3819 - acc: 0.8879 - val_loss: 0.2807 - val_acc: 0.9212\n",
270 | "Epoch 79/100\n",
271 | "60000/60000 [==============================] - 2s - loss: 0.3809 - acc: 0.8886 - val_loss: 0.2790 - val_acc: 0.9215\n",
272 | "Epoch 80/100\n",
273 | "60000/60000 [==============================] - 2s - loss: 0.3749 - acc: 0.8903 - val_loss: 0.2774 - val_acc: 0.9216\n",
274 | "Epoch 81/100\n",
275 | "60000/60000 [==============================] - 2s - loss: 0.3738 - acc: 0.8895 - val_loss: 0.2756 - val_acc: 0.9217\n",
276 | "Epoch 82/100\n",
277 | "60000/60000 [==============================] - 2s - loss: 0.3726 - acc: 0.8922 - val_loss: 0.2745 - val_acc: 0.9224\n",
278 | "Epoch 83/100\n",
279 | "60000/60000 [==============================] - 2s - loss: 0.3693 - acc: 0.8926 - val_loss: 0.2728 - val_acc: 0.9231\n",
280 | "Epoch 84/100\n",
281 | "60000/60000 [==============================] - 2s - loss: 0.3695 - acc: 0.8919 - val_loss: 0.2715 - val_acc: 0.9226\n",
282 | "Epoch 85/100\n",
283 | "60000/60000 [==============================] - 2s - loss: 0.3659 - acc: 0.8923 - val_loss: 0.2698 - val_acc: 0.9230\n",
284 | "Epoch 86/100\n",
285 | "60000/60000 [==============================] - 2s - loss: 0.3661 - acc: 0.8899 - val_loss: 0.2684 - val_acc: 0.9238\n",
286 | "Epoch 87/100\n",
287 | "60000/60000 [==============================] - 3s - loss: 0.3636 - acc: 0.8918 - val_loss: 0.2671 - val_acc: 0.9236\n",
288 | "Epoch 88/100\n",
289 | "60000/60000 [==============================] - 2s - loss: 0.3605 - acc: 0.8945 - val_loss: 0.2656 - val_acc: 0.9242\n",
290 | "Epoch 89/100\n",
291 | "60000/60000 [==============================] - 2s - loss: 0.3591 - acc: 0.8952 - val_loss: 0.2644 - val_acc: 0.9244\n",
292 | "Epoch 90/100\n",
293 | "60000/60000 [==============================] - 2s - loss: 0.3583 - acc: 0.8953 - val_loss: 0.2631 - val_acc: 0.9247\n",
294 | "Epoch 91/100\n",
295 | "60000/60000 [==============================] - 2s - loss: 0.3550 - acc: 0.8963 - val_loss: 0.2618 - val_acc: 0.9259\n",
296 | "Epoch 92/100\n",
297 | "60000/60000 [==============================] - 3s - loss: 0.3526 - acc: 0.8971 - val_loss: 0.2602 - val_acc: 0.9260\n",
298 | "Epoch 93/100\n",
299 | "60000/60000 [==============================] - 2s - loss: 0.3517 - acc: 0.8982 - val_loss: 0.2591 - val_acc: 0.9263\n",
300 | "Epoch 94/100\n",
301 | "60000/60000 [==============================] - 2s - loss: 0.3497 - acc: 0.8968 - val_loss: 0.2578 - val_acc: 0.9271\n",
302 | "Epoch 95/100\n",
303 | "60000/60000 [==============================] - 2s - loss: 0.3455 - acc: 0.8994 - val_loss: 0.2562 - val_acc: 0.9272\n",
304 | "Epoch 96/100\n",
305 | "60000/60000 [==============================] - 2s - loss: 0.3444 - acc: 0.8993 - val_loss: 0.2551 - val_acc: 0.9279\n",
306 | "Epoch 97/100\n",
307 | "60000/60000 [==============================] - 2s - loss: 0.3434 - acc: 0.8992 - val_loss: 0.2539 - val_acc: 0.9282\n",
308 | "Epoch 98/100\n",
309 | "60000/60000 [==============================] - 2s - loss: 0.3438 - acc: 0.8987 - val_loss: 0.2526 - val_acc: 0.9284\n",
310 | "Epoch 99/100\n",
311 | "60000/60000 [==============================] - 2s - loss: 0.3376 - acc: 0.9017 - val_loss: 0.2510 - val_acc: 0.9291\n",
312 | "Epoch 100/100\n",
313 | "60000/60000 [==============================] - 2s - loss: 0.3394 - acc: 0.9009 - val_loss: 0.2499 - val_acc: 0.9291\n",
314 | " 9408/10000 [===========================>..] - ETA: 0sTest loss: 0.24992457343\n",
315 | "Test accuracy: 0.9291\n"
316 | ]
317 | }
318 | ],
319 | "source": [
320 | "# モデルの構築\n",
321 | "model = Sequential()\n",
322 | "\n",
323 | "# 最初の隠れ層(入力784 -> 出力256)\n",
324 | "model.add(Dense(256, activation=\"relu\",input_shape=(784,)))\n",
325 | "model.add(Dropout(0.1))\n",
326 | "\n",
327 | "# 2つ目の隠れ層(256 -> 出力128)\n",
328 | "## 隠れ層は以下の2行をコピペすることで追加できます\n",
329 | "model.add(Dense(128, activation='relu'))\n",
330 | "model.add(Dropout(0.1))\n",
331 | "\n",
332 | "# 3つ目の隠れ層(128 -> 出力32)\n",
333 | "## 隠れ層は以下の2行をコピペすることで追加できます\n",
334 | "model.add(Dense(32, activation='relu'))\n",
335 | "model.add(Dropout(0.1))\n",
336 | "\n",
337 | "# 出力層(入力32 -> 出力10)\n",
338 | "model.add(Dense(10, activation='softmax'))\n",
339 | "\n",
340 | "# モデル概要表示\n",
341 | "model.summary()\n",
342 | "\n",
343 | "# モデルのコンパイル\n",
344 | "model.compile(loss='categorical_crossentropy',\n",
345 | " optimizer='SGD',\n",
346 | " metrics=['accuracy'])\n",
347 | "\n",
348 | "# フィッティング(学習)\n",
349 | "history = model.fit(x_train, y_train,\n",
350 | " batch_size=batch_size,\n",
351 | " epochs=epochs,\n",
352 | " verbose=1,\n",
353 | " validation_data=(x_test, y_test))\n",
354 | "\n",
355 | "# スコアの計算・表示\n",
356 | "score = model.evaluate(x_test, y_test, verbose=1)\n",
357 | "print('Test loss:', score[0])\n",
358 | "print('Test accuracy:', score[1])"
359 | ]
360 | },
361 | {
362 | "cell_type": "code",
363 | "execution_count": 9,
364 | "metadata": {},
365 | "outputs": [
366 | {
367 | "name": "stdout",
368 | "output_type": "stream",
369 | "text": [
370 | "10000/10000 [==============================] - 0s \n"
371 | ]
372 | },
373 | {
374 | "data": {
375 | "text/plain": [
376 | "[0.3218956942975521, 0.90890000000000004]"
377 | ]
378 | },
379 | "execution_count": 9,
380 | "metadata": {},
381 | "output_type": "execute_result"
382 | }
383 | ],
384 | "source": [
385 | "model.evaluate(x_test, y_test, verbose=1)"
386 | ]
387 | },
388 | {
389 | "cell_type": "code",
390 | "execution_count": 10,
391 | "metadata": {},
392 | "outputs": [
393 | {
394 | "data": {
395 | "image/png": "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\n",
396 | "text/plain": [
397 | ""
398 | ]
399 | },
400 | "metadata": {},
401 | "output_type": "display_data"
402 | }
403 | ],
404 | "source": [
405 | "# 学習の様子をプロット\n",
406 | "loss = history.history['loss']\n",
407 | "val_loss = history.history['val_loss']\n",
408 | "\n",
409 | "acc = history.history['acc']\n",
410 | "val_acc = history.history['val_acc']\n",
411 | "\n",
412 | "plt.figure(figsize=(10,10))\n",
413 | "plt.subplot(2,1,1)\n",
414 | "plt.title('Loss')\n",
415 | "epochs = len(loss)\n",
416 | "plt.plot(range(epochs), loss, marker='.', label='loss')\n",
417 | "plt.plot(range(epochs), val_loss, marker='.', label='val_loss')\n",
418 | "plt.legend(loc='best')\n",
419 | "plt.grid()\n",
420 | "plt.xlabel('epoch')\n",
421 | "plt.ylabel('acc')\n",
422 | "\n",
423 | "plt.subplot(2,1,2)\n",
424 | "plt.title('Accuracy')\n",
425 | "plt.plot(range(epochs), acc, marker='.', label='acc')\n",
426 | "plt.plot(range(epochs), val_acc, marker='.', label='val_acc')\n",
427 | "plt.legend(loc='best')\n",
428 | "plt.grid()\n",
429 | "plt.xlabel('epoch')\n",
430 | "plt.ylabel('acc')\n",
431 | "plt.show()"
432 | ]
433 | },
434 | {
435 | "cell_type": "code",
436 | "execution_count": null,
437 | "metadata": {
438 | "collapsed": true
439 | },
440 | "outputs": [],
441 | "source": []
442 | }
443 | ],
444 | "metadata": {
445 | "kernelspec": {
446 | "display_name": "Python 3",
447 | "language": "python",
448 | "name": "python3"
449 | },
450 | "language_info": {
451 | "codemirror_mode": {
452 | "name": "ipython",
453 | "version": 3
454 | },
455 | "file_extension": ".py",
456 | "mimetype": "text/x-python",
457 | "name": "python",
458 | "nbconvert_exporter": "python",
459 | "pygments_lexer": "ipython3",
460 | "version": "3.6.1"
461 | }
462 | },
463 | "nbformat": 4,
464 | "nbformat_minor": 2
465 | }
466 |
--------------------------------------------------------------------------------