Edited at

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

More than 1 year has passed since last update.


はじめに

現在、自然言語処理に取り組んでおり、

日本語テキストを入力、そのラベルを出力とするモデルを作っています。

学習モデルの精度が目標に近づいてきたので、

そろそろ現場で使ってもらい、フィードバックが欲しくなってきました。

最終的には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初投稿でした!

今後はデータ分析周りの情報を発信していきたいと思います。

こちらの記事が参考になった方は、

是非「いいね」を頂ければ幸いです。

これからよろしくお願いします!