LoginSignup
51

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-29

はじめに

現在、自然言語処理に取り組んでおり、
日本語テキストを入力、そのラベルを出力とするモデルを作っています。
学習モデルの精度が目標に近づいてきたので、
そろそろ現場で使ってもらい、フィードバックが欲しくなってきました。
最終的には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初投稿でした!
今後はデータ分析周りの情報を発信していきたいと思います。
こちらの記事が参考になった方は、
是非「いいね」を頂ければ幸いです。
これからよろしくお願いします!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51