DockerでGiNZAの環境構築をしてみた|SudachPyのユーザー辞書登録方法も紹介

2020-03-28
2020-03-28

本記事は、自然言語処理で用いられる GiNZA の環境構築を Docker で作成したまとめです。以前書いた記事で Twitter のツイート収集について書いきました。この記事はその続編で自然言語処理を行うための環境構築に関する記事です。

さらに今回の環境構築では新しく vscode の remote container を使ってみました。

以下はこれまで Twitter 解析を行うためにについて書いた記事です。

GiNZA で自然言語処理

いろいろやり方はあるのですが、この記事では自然言語処理のライブラリであるGiNZAを利用します。日本語の形態素解析器は MeCab や Janome がありますが、新しいものを使いたかったので GiNZA を使ってみます。

GiNZA についての概要はこちらに記載されています。自然言語処理のフレームワークであるspaCyと形態素解析器のSudachiPyが取り入れられています。

GiNZA は pip で簡単にインストールできます。

pip install -U ginza

インストールするとコマンドラインでginzaコマンドが使えるようになります。試しにやってみるとこんな感じになります。

ginza
自然言語処理
# text = 自然言語処理
1       自然    自然    NOUN    名詞-普通名詞-一般      _       3       compound        _       BunsetuBILabel=B|BunsetuPositionType=CONT|SpaceAfter=No|NP_B
2       言語    言語    NOUN    名詞-普通名詞-一般      _       3       compound        _       BunsetuBILabel=I|BunsetuPositionType=CONT|SpaceAfter=No|NP_I
3       処理    処理    NOUN    名詞-普通名詞-サ変可能  _       0       root    _       BunsetuBILabel=I|BunsetuPositionType=ROOT|SpaceAfter=No|NP_I

Docker で GiNZA の環境構築

今回も Docker で環境をを構築していきます。

以下が Dockerfile です。pip でいれてる GiNZA 以外の python パッケージは Twitter 解析用のやつです。

# ベースとなるDockerイメージ指定
FROM python:3.7.4

# python package
RUN pip install --upgrade pip
RUN pip install jupyter requests tweepy pandas sklearn pep8 autopep8 wordcloud emoji neologdn
RUN pip install -U ginza

# コンテナログイン時のディレクトリ指定
WORKDIR /work/

CMD ["/bin/bash"]

そしてこちらが docker-compose.yml です。

version: '3' # composeファイルのバーション指定
services:
  app: # service名
    build: . # ビルドに使用するDockerfileがあるディレクトリ指定
    tty: true # コンテナの起動永続化
    ports:
      - '8888:8888' # "ホストのポート:コンテナのポート"
    volumes:
      - ..:/work/ # マウントディレクトリ指定
    command: /bin/sh -c "while sleep 1000; do :; done"

いつもならここで終わりですが、今回はさらに vscode の remote container を使っていきます。

公式のドキュメントは以下になります。

まず作業フォルダに.devcontainerフォルダを用意します。

この.devcontainerの中に以下の2つを用意します。

.
├── devcontainer.json
└── settings.vscode.json

settings.vscode.jsonは vscode のタブサイズやリンターの設定を書くもので必須ではありません。 大事なのはdevcontainer.jsonです。このファイルにいろいろ設定を書きます。

今回は以下のような設定を記述しました。

{
    "name": "twitter_analysis",
    //docker-compose.ymlのパス
    "dockerComposeFile": [
        "../docker/docker-compose.yml"
    ],
    //docker-compose.ymlのservice名
    "service": "app",
    //起動時のディレクトリ
    "workspaceFolder": "/work/",
    //デフォルトのsettings.json
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash",
    },
    //リモートコンテナのvscodeで使用するextension
    "extensions": [
        "ms-python.python",
        "ionutvmi.path-autocomplete",
        "hiro-sun.vscode-emacs"
    ],
    //コンテナ作成後に実行するコマンド
    "postCreateCommand": "apt-get update && apt-get install -y git && sh /work/docker/init/init.sh",
}

上記のファイルが.devcontainerにある状態で vscode 左下の下記のボタンを押します。

vscode remote container

するとプルダウンが現れるので、そこからRemote-Containers: Open Folder in Container...を選択し、.devcontainersがある作業フォルダを選びます。

Docker の起動などの処理が終了すれば、Docker で定義した環境で vscode を開いているような状態になります!

