KerasでDeep Learning を活かしたチャットボットができるらしい

f:id:ts0818:20200202163237j:plain

人間が働かなくて良い時代が来ないかな~、といつも思っているブタ野郎こと、どうもボクです。
 

Microsoftさんが、またやらかしてたみたいな...

gigazine.net

Microsoftは2020年1月、Windows 10を実行する何億台ものPCに影響を与える危険な脆弱性を修正するため、セキュリティパッチを配布しました。

Microsoft報告によると、今回の脆弱性CryptoAPIというWindowsAPIで発見されたとのことですが、セキュリティ専門家らが特に「重要な点である」と指摘したのが、「脆弱性を報告したのがアメリカの諜報機関であるアメリカ国家安全保障局(NSA)だった」という点でした。

Windows 10の脆弱性を諜報機関の「NSA」が報告したことを専門家が重視する理由とは? - GIGAZINE 

アメリカ国家安全保障局NSA:National Security Agency)とか出てきちゃうって... っていうか、NSAWindows使ってるんですかね?

どんな危険性かっていうのは、 

jovi0608.hatenablog.com

⇧  上記サイト様で解説してくれています。

 

んで、全然関係ないけども、

techplay.jp

dreamarts.connpass.com

⇧  に参加して参りました~。

NTTデータさんの「NTTデータが手がけるマルチクラウド、大規模開発におけるCI/CD事例勉強会」 では、「マルチクラウド」っていう概念を初めて知りました。

グローバルなプロジェクトになってくると、「マルチクラウド」って構成が重要になってきますと。

「マルチクラウド」の辛みとかが聞けて勉強になりました。

特に、クラウドで使いたい機能に対して、第三者認証ができているかに関わってくるであろう、SOC(Service Organization Control)ってものも初めて知りました。

support.trustlogin.com

さて、SOCとは “Service Organization Control” の略で、アメリ公認会計士協会 (AICPA) ならびにカナダ公認会計士協会 (CICA) が制定した、国際的なトラストサービスの原則と基準(Trust Services Principles and Criteria)に基づき評価されるものです。

内部統制に関する国際認証 SOC について、クラウドサービスの視点で考える – サポート − トラスト・ログイン byGMO【旧SKUID(スクイド)】

⇧ SOC自体は、国際的な「トラストサービス」で評価されるものであると。

「トラストサービス」はと言うと、

blogs.itmedia.co.jp

⇧  上記サイト様が詳しいです。政府によって、定義されるとあるので、国によっても意味合いが異なってきそうですが...

あと、「マルチクラウド」の場合、SLA(Service Level Agreement)も、「1つ」「それぞれ」のどちらで考えるのかっていう難しさもありますと。

 

株式会社ドリーム・アーツさんの「Jetson NanoとTensorFlowでディープラーニングにチャレンジ!」では、Jetson Nanoっていうものを初めて知りました。 

github.com

Jetson Nano とは

NVIDIAが開発している、GPUがのっかったエッジコンピューティングマシン。 NVIDIAなのでCUDAが利用可能なので、外出先でもGPUプログラミングができる夢のマシン。

GitHub - nebosuke/jetson_setup_log

⇧  株式会社ドリーム・アーツのCTOの石田さんが、GitHubチュートリアルを公開してくれています。 

Jetson Nano も購入して、学習していきたいですかね~。

その前に、「機械学習」「ディープラーニング」まわりを、学習していかねばということで、今回は、そのへんにレッツトライ~。

結論から申し上げますと、Kerasを使ってのコーディングは試せていないので、お時間のある方のみ、ご照覧ください。 

 

Kerasって?

Kerasって何?

Kerasは、Pythonで書かれたオープンソースニューラルネットワークライブラリである。MXNet英語版Deeplearning4jTensorFlowCNTKTheano英語版の上部で動作することができるディープニューラルネットワークを用いた迅速な実験を可能にするよう設計され、最小限、モジュール式、拡張可能であることに重点が置かれている。

プロジェクトONEIROS (Open-ended Neuro-Electronic Intelligent Robot Operating System) の研究の一部として開発された。中心的な開発者、メンテナはGoogleのエンジニアのFrançois Cholletである。

Keras - Wikipedia

⇧ 「Deeplearning4j」「Tensorflow」「CNTK」なんかので動かすことができる、「ニューラルネットワーク」ライブラリですと。

「Deeplearning4j」はJava製のライブラリだから、python 2系で連携するのかな?

Kerasのドキュメントでは、

KerasはPython 2.7-3.6に対応しています.

Home - Keras Documentation

python 2系もサポートしてますと。ただ、Python 3.6 までしかサポートされとらんとんので、Python 3系を使うときは注意が必要ですと。

 

ニューラルネットワーク」ライブラリって言われてもね...

ニューラルネットワーク(神経網、neural network、略称: NN)は、脳機能に見られるいくつかの特性に類似した数理的モデルである。「マカロックとピッツの形式ニューロン」など研究の源流としては地球生物の神経系の探求であるが、その当初から、それが実際に生物の神経系のシミュレーションであるか否かについては議論があるため人工ニューラルネットワーク(artificial neural network、ANN)などと呼ばれることもある。

