仕事中の問題と解決メモ。

最近はPythonとGoogle Cloud Platformがメイン。株式会社ビズオーシャンで企画と開発運用、データ活用とか。 http://mstdn.bizocean.co.jp/@uyamazak https://github.com/uyamazak/

日本語の分かち書きにGoogle Cloud Natural Language APIを使う

日本語の文章を、検索用のデータにしたり、機械学習などする際に必須になる分かち書き

これまではMecabを使ってたけど、インストールが必要になり、辞書も変えたりすると結構大変。

そこで、Google Cloud Natural Language APIを使ってみることにした。

cloud.google.com


環境はプロトタイプ作りにも便利なJupyter+Python3.6をDockerを使って社内サーバーで動かして使っている。
一つなのでdocker-composeは使っていない。

Dockerfile

ROM jupyter/notebook

RUN pip install --upgrade -q \
pip \
datalab

RUN pip install --upgrade google-cloud-language

ENV GOOGLE_APPLICATION_CREDENTIALS service_account.json

service_account.jsonは公式ドキュメント通りにとってきておいておく。

クイックスタート  |  Google Cloud Natural Language API ドキュメント  |  Google Cloud Platform


これをjupyter-devというタグをつけてビルドし、

sudo docker build -t jupyter-dev .


docker run時に/notebooksをマウントするのを忘れないようにする。消えちゃうから。

sudo docker run \
        -d \
        -v /home/username/path/to/notebooks:/notebooks \
        -p 8282:8888 \
        jupyter-dev \
        jupyter notebook


jupyter上でメッセージを渡すと、スペース区切りで分かち書きしたものと、感情スコア、感情のマグニチュードだけを、とりあえず返す関数を作る

# Imports the Google Cloud client library
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
client = language.LanguageServiceClient()

def get_analyze_results(message):    
    document = types.Document(
        content=message,
        type=enums.Document.Type.PLAIN_TEXT)
    
    syntax_response = client.analyze_syntax(
        document=document,
    )
    separeted_text = " ".join([s.text.content for s in syntax_response.tokens])
    
    sentiment_response = client.analyze_sentiment(document=document)
    return {
        "separeted_text": separeted_text,
        "magnitude": sentiment_response.document_sentiment.magnitude,
        "score": sentiment_response.document_sentiment.score
    }
    

実行すると

get_analyze_results("試合を終えて家路へ向かうサッカー部員達。疲れからか、不幸にも黒塗りの高級車に追突してしまう。後輩をかばいすべての責任を負った三浦に対し、車の主、暴力団員谷岡が言い渡した示談の条件とは・・・。")
{'magnitude': 1.100000023841858,
 'score': 0.0,
 'separeted_text': '試合 を 終え て 家路 へ 向かう サッカー 部 員 達 。 疲れ から か 、 不幸 に も 黒 塗り の 高級 車 に 追突 し てしまう 。 後輩 を かばい すべて の 責任 を 負っ た 三浦 に対し 、 車 の 主 、 暴力 団員 谷岡 が 言い渡し た 示談 の 条件 とは・・・ 。'}

もっと細かい単語同士の関係とかも返してくれるようだけど、難しすぎてよくわからない。

この関数でbizoceanのお問合せを分かち書きしたものをナイーブベイズで分類してカテゴリを返すAPIみたいのを作ろうとしている。

感情分析はシンプルでいいと思うけど、実際読んでる感じとちょっとずれもあって、使いどころが思いつかない。


Mecabとかを使わずにGoogleのアカウントと少しのお金があれば使えるので、細かいカスタマイズが不要な普通の分かち書き程度に使うのなら非常に便利だと思う。