Python(MeCab) on Dockerで日本語テキスト処理APIをサクッと実装

#はじめに
現在、自然言語処理に取り組んでおり、
日本語テキストを入力、そのラベルを出力とするモデルを作っています。
学習モデルの精度が目標に近づいてきたので、
そろそろ現場で使ってもらい、フィードバックが欲しくなってきました。
最終的には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コンテナを起動

```:Dockerfile
#ベースイメージ
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にユーザー辞書のアドレスを追加する必要があります。

```:mecabrc
userdic = /usr/lib/mecab/dic/user.dic 
```

以上でDockerの環境構築は完了です。

#3.FlaskでREST APIを構築

```api.py
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.json
{
  "text": "ここに何らかのテキストが入ります"
}
```

```requests.py
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初投稿でした！
今後はデータ分析周りの情報を発信していきたいと思います。
こちらの記事が参考になった方は、
是非「いいね」を頂ければ幸いです。
これからよろしくお願いします！