また生物学と相互の進展により、相違点なども研究されている。

ニューラルネットワーク - Wikipedia

⇧ わ、分からん...

ニューラルネットワークシナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般を指す。狭義には誤差逆伝播法を用いた多層パーセプトロンを指す場合もあるが、これは誤った用法である。

一般的なニューラルネットワークでの人工ニューロンは生体のニューロンの動作を極めて簡易化したものを利用する。

ニューラルネットワーク - Wikipedia

⇧ 「ニューラルネットワーク」は、ネットワークを持つ「人工ニューロン(ノード)」を作成して、そいつに「学習」させて自立(問題解決能力を持たせる)させていこうっていうモデルであると...いまいちピンとこないっすね。

 

ipr20.cs.ehime-u.ac.jp

⇧  上記サイト様の説明が分かりやすいです。

要するに、人間が認識処理を行う際に、脳内で行われている処理を「脳神経をモデルとした情報処理システム」と考えた場合に、コンピューターの世界で同じようなことするために考えられたのが「ニューラルネットワーク」ってことですかね。

イメージ図は、

⇧  上記サイト様のようになるのだと。「入力層」「中間層」「出力層」の3構成が一般的なんですかね?

 

ただし、「誤差逆伝播法を用いた多層パーセプトロン」ってのは、「ニューラルネットワーク」ではないのですと。

誤差逆伝播法」って何よ?

バックプロパゲーションBackpropagation)または誤差逆伝播(ごさぎゃくでんぱほう)は、機械学習において、ニューラルネットワークを学習させる際に用いられるアルゴリズムである。1986年backwards propagation of errors(後方への誤差伝播)の略からデビッド・ラメルハートらによって命名された

バックプロパゲーション - Wikipedia

バックプロパゲーションでは、人工ニューロン(または「ノード」)で使われる活性化関数可微分でなければならない。

バックプロパゲーション - Wikipedia

⇧ わ、分からん...

誤差を最小化して任意関数を近似することが出来る。 そのアルゴリズムは次の通りである:

  1. ニューラルネットワークに学習のためのサンプルを与える。
  2. ネットワークの出力を求め、出力層における誤差を求める。その誤差を用い、各出力ニューロンについて誤差を計算する。
  3. 個々のニューロンの期待される出力値と倍率 (scaling factor)、要求された出力と実際の出力の差を計算する。これを局所誤差と言う。
  4. ニューロンの重みを局所誤差が小さくなるよう調整する。
  5. より大きな重みで接続された前段のニューロンに対して、局所誤差の責任があると判定する。
  6. そのように判定された前段のニューロンのさらに前段のニューロン群について同様の処理を行う。

このアルゴリズムの名が暗示するように、エラー(および学習)は出力ノードから後方のノードへと伝播する。

バックプロパゲーション - Wikipedia

⇧ 「誤差逆伝播法」は、名前の通り、「出力層」の結果を確認して、「期待」してた値で無かった場合に、「中間層」に対して「期待値」に近づくようにフィードバックを行っていくアルゴリズムらしい。 

 

thinkit.co.jp

ニューラルネットワークでは、入力データから出力データまで人工ニューロンを通して演算処理することを、順方向のデータ伝搬、フォワードプロパゲーション(Forward-propagation)と呼ぶ。逆に学習は、出力データから入力データまでの逆方向の情報伝搬のことを指し、誤差逆伝搬法(Back-propagation)と呼ぶ。学習の目的は、フォワードプロパゲーションしたときの出力データと目的とする理想的な出力データとの誤差を近づけることだ。

ニューラルネットワークのモデルのバリエーション | Think IT(シンクイット)

⇧  上記サイト様と、Wikipediaの説明を合わせて考えてみますと、「誤差逆伝播法」は、あくまで「ニューラルネットワーク」の1つである「順伝播型ニューラルネットワーク」で使用できるアルゴリズムってことになるのかと。

 

だいぶ、脱線しましたが、「ニューラルネットワーク」は、その仕組み上「学習」が行われているのであり、

ニューラルネットワークは、教師信号(正解)の入力によって問題に最適化されていく教師あり学習と、教師信号を必要としない教師なし学習に分けられることがあるが、本質的には教師なし学習教師あり学習は等価である。

三層以上のニューラルネットワークは可微分で連続な任意関数を近似できることが証明されている。

ニューラルネットワーク - Wikipedia

⇧  んで、その「学習」には、

の2つがあるけど、どっちも等価ですと。

2020年2月3日(月)追記:↓ ここから

「学習」には、3種類あったそうな...

lp-tech.net

⇧ 「強化学習」というものもありますと。

2020年2月3日(月)追記:↑ ここまで

 

画像や統計など多次元量のデータで線形分離不可能な問題に対して、比較的小さい計算量で良好な解を得られることが多い。 現在では、画像認識、市場における顧客データに基づく購入物の類推などとして応用されている(パターン認識データマイニング)。

