#はじめに
現在、自然言語処理に取り組んでおり、
日本語テキストを入力、そのラベルを出力とするモデルを作っています。
学習モデルの精度が目標に近づいてきたので、
そろそろ現場で使ってもらい、フィードバックが欲しくなってきました。
最終的にはAWSを使ってサービス化する予定ですが、
今回は取り敢えず、DockerとPythonを使って、
サクッと日本語テキスト処理APIを作ってみました。
#目次
1.環境
2.MeCab入りのDockerコンテナを起動
3.FlaskでREST APIを構築
4.RequestsでJSONデータをPOST
#1.環境
- macOS High Sierra 10.13.3
- Docker 18.03.1-ce
~/Desktop/work
├Dockerfile
├user.csv(MeCab用ユーザー辞書)
├api.py
├request.py
├text.json
└models
├word2vec_input.model
└model.pkl
#2.MeCab入りのDockerコンテナを起動
#ベースイメージ
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y mecab \
&& apt-get install -y libmecab-dev \
&& apt-get install -y mecab-ipadic-utf8\
&& apt-get install -y git\
&& apt-get install -y make\
&& apt-get install -y curl\
&& apt-get install -y xz-utils\
&& apt-get install -y file\
&& apt-get install -y sudo\
&& apt-get install -y wget
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git\
&& cd mecab-ipadic-neologd\
&& bin/install-mecab-ipadic-neologd -n -y
RUN apt-get install -y software-properties-common vim
RUN add-apt-repository ppa:jonathonf/python-3.6
RUN apt-get update
RUN apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3.6-venv
RUN python3.6 -m pip install pip --upgrade
RUN pip install flask
RUN pip install numpy
RUN pip install pandas
RUN pip install sklearn
RUN pip install gensim
RUN pip install mecab-python3
~/Desktop/workディレクトリにて、
Dockerイメージを作成します。
$cd ~/Desktop/work
$docker build -t container:1.0 .
続いて、Dockerコンテナを起動します。
-pでポートマッピング、
-vで共有するディレクトリを指定しています。
$docker run -it -p 8888:8888 -v ~Desktop/work:/home container:1.0
ここから先はコンテナのrootディレクトリで操作します。
MeCabにユーザー辞書を追加します。
$/usr/lib/mecab/mecab-dict-index -d /usr/lib/mecab/dic/mecab-ipadic-neologd/ -u /usr/lib/mecab/dic/user.dic -f utf-8 -t utf-8 user.csv
ユーザー辞書を反映するためには、
/etc/mecabrcにユーザー辞書のアドレスを追加する必要があります。
userdic = /usr/lib/mecab/dic/user.dic
以上でDockerの環境構築は完了です。
#3.FlaskでREST APIを構築
from flask import Flask, jsonify, request
from sklearn.externals import joblib
from gensim.models import word2vec
import json
import MeCab
app = Flask(__name__)
@app.route('/reply', methods=['POST'])
def reply():
#JSONデータを読み込み
data = json.loads(request.data)
text = data["text"]
#形態素変換
list_text = []
m = MeCab.Tagger ("mecabrc")
tmp_text = m.parse(text).split('\n')
for i in range(len(tmp_text)-2):
list_text.append(tmp_text[i].split('\t')[0])
#テキストをWord2Vecでベクトル化
saveflame = "./models/word2vec_input.model"#学習時のWord2Vecモデル
model = word2vec.Word2Vec.load(saveflame)
wv_tensor = sum(model.wv[list_text])/(len(list_text))
#学習済みモデルの読み込み
clf = joblib.load('./models/model.pkl')#学習時の推論モデル
#テキスト種類の推論
pred = clf.predict(wv_tensor.reshape(1,-1))
#推論内容の表示
return jsonify(pred.tolist())
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0',port=8888)
日本語テキスト処理APIを起動します。
$python3.6 api.py
#4.RequestsでJSONデータをPOST
{
"text": "ここに何らかのテキストが入ります"
}
import requests
import json
f = open('text.json', 'r')
send_data = json.loads(f.read())
r = requests.post("http://0.0.0.0:8888/reply", json=send_data)
print(r.text)
requests.pyでJSONデータをポストすると、
テキストのラベルが返ってきます。
#おわりに
Qiita初投稿でした!
今後はデータ分析周りの情報を発信していきたいと思います。
こちらの記事が参考になった方は、
是非「いいね」を頂ければ幸いです。
これからよろしくお願いします!