Alpine LinuxでMeCab with NEologd


はじめに

気軽に形態素解析できるようにNElogdが入ったDockerイメージを作りました。

Dockerfileと、Alpine Linux、MeCab/NEologdの自動構築に関して得られた知見を共有します🤗

使い方

$ echo "10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。" | \
  docker run -i -a STDIN -a STDOUT nownabe/mecab-neologd
10日    名詞,固有名詞,一般,*,*,*,10日,トオカ,トオカ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
「      記号,括弧開,*,*,*,*,「,「,「
中居正広のミになる図書館        名詞,固有名詞,一般,*,*,*,中居正広のミになる図書館,ナカイマサヒロノミニナルトショカン,ナカイマサヒロノミ
ニナルトショカン
」      記号,括弧閉,*,*,*,*,」,」,」
(      記号,括弧開,*,*,*,*,(,(,(
テレビ朝日      名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系      名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)      記号,括弧閉,*,*,*,*,),),)
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
SMAP    名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
中居正広        名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
、      記号,読点,*,*,*,*,、,、,、
篠原信一        名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
過去    名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い  名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす  動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕    名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ    動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

Dockerfile

Dockerfile
FROM alpine:3.4
MAINTAINER nownabe

RUN apk add --update --no-cache build-base

ENV MECAB_VERSION 0.996
ENV IPADIC_VERSION 2.7.0-20070801
ENV mecab_url https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE
ENV ipadic_url https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM
ENV build_deps 'curl git bash file sudo openssh'
ENV dependencies 'openssl'

RUN apk add --update --no-cache ${build_deps} \
  # Install dependencies
  && apk add --update --no-cache ${dependencies} \
  # Install MeCab
  && curl -SL -o mecab-${MECAB_VERSION}.tar.gz ${mecab_url} \
  && tar zxf mecab-${MECAB_VERSION}.tar.gz \
  && cd mecab-${MECAB_VERSION} \
  && ./configure --enable-utf8-only --with-charset=utf8 \
  && make \
  && make install \
  && cd \
  # Install IPA dic
  && curl -SL -o mecab-ipadic-${IPADIC_VERSION}.tar.gz ${ipadic_url} \
  && tar zxf mecab-ipadic-${IPADIC_VERSION}.tar.gz \
  && cd mecab-ipadic-${IPADIC_VERSION} \
  && ./configure --with-charset=utf8 \
  && make \
  && make install \
  && cd \
  # Install Neologd
  && git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git \
  && mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y \
  # Clean up
  && apk del ${build_deps} \
  && rm -rf \
    mecab-${MECAB_VERSION}* \
    mecab-${IPADIC_VERSION}* \
    mecab-ipadic-neologd

CMD ["mecab", "-d", "/usr/local/lib/mecab/dic/mecab-ipadic-neologd"]

Alpine Linux

Alpine Linuxとは

Alpine Linuxは軽量でセキュアなLinuxです。Dockerのイメージを軽くする用途で使われることが増えてるみたいです。

Small. Simple. Secure.
Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.

公式ページより

Alpine Linuxのイメージは5MBないぐらいです。

パッケージの探し方

Alpine Linuxではパッケージのインストールにapkというパッケージ管理システムを使います。

Alpineのパッケージに関してはググっても情報なかったりしますが、たいていのパッケージは公式サイトのパッケージ検索システムで探せばあります。
ここにもなかったら普通にビルドすればOKです

また、apkコマンドをDockerfileで使うとき、--update--no-cacheをつけておくのが無難っぽいです。
--updateはパッケージリストの更新をします。なので最初の1回目は必ず--updateを付ける必要があります。
--no-cacheは見ての通りキャッシュを無効化します。なので最後にキャッシュを消したりする処理を書かなくてよくなります。

--virtualという複数のパッケージをグループにして名前をつける機能もあるのですが、今回は環境変数にパッケージを詰め込んだので使いませんでした。

MeCab

MeCabとは

MeCabは日本語の形態素解析エンジンです。日本語文を単語に分けてくれるやつです

ソースコードの場所

MeCabのソースコードはなんとGoogle Driveにおいてあります。数年に1回ぐらい置き場所が変わってる気がするので注意が必要です。

MeCabの辞書であるIPA辞書も同様です。

NEologd

NEologdとは

NEologdはIPA辞書を強化した辞書です。NE(Named Entity)とあるように、固有表現(固有名詞)に強い辞書です。
新しい単語もどんどん追加されているようです。

non intaractiveなインストール

付属のインストーラを普通に起動すると入力を求められますが、-yオプションをつけることで回避できます。

mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y

使い方

使うときは、MeCabに辞書の場所を指定してあげます。

$ mecab
セイバーとライダーとアーチャーの聖杯問答
セイバー        名詞,一般,*,*,*,*,*
と      助詞,並立助詞,*,*,*,*,と,ト,ト
ライダー        名詞,一般,*,*,*,*,ライダー,ライダー,ライダー
と      助詞,並立助詞,*,*,*,*,と,ト,ト
アーチャー      名詞,一般,*,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
聖      名詞,一般,*,*,*,*,聖,ヒジリ,ヒジリ
杯      名詞,接尾,一般,*,*,*,杯,ハイ,ハイ
問答    名詞,サ変接続,*,*,*,*,問答,モンドウ,モンドー
EOS
^C

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
セイバーとライダーとアーチャーの聖杯問答
セイバー        名詞,固有名詞,人名,一般,*,*,SAVIORR,セイバー,セイバー
と      助詞,並立助詞,*,*,*,*,と,ト,ト
ライダー        名詞,一般,*,*,*,*,ライダー,ライダー,ライダー
と      助詞,並立助詞,*,*,*,*,と,ト,ト
アーチャー      名詞,固有名詞,一般,*,*,*,アーチャー,アーチャー,アーチャー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
聖杯    名詞,固有名詞,一般,*,*,*,聖杯,セイハイ,セイハイ
問答    名詞,サ変接続,*,*,*,*,問答,モンドウ,モンドー
EOS