ニューラルネットワーク - Wikipedia

⇧ 「ニューラルネットワーク」は、実社会で活用されているんだと。

 

んで、「Keras」は、「ニューラルネットワークライブラリ」ですと。

だから、「Keras」を導入すれば、「パターン認識」「データマイニング」なんてことができるんじゃよ、と。

でも、「Tensorflow」とかでも「パターン認識」「データマイニング」ってできるんじゃない?って思った、そこの貴方!

ワシもじゃ ワシもじゃ みんな!!

www.ossnews.jp

⇧  皆様が感じた通り、「Tensorflow」でもいけますと。

「Keras」の目的は、お手軽に「ニューラルネットワーク」が試せるってところが強みのようです。

なので、

qiita.com

 Kerasは少ないコードでニューラルネットワークを構築することができ、大変重宝しています。あまりに便利なので、KerasベースでSeq2Seqを実装しようと思ったときにも、「Seq2Seqレイヤー」のようなものがすでにあって、1行で実装完了!などと言ったことを期待していましたが、残念ながらそうではありませんでした。

Kerasで実装するSeq2Seq -その1 日本語訓練データの準備 - Qiita

⇧  上記サイト様が仰るように、「Keras」が何もかも用意してくれてるわけではないんですと。

 

Kerasでチャットボット作成してみるのに必要なもの

「Keras」ってものが何であるか、ザックリとは分かったので、実際に使ってみたいと思います。

ai-coordinator.jp

⇧  上記サイト様を参考にさせていただきました。

今回、必要となる環境は、

