サカトラ

自動化したり統計したり

Rockerを始める

Rstudioのバージョン更新結構ほったらかしがち(N=1)

恐る恐る手元のRのバージョン確認したら3.2使ってました、、、(執筆時のWindowsの最新版は4.1.2)
Rのバージョンアップ本当にやらない。
やらない理由はただ面倒なだけやったらいいのに

そこでRocker

Rocker Project というRのコンテナ環境を作っているプロジェクトがあります。
そこがDocker Hubに挙げているイメージを使って最新のRのコンテナ環境をサクッと作ることができるというわけなんですね、ありがたい。
さらにコンテナ環境ということでRstudio Serverを使う形になっているのでクラウドとかに用意すれば簡単に複数人でおなじR環境を使えるようになる!
いいことづくめかもしれないですね。

早速実践

今回の環境は以下になります。
完全に自分用なのでWSL2上に構築する形にしてみました。
- Ubuntu20.04(WSL2) - Docker Dockerは公式のインストール手順をもとにインストール

今回は以下の記事をかなり参考にしています。
MeCab のインストール(Ubuntu 上)

RockerのイメージはDocker Hubから拾ってきます。
Rockerもいくつかの種類がありますが、自分はtidyverseがあれば満足かなというところでrocker/tidyverseを選びました。

以下がDocker Imageです。 下に行くほどパッケージが充実しています。

イメージ 内容
r-ver 安定版のRとソースビルドツール
rstudio Rstudioを追加
tidyverse tidyverseとdevtoolsを追加
verse texなどの文書作成パッケージを追加
geospatial 地理情報のライブラリを追加

※他にもいくつかイメージがあります⇒こちらを参照

docker runで立ち上げてみる

まずは簡単にdocker runコマンドのみで立ち上げてみます。
Rstudio Serverが8787番ポートで起動するのでそのポートをホストにつなげます。
また、環境変数でのパスワード設定が必要になるのでそれも置いておきます。

$ docker container run -d -p 8787:8787 -e PASSWORD=myPassword rocker/tidyverse

コンテナの立ち上げに成功したらlocalhost:8787に接続してみます。
下のようなログイン画面が出れば大丈夫です。

f:id:Ruc_4130:20220116140723p:plain
Rstudio Server ログイン画面

ユーザー名はrstudioパスワードは環境変数で設定したものでログインができます。 いい感じです! f:id:Ruc_4130:20220116141029p:plain

ボリュームを永続化する

とりあえずRockerのイメージを使ってRstudio Serverのコンテナを動かして接続するところまではできました。
しかしこれだとRstudioで作業した内容がコンテナの中にしかないのでコンテナが破棄されるとデータも消えてしまいます。

すなわち、Rockerのバージョンを入れ替えたい時などにデータが引き継げなくなってしまいます。
これを避けるためにデータをコンテナホスト側と共有することでデータを永続化できます。
Rockerのコンテナイメージではデフォルトで/home/rstudio/スクリプト等のデータがおかれるため以下のコマンドでrockerを立ち上げればコンテナ側で作成したファイル等はコンテナホスト側のrstudioディレクトリに保存されることになりデータの永続化が可能になります。
(※Rstudio側でも保存するパスは選べるので保存先を/home/rstudio以外にすることも可能、ただし下記のコマンドで立ち上げた場合は/home/rstudio配下以外のファイル、ディレクトリは共有されない)

$ docker container run -d -p 8787:8787 -e PASSWORD=myPassword -v rstudio:/home/rstudio rocker/tidyverse

もっとカスタマイズ

ここまででかなりカスタマイズできたがDockerfileを使ったさらなるカスタマイズをしていきます。

RMeCabを入れる

Rで形態素解析をする際にはRMeCabというパッケージを使って行います。
RMeCabMeCabというソフトのラッパーです。RMeCabの使用にはMeCabのインストールが必要になります。 ということでMeCabRMeCabがインストールされたRockerをDockerfileを使って作っていきます。

FROM rocker/tidyverse
RUN apt-get update && apt-get install -y \
    mecab \
    libmecab-dev \
    mecab-utils \
    mecab-ipadic-utf8
RUN install2.r RMeCab --repo https://rmecab.jp/R

Dockerfileからイメージのビルドをする

docker image build -t rocker_mecab .

ビルドされたイメージからコンテナを起動する。 rocker_mecabでイメージにタグをつけたのでそのタグ名を使って呼び出します。 せっかくなのでコンテナに名前も付けましょう。rstudio_serverと名付けました。

docker container run -d --name rstudio_server -p 8787:8787 -e PASSWORD=myPassword -v rstudio:/home/rstudio rocker_mecab

これで立ち上がったコンテナにアクセスしてRMeCabが使えるかどうかを試してみます。

f:id:Ruc_4130:20220204012018p:plain
RMeCabをお試し

RMeCabを問題なく使うことができました。

neologd辞書を入れる

ここまででRMeCab入りのRockerコンテナを立ち上げることができました。
ただこのMeCabが持つデフォルト辞書では新語などには対応できないという難点があります。

RMeCabC("鬼滅の刃を見ながら午後の紅茶を飲む")
[[1]]
名詞 
"鬼" 

[[2]]
名詞 
"滅" 

[[3]]
助詞 
"の" 

[[4]]
名詞 
"刃" 

[[5]]
助詞 
"を" 

[[6]]
動詞 
"見" 

[[7]]
    助詞 
"ながら" 

[[8]]
  名詞 
"午後" 

[[9]]
助詞 
"の" 

[[10]]
  名詞 
"紅茶" 

[[11]]
助詞 
"を" 

[[12]]
  動詞 
"飲む" 

鬼滅の刃」や「午後の紅茶」は固有名詞であるのそれらは1語で扱ってほしいところです。
このような新語・固有名詞についてもかなりの対応しているのがNEologd辞書になります。 github.com ということでNEologd辞書を入れつつそれをデフォルト辞書に設定するDockerfileを作ってみました。 mecablinuxalternativeシステムを使ってデフォルト辞書のパスをとっているのでそれをupdate-alternativesコマンドでNEologdの方に曲げてあります。

FROM rocker/tidyverse
RUN apt-get update && apt-get install -y \
    mecab \
    libmecab-dev \
    mecab-utils \
    mecab-ipadic-utf-8 \
    git \
    build-essintial \
    curl

RUN install2.r rmecab --repo https://rmecab.jp/R

# NEologd辞書を入れる
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git  && mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n

# NEologdをデフォルトに設定
RUN update-alternatives --install /var/lib/mecab/dic/debian mecab-dictionary /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd 100

これビルドするのにそこそこ時間がかかりました。(特にNEologdのダウンロード)

上記ファイルよりビルドされたイメージでコンテナを立ち上げたらもう一度先ほどの文章をMeCabに投げてみます。

 RMeCabC("鬼滅の刃を見ながら午後の紅茶を飲む")
[[1]]
      名詞 
"鬼滅の刃" 

[[2]]
助詞 
"を" 

[[3]]
動詞 
"見" 

[[4]]
    助詞 
"ながら" 

[[5]]
        名詞 
"午後の紅茶" 

[[6]]
助詞 
"を" 

[[7]]
  動詞 
"飲む" 

ということできちんとNEologd辞書が反映されていることが確認できます。

これで自然言語処理を行うベースもできました。

今後はこのイメージを使って色々やっていこうと思います。