MeCab+NEologdを使って日本語を分かち書きにするツールを作った

Word2VecとかするときにMeCab + NEologdを使って分かち書きする。だがインストールがやや面倒。Dockerを使って、手軽に分かち書きするツールを作った。

やりたいこと

  1. MeCab + NEologdで分かち書きする
  2. ディレクトリ構造を保つ
    Word2Vecで全テキストを1つにまとめてしまうときは問題ないが、Doc2Vecとかするときには1ファイルごとに分かち書きしたい。そのときディレクトリ構造を変えられると面倒なので、同じになるようにする。
    たとえば以下のような感じ。inputに分かち書きしたいファイルをディレクトリごと入れたら、その構造を保ったままoutputに結果が出る。

    ├── input
    │   ├── 1
    │   │   ├── 11
    │   │   │   └── c.txt
    │   │   └── b.txt
    │   ├── 2
    │   │   └── d.txt
    │   └── a.txt
    └── output
       ├── 1
       │   ├── 11
       │   │   └── c.txt
       │   └── b.txt
       ├── 2
       │   └── d.txt
       └── a.txt
    

できたもの

sankaku/docker-mecab

実行例

./mount/input に上のツリー構造の通りファイルを入れる。中身はすべて同じで、NEologdにある例と同じにした。
そしてDockerイメージを作成し、 ./split.sh を実行。

入力

$ for f in `ls mount/input/**/*.txt`; do echo $f; cat $f; done
mount/input/1/11/c.txt
8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。
mount/input/1/b.txt
8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。
mount/input/2/d.txt
8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。
mount/input/a.txt
8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。

出力

$ for f in `ls mount/output/**/*.txt`; do echo $f; cat $f; done
mount/output/1/11/c.txt
8月3日 に 放送 さ れ た 「 中居正広の金曜日のスマイルたちへ 」( TBS 系 ) で 、 1日 たった 5分 で ぽっこり おなか を 解消 する という ダイエット方法 を 紹介 。 キンタロー。 の ダイエット に も 密着 。 
mount/output/1/b.txt
8月3日 に 放送 さ れ た 「 中居正広の金曜日のスマイルたちへ 」( TBS 系 ) で 、 1日 たった 5分 で ぽっこり おなか を 解消 する という ダイエット方法 を 紹介 。 キンタロー。 の ダイエット に も 密着 。 
mount/output/2/d.txt
8月3日 に 放送 さ れ た 「 中居正広の金曜日のスマイルたちへ 」( TBS 系 ) で 、 1日 たった 5分 で ぽっこり おなか を 解消 する という ダイエット方法 を 紹介 。 キンタロー。 の ダイエット に も 密着 。 
mount/output/a.txt
8月3日 に 放送 さ れ た 「 中居正広の金曜日のスマイルたちへ 」( TBS 系 ) で 、 1日 たった 5分 で ぽっこり おなか を 解消 する という ダイエット方法 を 紹介 。 キンタロー。 の ダイエット に も 密着 。

ちゃんとファイルごとに分かち書きできてる。
ディレクトリ構造もそのまま。


$ tree mount/ mount/ ├── input │   ├── 1 │   │   ├── 11 │   │   │   └── c.txt │   │   └── b.txt │   ├── 2 │   │   └── d.txt │   └── a.txt └── output ├── 1 │   ├── 11 │   │   └── c.txt │   └── b.txt ├── 2 │   └── d.txt └── a.txt

radiko録音スクリプトのdocker化

radikoを録音するシェルスクリプトmatchy2/rec_radiko.shをdockerで動かすようにした。他の方のスクリプトを使うだけだが…。

できたもの

docker_rec_radiko

あとはCRONでdocker runすればいい(docker runはradiko_docker_run.shの中でやっている)。
録音時にdocker runするか、それともコンテナは起動しっぱなしにしてその中でCRONで録音するか迷った。(つまりCRONでコンテナを起動するか、コンテナの中でCRONするか。)だが録音しないときはこのコンテナは何もしないので、前者でいいということにした。

作った理由

環境構築が面倒だから。

関東を離れてもTBSラジオなどが聞きたいので、ConoHaで東京リージョンのVPSを借り、そこでこのシェルスクリプトを動かすようにした。スクリプトではffmpegなど必要となるツールがあるのでそれらをインストールしないといけない。VPSではいろいろなOSの中からCentOSを(サーバならCentOSだろという固定観念から)選んだが、CentOSだとこのインストール作業がやや面倒なのでdockerにした。

radikoのプレミアム会員になれば全国どこの局でも聞けるというのは知ってる。借りたサーバでは他にも何かするつもり。

もろもろ

  • 時刻設定が面倒だった
    はじめubuntu:16.04のdockerイメージを使っていたが環境変数 TZAsia/Tokyo にしてもJSTにならないようだった。他にも設定の方法はあるのだろうが、ubuntuはやめてdebianのイメージを使うことにした。debianだとこれでいける。
  • dockerでのマウント方法
    新しい指定方法ができていた(docker 17.06からなので新しくもない…知らなかっただけ)。
    ホストのディレクトリ[ファイル]をコンテナのディレクトリ[ファイル]にマウントさせたいとき、以下が同じ意味になる。

    # -v で指定する方法
    $ docker run -v <PATH_IN_HOST>:<PATH_IN_CONTAINER> <IMAGE_NAME>
    # --mount で指定する方法
    $ docker run --mount type=bind,source=<PATH_IN_HOST>,target=<PATH_IN_CONTAINER> <IMAGE_NAME>
    

    -v では、コロンの前と後どっちがホストのパスだっけと迷うことがよくあった。 --mount だといちいちsourceなどと書くのでわかりやすい。
    またvolumeのマウントでも、 -v だとホストディレクトリ[ファイル]のマウントと区別しにくかったが、 --mount ではtypeが変わるのでわかりやすい。

    # -v で指定する方法
    $ docker run -v <VOLUME_NAME>:<PATH_IN_CONTAINER> <IMAGE_NAME>
    # --mount で指定する方法
    $ docker run --mount type=volume,source=<VOLUME_NAME>,target=<PATH_IN_CONTAINER> <IMAGE_NAME>
    

参考