項目 内容
仮想化(仮想マシン Virtual Box
OS(仮想マシンのOS) Ubuntu 18.04
言語(仮想マシン内) Python 3.6
ライブラリ(フロントエンド) Keras
ライブラリ(バックエンド) TensorFlow
ライブラリ(自然言語処理 gensim
ライブラリ(統計的自然言語処理 NLTK(Natural Language Toolkit)
ライブラリ(数値計算 NumPy

⇧  みたいな感じになるかと。 (ここでいう「フロントエンド」「バックエンド」ってのは、すべてサーバサイド内での話ですかね)

 

「gensim」については、

Gensim is an open-source library for unsupervised topic modeling and natural language processing, using modern statistical machine learning.

Gensim is implemented in Python and Cython. Gensim is designed to handle large text collections using data streaming and incremental online algorithms, which differentiates it from most other machine learning software packages that target only in-memory processing.

Gensim - Wikipedia

⇧  英語版のWikipedia情報になってしまうんですが、「トピック分析」という手法で「自然言語処理」の「機械学習」ができるライブラリじゃと。

Gensim includes streamed parallelized implementations of fastText, word2vec and doc2vec algorithms, as well as latent semantic analysis (LSA, LSI, SVD), non-negative matrix factorization (NMF), latent Dirichlet allocation (LDA), tf-idf and random projections.

Gensim - Wikipedia

⇧ 上記をGoogle翻訳してみたところ、「gensim」には、

  • fastText、word2vec、doc2vecアルゴリズムのストリーム並列化実装
  • 潜在的セマンティック分析(LSA、LSI、SVD)
  • 非負行列因子分解(NMF)
  • 潜在ディリクレ割り当て(LDA)
  • tf-idf
  • ランダム射影

が含まれるんであると。う~ん、まったく分からん...

 

んで「doc2vec」については、 

kento1109.hatenablog.com

⇧  上記サイト様が詳しいです。

ただ、今回は、参考にさせていただいたサイト様が「word2vec」を使っているような感じですと。

「word2vec」については、 

www.atmarkit.co.jp

⇧  上記サイト様が詳しいです。

また、「seq2seq(sequence to sequence)」については、実用するにはまだ課題があるようです。

 

仮想マシンを用意

はい、すみません、脱線しました。

そんじゃ、まずは、Virtual Boxで仮想マシンを作成ですかね。(Virtual Boxをインストールしていない場合は、インストールしちゃいましょう。)

自分は、 

ts0818.hatenablog.com

⇧  この回の記事で仮想マシン作成したので、仮想マシンの作成については割愛させていただきます。(仮想マシンのOSとしては、Ubuntu 18.04.3 LTS Server版のisoイメージファイルを使ってインストールしています。)

CUIだけで、仮想マシンの作成したので、いろいろハマりました(涙)。

VirtualBoxプラグインである「GuestAdditions」も上手く機能していません。

 

なので、

www.sejuku.net

⇧  上記サイト様などを参考にしていただければ、スムーズに仮想マシンの作成が完了するのではないかと。

 

必要なライブラリをインストールする

そんじゃ、仮想マシンにライブラリをインストールするために、仮想マシンの起動。

f:id:ts0818:20200126192748p:plain

そしたらば、VirtualBox の「GuestAdditions」が上手く機能していない場合、仮想マシンIPアドレス確認がVBoxmanage.exe コマンドで確認することができないので、VirtualBoxGUIコンソールのほうから、仮想マシンへログイン。

f:id:ts0818:20200201134310p:plain

 

とりあえず、NIC(Network Interface Card)がホストオンリーアダプターであるIPアドレスを知りたいのですが、

chutablog.blogspot.com

⇧ 上記サイト様のように、VirtualBox マネージャーの画面から、NICを確認してから、仮想マシン内のものと比べるしか無さそう...

「GuestAdditions」が機能しておれば、VBoxmanage.exe のコマンドのみで確認できるのかもしらんが...

f:id:ts0818:20200201141313p:plain

f:id:ts0818:20200201141403p:plain

⇧  自分の場合は、「ネットワークアダプター」の2つ目が、「ホストオンリーアダプター」ですと。

ちなみに、「NIC」と「ネットワークアダプター」は、

ネットワークカード(Network Card)は、コンピュータネットワーク内でコンピュータ間の通信を行うために使用されるハードウェアの1つである。

ネットワークカード - Wikipedia

一般的にはLANカード(ランカード)と呼ばれることが多いが、ネットワークアダプタネットワークインタフェースカード(Network Interface Card)などとも呼ばれる。

ネットワークカード - Wikipedia

⇧ ってことらしく、同様の意味で良いかと。

ただ、

名称のとおり、LANカードについては、有線のLAN、特にイーサネットに対する物を指す場合が多い。ネットワークアダプタについても古くは同様であったが、イーサネット等以外の各種のネットワーク、例えば無線LAN3GWiMAX等の普及により、コンピュータ(ホスト)から見た通信デバイス一般を指すようになった。

ネットワークカード - Wikipedia

⇧ 結構ややこしいことになってきてるんすかね。

NICと称する場合もあるが、これがネットワークインタフェースカード(Network Interface Card)という物理的媒体を指すのか、ネットワークインタフェースコントローラ(Network interface controller)という、非物理的な機能を指すのかは文脈から判断するほかない。

ネットワークカード - Wikipedia

⇧ 略語の罠が...

脱線しましたが、仮想マシンで、「NIC」に一致する「IPアドレス」を確認していきますと。

普通に、「ip a」とかでも良いんですが、

blog.goo.ne.jp

news.mynavi.jp

⇧ 上記サイト様を参考に、以下を試してみました。スーパーユーザ(root ユーザ)に切り替わってる必要があります。

lshw -class network    

f:id:ts0818:20200201144607p:plain

VirtualBox の「GuestAdditions」が機能しない影響で、「ゲストOSの画面を自動リサイズ」 が効かず、画面のリサイズができない影響で、見切れてしまっていますが、「*-network:0」から存在するらしいので、自分の環境ですと、

VirtualBoxマネージャーで確認できた情報 仮想マシン内で確認できた情報
アダプター 割当て network logical name IPアドレス
1 NAT ネットワーク 0 enp0s3 10.0.2.4
2 ホストオンリーアダプター 1 enp0s8 192.168.99.100

⇧  ってな対応関係になるんじゃないかと。

「GuestAdditions」が機能しないと、いろいろと面倒くさいな~。

 

「ホストオンリーアダプター」の「IPアドレス」が分かったので、Visual Studio Code の「ターミナル(自分の場合は、PowerShell になってます)」で仮想マシンへ、SSHログインしてきます。

f:id:ts0818:20200201152424p:plain

f:id:ts0818:20200201152600p:plain

Visual Studio Code の「ターミナル」からもログインできました。

 

まずは、何はともあれPythonをインストールですが、2020年2月1日(土)現在、Keras が Python 3.6 までしかサポートしていないので、Python 3.6 をインストールで、と思ったのですが、Ubuntu 18.04 LTS はデフォルトでPython 3.6 がインストールされとるらしい。

f:id:ts0818:20200201153627p:plain

Python 3.6.9 って...3.6 系のギリギリだけど、サポートされるんよね?
ちなみに、Pythonのパッケージ管理ツールである pip についてはインストールされとりませんでした...。

f:id:ts0818:20200201154214p:plain

ので、pip をインストールですが

teratail.com

⇧  Python 2系とPython 3系を共存させている場合は、「python3-pip」をインストールしといたほうが良いということらしいです。

 

今回は、Python 3系しか使わないので、スーパユーザ(root ユーザ)に切り替えたら、「python-pip」をインストールで。

apt install python-pip    

f:id:ts0818:20200201155035p:plain

そうしたら、まさかのPython 2系の pip がインストールされるという...

f:id:ts0818:20200201155932p:plain

⇧  一般ユーザだと、python 3系しかインストールされとらんかったらしいんだけど、スーパユーザ(root ユーザ)のほうだと、python 2系もインストールされとったらしい?という悲劇...

そいうわけで、「python3-pip」をインストールで。

apt install python3-pip    

f:id:ts0818:20200201160248p:plain

pip3 がインストールできたので、pip3 自体のバージョンアップしときます。

pip3 install --upgrade pip

f:id:ts0818:20200201161032p:plain

f:id:ts0818:20200201161129p:plain

 

cod-sushi.com

⇧  上記サイト様によりますと、「venv」は、python 3系にデフォルトで同梱されてたようでした。

なので、以下の「venv」のインストールは不要です。(自分は気づかずインストールしちゃいましたけど...)

⇩ ここから不要(Python 3系に、「venv」は同梱されてるらしいので)

そしたらば、Python仮想環境を構築できる「venv」もインストールしておきます。 

apt install python3-venv  

f:id:ts0818:20200201162257p:plain

⇧ ここまで不要(Python 3系に、「venv」は同梱されてるらしいので)

一般ユーザに切り替えて、「pip」「venv」がインストールされてることを確認。

f:id:ts0818:20200201170211p:plain

 

ちなみに、昨今は、「pipenv」っていうものもあるそうです。

qiita.com

 

はい、それでは、「venv」で、Python仮想環境を作成して、 その他のライブラリをインストールしていきたいと思います。

まずは、Python仮想環境を作成で。

--without-pip オプションが与えられない限り、pip を仮想環境でブートするために ensurepip が呼ばれます。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧ ってあり、「ensurepip」は、

ensurepip パッケージは pip インストーラを既にインストールされている Python 環境や仮想環境にブートストラップする助けになります。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧ ってあるんで、Python仮想環境用に、pip がインストールされるってことですかね?

なので、「--without-pip」のオプションは付けない感じで。(Python仮想環境の独自のpip を使っていく感じで)

python3 -m venv /home/ubuntu/myenv  

f:id:ts0818:20200201171257p:plain

そしたらば、Python仮想環境へログインで。

Python仮想環境へのログインに使うスクリプトファイルは、シェルによって変わってくるので要注意です。以下参照。

docs.python.org

source [/bin/activateまでのパス]

f:id:ts0818:20200201171932p:plain

Python仮想環境にログイン後、 一応、Python仮想環境のディレクトリに移動しておきました。(ここに、「src」ディレクトリとか作成して、pythonのファイル配置していく感じになるかと)

pip は、Python仮想環境のほうにもインストールされとりますね。Pythonも、Python仮想環境のものを使っているようです。(python3 じゃなくて、python でバージョン確認して、python 3系が表示されてるので)

f:id:ts0818:20200201173703p:plain

まずは、Python仮想環境の pip についても、バージョンアップしときます。

pip install --upgrade pip

f:id:ts0818:20200201174355p:plain

f:id:ts0818:20200201174427p:plain

⇧ アップデートされました。

そんでは、必要なpythonライブラリをインストールしていきます。

まずは、「gensim」をインストールで。

pip install gensim

f:id:ts0818:20200201174757p:plain

⇧ 「gensim」がインストールできたようです。 

続きまして、「tensorflow」をインストールで。

pip install tensorflow

f:id:ts0818:20200201175053p:plain

f:id:ts0818:20200201175631p:plain

f:id:ts0818:20200201175651p:plain

⇧  エラー出てるんだが...Successfully ってなってるけど、インストールされたって考えて良いのだろうか?

github.com

⇧  上記サイト様を参考に、「setuptools」のバージョンを上げてみますか。

f:id:ts0818:20200201180514p:plain

バージョンアップできたので、再度「tensorflow」のインストール。

f:id:ts0818:20200201180712p:plain

状況が悪化したような気がするんだが...

f:id:ts0818:20200201182620p:plain

f:id:ts0818:20200201182709p:plain

⇧ インストールされてるようにも見えるんだが...

インストールはされてるっぽいが...

f:id:ts0818:20200201183550p:plain

⇧ インポートで怒られてる...原因が分からな過ぎる...

Googleの公式のドキュメントを見たら、何か、

www.tensorflow.org

⇧ python3-dev が足りてないんじゃないか説。

一旦、Python仮想環境を初期化します。

python3 -m venv --clear [Python仮想環境のディレクトリ]

f:id:ts0818:20200201202531p:plain

⇧  初期化はできたっぽい。ライブラリ名をタイポしてた...oh, my gosh

Python仮想環境から抜けて、スーパユーザ(root ユーザ)に切り替わって、「python3-dev」をインストール。

f:id:ts0818:20200201202750p:plain

⇧  何か既にインストールされてる?っぽい気が。

んで、Python仮想環境に再びログインし、pip のアップデート~の、tensorflowのインストールで、

f:id:ts0818:20200201203450p:plain

⇧  エラー。 すまんです...またタイポしてもうた。LとRの発音は日本人には難しいからね~...はい、すみません、関係ありませんでした。

今度こそ。

pip install --upgrade tensorflow

f:id:ts0818:20200201204014p:plain 

f:id:ts0818:20200201204317p:plain

エラーなくイケたっぽい。

Python仮想環境をリセットしたんで、「gensim」も再度インストール。

f:id:ts0818:20200201204559p:plain

f:id:ts0818:20200201204531p:plain

Kerasのインストール。

pip install keras

f:id:ts0818:20200201204802p:plain

f:id:ts0818:20200201204958p:plain

インストールできたらしい。なんか、Kerasのインストールで、Numpy とかもインストールされるっぽい、たぶん。

そしたらば、Visual Studio Code から、仮想マシンSSHリモート接続します。
Visual Studio Code拡張機能を入れてない場合はインストールしちゃいましょう。
自分は、「Remote Development」って拡張機能をインストールしてます。

f:id:ts0818:20200201205644p:plain

「Remote Development」って拡張機能がインストールできたらば、Visual Studio Code 左下の f:id:ts0818:20200201205756p:plain のアイコンをクリック。

「Remote-SSH: Connect to Host...」を選択。

f:id:ts0818:20200201205907p:plain

仮想マシンへのSSHログインの情報を入力して、Enterキーを押下。

f:id:ts0818:20200201215656p:plain

新しく、Visual Studio Codevscode-server)が起動するので、SSHログインのパスワードを入力。

f:id:ts0818:20200201215923p:plain

左下に、「SSH: 仮想マシンIPアドレス」が表示されていれば、接続成功。「ファイル(F)」>「フォルダーを開く...」で。

f:id:ts0818:20200201220101p:plain

仮想マシン内のディレクトリを選択し、「OK」で。 

f:id:ts0818:20200201220234p:plain

SSHログインのパスワードを入力で。 

f:id:ts0818:20200201220304p:plain

 接続できました~。

f:id:ts0818:20200201220358p:plain

⇧ 怒られてるので、

code.visualstudio.com

⇧  上記の手順の通り、設定値を修正する。旧いほうのVisual Studio Code の「ターミナル」で仮想マシンにログイン後、「/etc/sysctl.conf」をviエディタで修正します。

f:id:ts0818:20200201221401p:plain

「fs.inotify.max.user_watches=524288」を最終行に追加。いまのところマックス値が、524288 らしい...

f:id:ts0818:20200201221754p:plain

⇧ 追加したらば、Escキー押下後、「:wq」で保存して、viエディタを終了。

f:id:ts0818:20200201221849p:plain

設定を反映。

f:id:ts0818:20200201223035p:plain

そしたらば、Visual Studio Codevscode-server)で、Python仮想環境として作成したディレクトリ「myenv」直下に、「src」ってディレクトリを作成します。

「myenv」ディレクトリを選択した状態で、f:id:ts0818:20200201222405p:plain のアイコンをクリック。

f:id:ts0818:20200201220921p:plain

f:id:ts0818:20200201222455p:plain

「src」ディレクトリができたらば、「src」ディレクトリ直下に、拡張子が「.py」なファイルを作成します。

「src」ディレクトリを選択した状態で、 f:id:ts0818:20200201222931p:plain のアイコンをクリック。

f:id:ts0818:20200201222751p:plain

f:id:ts0818:20200201223127p:plain

そしたら、追加したPythonファイルにコーディング。

ai-coordinator.jp

⇧  上記サイト様のソースをそのまま使わせていただきました。(学習データが無かったので、できませんでした。後述。)

Visual Studio Codevscode-server)に「workspace」を追加で。

f:id:ts0818:20200201223909p:plain

「リモート[SSH: 仮想マシンIPアドレス]」タブが選択された状態で、右上の f:id:ts0818:20200201224230p:plain のアイコンをクリック。

f:id:ts0818:20200201224056p:plain

「settings.json」が作成されるので、PythonVisual Studio Code で実行できる設定を追加します。

「/home/ubuntu/.vscode-server/data/Machine/settings.json」っていうJSONファイルが追加されます。

後で、このファイルに設定を追加していきます。

Visual Studio Codevscode-server)で、Pythonを実行するためには、Visual Studio Codevscode-server)に拡張機能の追加が必要なので、追加で。拡張機能Python」の追加で。