上記設定でうまくいくはずですが、比較的新しい機能なので自分も完全に使いこなしているわけではありません。詳しいことは公式ドキュメントを参照してください。

SudachiPy でユーザー辞書登録

辞書にない固有名詞を形態素解析で単語として認識してもらうには、ユーザー辞書を作成する必要があります。

商品名や映画タイトルなどの固有名詞はユーザー辞書登録を行わないと、形態素解析で意図しない形に分割されるので SNS の解析を行う際には必須です。

GiNZA の場合は SudachiPy のユーザー辞書登録の方法と同じようにできます。

公式のドキュメントは以下です。

手順はこんな感じです。

  1. ユーザー辞書の作成
  2. ユーザー辞書のビルド実行
  3. sudachi.json にビルドしたファイルパスを記述

まず登録したい言葉を記述した CSV(または txt)ファイルを用意します。形式が決まっているのでそれにしたがって書いていきます。

例えば、「Google Home」と「魔女の宅急便」を登録したい場合は以下のように書きます。

google home,4786,4786,3000,Google Home,名詞,固有名詞,一般,*,*,*,グーグルホーム,Google Home,*,*,*,*,*
魔女の宅急便,4786,4786,3000,Google Home,名詞,固有名詞,一般,*,*,*,まじょのたっきゅうびん,魔女の宅急便,*,*,*,*,*

英単語の場合は一番左の見出しは必ず小文字にしないときちんと登録されないので注意です。

次に作成したファイルをビルドします。

sudachipy ubuild -s /usr/local/lib/python3.7/site-packages/ja_ginza_dict/sudachidict/system.dic ./my_dict.txt

実行するとuser.dicというファイルがカレントディレクトリに生成されてます。

最後に作成したuser.dicのパスを sudachi.json に書きます。

{
    "systemDict": "system.dic",
    "userDict": [
        "./user.dic"
    ],
    "characterDefinitionFile": "char.def",
    //以下省略
}

ちなみに sudachi.json は/usr/local/lib/python3.7/site-packages/ja_ginza_dict/sudachidict/にあります。

以上でユーザー辞書登録は完了です。

私の場合は毎回この作業を行う面倒なので Remote Container 起動時にスクリプトで実行するようにしてます。

ここまでで環境構築完了です。

WordCloud 用の日本語フォント導入

WordCloud を使いたかったので今回の環境に日本語フォントを入れます。

作業フォルダにNoto Sans CJK JPをダウンロードしておきます。

ダウンロードできたら公式の手順の Linux のやり方を参考に以下のコマンドを順次実行します。

unzip NotoSansCJKjp-hinted.zip -y
mkdir -p ~/.fonts
cp *otf ~/.fonts
fc-cache -f -v

これで WordCloud を使用するときののフォントパスをfont_path="/root/.fonts/NotoSansCJKjp-Regular.otf"とすれば日本語でも文字化けせずに使用できます。

起動スクリプト作成

Docker 立ち上げ後に行いたい処理がいろいろあるのでスクリプトにまとめました。

非常に簡単なものですが、こちらが書いたスクリプトです。

#!/bin/bash
cd /work/docker/init
cp sudachi.json /usr/local/lib/python3.7/site-packages/ja_ginza_dict/sudachidict/
sudachipy ubuild -s /usr/local/lib/python3.7/site-packages/ja_ginza_dict/sudachidict/system.dic ./my_dict.txt
mv user.dic /usr/local/lib/python3.7/site-packages/ja_ginza_dict/sudachidict/
cd fonts
unzip NotoSansCJKjp-hinted.zip -y
mkdir -p ~/.fonts
cp *otf ~/.fonts
fc-cache -f -v

Docker 起動時に実行するにはdevcontainer.json"postCreateCommand"にコマンドを書けばオッケーです。

まとめ

本記事では GiNZA を使用する Docker 環境構築方法を紹介しました。

Docker でなくてもいいのですが、手順がいろいろあるものは Docker のほうが再現性があって覚えやすいです。ローカルでやっていたらユーザー辞書登録のやり方は覚えられなかったです。

Docker だとコンパクトに作業環境に関する情報がまとまるので頭の整理にもなります。

あと、今回は以前から試したかった vscode の remote container を使ってみました。vscode 上でコマンドを打たずに環境を選択できるのは便利です。vscode の環境設定もできるので、環境が統一されて非常に快適です。

次回は今度こそ前処理について書きます!