機械学習の機能を持つwebサーバーの作成

webサービス機械学習のシステムを組み込むためにはwebサーバーと機械学習サーバーを異なる形で動かすことやwebサーバー内で機械学習のシステムを持たせる方法になどによってwebサービス機械学習のシステムを組み込むことができる。

今回はまず、python機械学習の機能を持つwebサーバーを作成していく。

f:id:hanamichi_sukusuku:20210219192356p:plain

実行結果

f:id:hanamichi_sukusuku:20210219192419p:plain

ソースコードでは見やすさの観点からjupyter notebookでのコードになっているが実行はコマンドラインから行う。

 

実行結果では「野球を見るのは........楽しみです。」という文章をプログラムに渡して、json形式でその結果が返されている。jsonなので日本語がエンコードされていまっているがデコードすると「スポーツ」となる。

 

hanamichi-sukusuku.hatenablog.com

ここで使用しているプログラムは同じディレクトリ内にある、上記で作成したファイル(my_text.py)のcheck_genre関数を使用し、URLで渡した文章を分類している。

 

モジュールインポート

import json
import flask
from flask import request
import my_text

jsonモジュールはpythonjson形のデータを扱う時に利用する。

flaskはwebサーバーを手軽に作成できるフレームワーク

from flask import requestではURLからパラメーターの取得ができたりするためにインポート。

import my_textは上記で記述した通り、事前に作成した機械学習のプログラム。

 

ポート番号、HTTPサーバーの起動

TM_PORT_NO = 8888
# HTTPサーバを起動
app = flask.Flask(__name__)

TM_PORT_NOはポート番号で8888を定義しているがもし、別のアプリで8888番を使っている場合には他の番号に変更する。

flask.Flask(__name__)でFlaskオブジェクトを生成する。

 

ターミナル上でプログラムが正しく実行されるかのテスト

label, per, no = my_text.check_genre("テスト")
print("> テスト --- ", label, per, no)

この出力結果はターミナル上に出力される。

無事出力されたので次に進む。

 

ローカルサーバー起動

if __name__ == '__main__':
  # サーバを起動
  app.run(debug=True, host='0.0.0.0', port=TM_PORT_NO)

 

appにはFlaskオブジェクトが格納されているのでapp.run()でサーバーを起動。

引数のdebug=Trueではデバッグを出力するようにしている。

host='0.0.0.0.'を指定しないと外のネットワークから接続ができないらしい。パソコンでこのローカルサーバーを立ち上げ、別の端末からこのサーバーにアクセスするために必要。実際に自身のスマホから接続できた。

portはポート番号に指定。

 

ルート(/)にアクセスしたときの処理

@app.route('/', methods=['GET'])
def index():
  with open("index.html", "rb") as f:
  return f.read()

@app.route()でルートパスにアクセスされた時の後述する関数を実行するようにしている。methods=['GET']でGETリクエストを指定。

index()関数では同階層のindex.htmlファイルを読み込み、表示している。

f:id:hanamichi_sukusuku:20210219202655p:plain

http://localhost:8888/このURLにアクセスした時の画像。

 

/apiにアクセスしたときの処理

@app.route('/api', methods=['GET'])
def api():
 # URLパラメータを取得 --- (*3)
 q = request.args.get('q', '')
 if q == '':
  return '{"label": "空です", "per":0}'
 print("q=", q)
 # テキストのジャンル判定を行う --- (*4)
 label, per, no = my_text.check_genre(q)
 # 結果をJSONで出力
 return json.dumps({
   "label": label,
   "per": per,
   "genre_no": no
 })

@app.route()で/apiにアクセスした時、後述する関数を実行するようにしている。ここでもmethods=['GET']でGETリクエストを指定。

request.args.get()ではURLからパラメーターをしている。第一引数の'q'はキー。URLで'q'をキーとするパラメーターを取得し変数qに格納。

 

my_text.check_genre()では事前の作成したmy_text.pyからcheck_genre()関数を使用している。上記のリンクを見ればわかるが、この関数では渡した文章を機械学習で分類し、どのラベルを示すものか、確率、ラベルデータの番号をそれぞれ返す。

return json.dumps()で第一引数に辞書を渡すとjson文字列として出力されたものを返す。

 

一番上の実行結果には

http://localhost:8888/api?q=(テキスト)という形でアクセスしたときの実行結果を表示している。