f:id:ts0818:20200201225445p:plain

インストールされたらば、

f:id:ts0818:20200201225433p:plain

「再読み込みが必要です」をクリック。

f:id:ts0818:20200201225515p:plain

再起動されたら、SSH再ログイン。

f:id:ts0818:20200201225553p:plain

どのPythonで実行すれば良いか分からんって怒られるので、「Select Python Interpreter」を選択で。

f:id:ts0818:20200201230330p:plain

Python仮想環境のPythonを使うにしました。

f:id:ts0818:20200201230414p:plain

これで、Pythonの実行自体はできるようになったのですが、Pythonのコーディングが正しいのかチェック(静的解析)などをするためのライブラリなどを使用するよう、設定ファイル(「/home/ubuntu/.vscode-server/data/Machine/settings.json」)に追記します。

qiita.com

⇧  上記サイト様の設定を使わせていただきます。

共通の設定(「/home/ubuntu/.vscode/settings.json」)の方で、

f:id:ts0818:20200202230739p:plain

python.pythonPath とかは設定されていたので、

「/home/ubuntu/.vscode-server/data/Machine/settings.json」の以下の部分はコメントアウトしてます。

f:id:ts0818:20200202230608p:plain

f:id:ts0818:20200201231401p:plain

⇧  次々に出てくるダイアログで、ライブラリを「Install」するか聞かれるので、すべて「Install」で。テスト系は今回は、「Disabe Tests」で。

