ホーム
記事一覧
プライバシーポリシー
免責事項
お問い合わせ

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

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の環境設定もできるので、環境が統一されて非常に快適です。

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