いろいろインストールされます。

f:id:ts0818:20200201231620p:plain

んで、実行してみたら、

f:id:ts0818:20200201232236p:plain

nltk ってモジュールが無いって怒られた...すっかりインストールするの忘れてた。

f:id:ts0818:20200201232337p:plain

とりあえず、インストールで。

f:id:ts0818:20200201232600p:plain

f:id:ts0818:20200201232621p:plain

 

時間の都合上、仮想マシンとか一旦、停止で。

翌日。

仮想マシン再起動で、Visual Studio Code から、Visual Studio Codevscode-server)へSSH接続。

f:id:ts0818:20200202104102p:plain

f:id:ts0818:20200202104122p:plain

⇧ settings.json に記載し、インストールしたPythonライブラリ(「flake8」っていうPythonの静的解析ツール)が有効になってました。エラーがむっちゃある...

エラー見ながら、コーディングを修正していく過程で、参考サイト様の「学習データ」「word2vec.bin」ってのを自分で用意しないといけないことが判明。

「word2vec.bin download link」ってURLから「apnews_sg.tgz」ってファイルがダウンロードできたんですが、リモート接続先に配置したいので、ファイル転送ソフトが必要です。
Visual Studio Code拡張機能で、ファイル転送の機能を追加できるそうなので、追加します。

その前に、ダウンロードしたファイルを適当なディレクトリに配置で。今回は、ローカルで自分が決めてた作業ディレクトリに配置しました。

f:id:ts0818:20200202111239p:plain

f:id:ts0818:20200202111440p:plain

そんでは、Visual Studio Code拡張機能を追加します。Visual Studio Codevscode-server)側への拡張機能の追加ではないのに注意。

拡張機能「SFTP」をインストールで。

f:id:ts0818:20200202111841p:plain

インストールが完了すると、

f:id:ts0818:20200202112106p:plain

⇧ 「SFTP」のアイコンが追加されてることが確認できます。

接続の前に、Visual Studio Code 上で「Command + Shift + P」を押下。Widnowsの場合は、「Ctrl + Shift + P」でイケるかと。

コマンドパレットが表示されるので、「sftp」の入力し、「SFTP:Config」を選択。

f:id:ts0818:20200202112955p:plain

ローカルの作業ディレクトリに「.vscode/sftp.json」ってファイルができるので、ここに、SFTP接続情報を記載していきます。

f:id:ts0818:20200202113159p:plain

自分は、以下のように設定しました。「host」に、仮想マシンIPアドレスを指定してるので、IPアドレスが変わるたびに修正の必要がありますが...

f:id:ts0818:20200202115214p:plain

設定が完了すると、ローカルの作業ディレクトリ上で右クリックして、「Sync Local -> Remote」ってのが選択できるので、選択。(個別にファイルを「Download」「Upload」って場合は、ファイルを選択した状態で右クリックでいけます。)

f:id:ts0818:20200202114632p:plain

「SFTP」のアイコンをクリックすると、リモート接続先にアップロードされたファイルが確認できます。(「apnews_sg.tgz」以外もアップロードされてしまった...)

f:id:ts0818:20200202115502p:plain

Visual Studio Codevscode-server)側で、「apnews_sg.tgz」を展開しますか。

tar -xzvf [展開したいファイルまでのパス]

f:id:ts0818:20200202122519p:plain

「word2vec.bin」はあったけど、「学習データ」が無い...

「word2vec.bin」と「学習データ」が関連してるとしたら、「apnews_sg.tgz」を展開して取得できた「word2vec.bin」に合致する「学習データ」を取得できないといけないってことだけど、どんなデータを使ってるのか分からんしな...

f:id:ts0818:20200202122646p:plain

 

致し方ないので、

m0t0k1ch1st0ry.com

⇧  上記サイト様を参考に、自分で、作成していくことに。

www.koi.mashykom.com

自然言語処理では、はじめに、処理したいテキストを単語に分割する前処理が必要となります。単語に分割するためには、文章を形態素に分割していきます。形態素とは意味を持つ最小の言語単位であり、形態素解析(Morphological Analysis)とは与えられた文を形態素単位に区切り、各形態素に品詞(part of spech)などの情報を付与する処理のことです。

日本語の自然言語処理

⇧ 「学習データ」を作るには、「形態素解析」が必要で、

現在主流の形態素解析ソフトの1つであるMeCabを取り上げ,インストール方法や実行例を確認します。

日本語の自然言語処理

⇧「MeCab」っていうライブラリが必要らしい。

qiita.com

⇧  上記サイト様によりますと、「Pythonバインディング」ってのをしないと、Pythonライブラリとして、MeCabが使えないらしい。

まずは、Ubuntuでスーパユーザ(root ユーザ)になって、「MeCab」をインストール。

apt install mecab libmecab-dev mecab-ipadic-utf8    

f:id:ts0818:20200202143125p:plain

f:id:ts0818:20200202143443p:plain

⇧ インストールできたっぽい。

 

www.think-self.com

qiita.com

Pythonバインディング」ってのをするには、「swig」ってライブラリもインストールしておく必要があるらしい。

インストールで。

apt install swig

f:id:ts0818:20200202144047p:plain

f:id:ts0818:20200202144318p:plain

そしたらば、一般ユーザに戻って、Python仮想環境にログインし、

exit
cd [Python仮想環境のディレクトリまでのパス]
source ./bin/activate

Pythonバインディング」のためのPythonライブラリをインストールで。

pip install mecab-python3

f:id:ts0818:20200202144628p:plain

 

そしたらば、「学習データ」の元データとして、「青空文庫」から、適当なzipファイルをダウンロード。 

f:id:ts0818:20200202150123p:plain

⇧ 私は、「レ・ミゼラブル」の「テキストファイル(ルビあり)」をダウンロードいたしました。「レ・ミゼラブル」読み直したいな~。
ダウンロードしたzipファイルを仮想マシンに転送します。

f:id:ts0818:20200202150354p:plain

f:id:ts0818:20200202150422p:plain

f:id:ts0818:20200202150509p:plain

⇧ アップロードされました。

unzip しようとしたら、

f:id:ts0818:20200202151042p:plain

⇧ まさかの、unzip がインストールされてないというね...

インストールで。

f:id:ts0818:20200202151204p:plain

nkf」ってコマンドも無いので、インストールで。

f:id:ts0818:20200202151951p:plain

展開したけど、文字化けってるので、

f:id:ts0818:20200202151647p:plain

文字コードを、utf8 に変換。

nkf -w --overwrite [変換したいテキストファイル]

f:id:ts0818:20200202152252p:plain

文字コードを、utf8 に変換できました。 

テキストファイルの中身を「分かち書き」(「形態素解析」ってやつですかね)にするための、Pythonファイルを作成。

f:id:ts0818:20200202152717p:plain

コーディングで静的解析ツールに引っかかったので、

qiita.com

⇧  上記サイト様を参考に修正。

Pythonって静的解析でエラー出ても特に影響ないのかな?

# -*- coding: utf-8 -*-

import MeCab
import sys

tagger = MeCab.Tagger('-F\\s%f[6] -U\\s%m -E\\n')

fi = open(sys.argv[1], 'r')
fo = open(sys.argv[2], 'w')

line = fi.readline()
while line:
    result = tagger.parse(line)
    fo.write(result[1:])  # skip first \s
    line = fi.readline()

fi.close()
fo.close()

⇧ 上記で保存したらば、Visual Studio Codevscode-server)側の「ターミナル」で実行。

python [実行したいpythonファイルまでのパス] [inputテキストファイル] [outputテキストファイル]

f:id:ts0818:20200202154313p:plain

続きまして、「分かち書き」のデータを元に、「word2vec」でモデルを作成。新たに、「train.py」を作成。

f:id:ts0818:20200202154550p:plain

ソースコードは以下。

# -*- coding: utf-8 -*-

from gensim.models import word2vec
import logging
import sys

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentences = word2vec.LineSentence(sys.argv[1])
model = word2vec.Word2Vec(sentences,
                          sg=1,
                          size=100,
                          min_count=1,
                          window=10,
                          hs=1,
                          negative=0)
model.save(sys.argv[2])

⇧ 上記を保存し、Visual Studio Codevscode-server)側の「ターミナル」で実行。

python [実行したいpythonファイルまでのパス] [inputテキストファイル] [outputモデル]

f:id:ts0818:20200202155126p:plain

f:id:ts0818:20200202155643p:plain

モデルが完成。
モデルを試してみる。新たに、「similar.py」を作成。

f:id:ts0818:20200202155934p:plain

ソースコードは以下。(すみません、載っけてたコーディング間違ってました。)

2020年2月2日(日)22:00 修正:↓ ここから

# -*- coding: utf-8 -*-

from gensim.models import word2vec
import sys

model = word2vec.Word2Vec.load(sys.argv[1])
results = model.most_similar(positive=sys.argv[2], topn=10)

for result in results:
    print(result[0], '\t', result[1])

2020年2月2日(日)22:00 修正:↑ ここまで

⇧ 上記を保存し、Visual Studio Codevscode-server)側の「ターミナル」で実行。

python [実行したいpythonファイルまでのパス] [使用したいモデル] [inputキーワード]

f:id:ts0818:20200202160525p:plain

⇧ 「人生」って何なんね? に対する近しいものを応えてくれました!

「人生」は、「今」という!

結構、胸が熱くなる答えがトップに来てますね、それ以外の「回答」が、何かドイヒーですが...

学習データが重要なんですね...
レ・ミゼラブル」時代の「人生感」ってやつが出てますかね...

まぁ、一応、「質問」に「回答」してくれたということで。

Keras は使えなかったし、頓珍漢な「回答」ではありますが、「打てば響く」を実現できたのではないでしょうか。

機械学習」「DeepLearning 」なんかも勉強していかねばですね。(理解できなさ過ぎて、やる気が出ないけど...)

今回はこのへんで。