にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

新しく買ったWindows 10でneologd等の自然言語処理環境を構築する (+ XGBoost)

新しく買ったWindows 10でneologd等の自然言語処理環境を構築する (+ XGBoost)

はじめに

f:id:catindog:20170319214656p:plain

 自然言語処理機械学習とSE的なことを仕事としているのですが、現在務めている会社ではWindowsの利用を強く推奨されることがあります。これは、コンプラインスの関係でセキュリティ管理者が複数のOSを管理するコストは高いからWindowsに限定することが多いという理由に起因しています。
 この文章を書いている環境はUbuntu LinuxLibreofficeを用いています。文字コードUTF-8だと自然言語処理の観点で何かと都合がよく、MeCabなどの形態素解析エンジンもUTF-8ですし、Python3も内部の処理系がUTF-8で、GolangのRuneや、C++も文字処理粒度はUTF-8のものが増えています。
 こういう関係もあって、sjisをハックするなど、あまり技術的にこったことをしたくないというモチベーションのもと、Windows形態素解析と、みんな大好きXGBoostを導入するまでの一連の流れを示したいと思います。
 ツール属性の攻撃という言葉があって、これが案外馬鹿にできないというか、かなりの攻撃力を誇るので、できるだけ覚えるコスト下げたいという思いもあります。
 (この方法は2017年3月段階での、私がいじくってなんとか動かした方法ですので、正しく理解するには公式ドキュメントも注意深く参照することをおすすめします)

計画

1. Windows 10の持ち運べるノートパソコンであるLG gramの購入と、アップグレード
2. OSをNVMeに移動する
3. 日本語が処理できるようにcmdやcmderの代わりにputty, teratermやcygwind sshを利用する
4. mecabとneologdの導入
5. Anacondaとjupyter notebookの構築
6. XGBoostの導入

1. Windows 10の持ち運べるノートパソコンであるLG gramの購入と、アップグレード

 本当はMacBook Proがほしいのだが、2017年3月、もっとも高いメモリのモデルでも16GByteまでしかなく、加えて8GByte → 16GByteに変更するのに20000円もかかる。自分で取り替えられる場合、12000円程度ですむ。
 MacBookには、NVMeモデルがない。NVMeはSSDより高速な主記憶装置で、ディスクに大量にアクセスする操作が発生することが多い機械学習ではNVMeであるだけで、かなり処理時間が短縮できることがある。スワップ領域等を作成しておくと、メモリがあふれた時にもマシンが処理落ちして使い物にならなくなる時間が短縮できて大変よい。
 CPUは早いほうがいいが、ノートパソコンで重い計算をさせることは私は少ないのでCore i3でいいかなって感じです。

 LG gramの2017年のモデルが1キロを下回る軽さで、メモリを追加することも、NVMeに換装することもできます。96000円程度で秋葉原ツクモで10%還元で購入できました。そのポイントを利用してNVMeとDDR4の16GByteのメモリを購入しました。NVMeがsamsung 512GBのモデルで30000円程度,DDR4の16GByteで12000円程度でした。合計で、120000円程度です。
f:id:catindog:20170319212304p:plain

図1. ツクモで買ってきました

 全く文脈を無視しますが、ぼくは小林銅蟲先生を尊敬していまして、料理ブログよく見てるので、あのノリ羨ましいなって思います。
f:id:catindog:20170319212424p:plain

図2. PCの箱とNVMeとメモリとツクモちゃんのクリアファイルです
f:id:catindog:20170319212602p:plain
図3. 開けたときの様子、プラスチックで昔のMacBookを連想させます。ぼくは樹脂のほうが好きです
f:id:catindog:20170319212717p:plain
図4. 背面の様子です。開けていく
f:id:catindog:20170319212804p:plain
図5. 一キロ切っているモデルでメモリと記憶域交換できるのは本当にめずらしいです。よさを感じる
f:id:catindog:20170319212852p:plain
図6. メモリスロットとPCI-Expressです。
f:id:catindog:20170319212937p:plain
図7. 刺しました。(SSDからUSBディスクにOSを退避させた後です)
f:id:catindog:20170319213041p:plain
図8. メモリ20GByte認識して、NVMeの速度出ているようです

OSをNVMeに移動する

 これが一番めんどくさかったです。コントロールパネルからリカバリーディスクの作成を選んで、32GのUSBフラッシュメモリにOSのリカバリディスクを作成しました。
 かなり早いUSBフラッシュメモリを用いたのに全く速度がでない。。。4時間ぐらいかかりました。これはMicorsoftの怠慢では。途中で寝てしまいました。
f:id:catindog:20170319213224p:plain

図9. 遅すぎる
 終わったら、NVMeに取り替えてF10を押しながら起動して、USBから起動して復元を行います。(有料のソフトもいくつかみたけど、覚えるのつらすぎ)

3. 日本語が処理できるようにcmdやcmderの代わりにputty, teratermやcygwind sshを利用する

 Bash on WidowsというWindows上にUbuntuが動作する仕組みがあるのですが、コマンドプロンプトや、よくおすすめされるcmderというソフトは、日本語入力やファイルが壊滅的にダメで、これが原因でほんとつらい思いをしました。
 よく私が使う回避策は、Bash on Windowsssh-serverを起動して、teraterm等てアクセスする方法です。面倒ですが今のところこれが一番安定して、日本語が扱えます。

3.1 開発者モードを、コントロールパネルから有効にする
3.2 Windowsの機能の有効化または無効化 → Windows Subsystem for Linux (Beta) → チェックを入れて再起動
3.3 services.mscコマンドプロンプトに入力 -> SSH Server Broker,SSH Server Proxyの2つのサービスを無効にする
3.3 cmdを立ち上げる → bashと入力 → Linuxのインストール
3.4 Bash on Windowsに入る → sudo apt get install openssh-serverでインストール
/etc/ssh/sshd_configを編集

$ sudo vim /etc/ssh/sshd_config
変更→ UsePrivilegeSeparation no
変更→ PasswordAuthentication yes
コメントアウト → #Hostkey /etc/ssh/ssh_host_dsa/key
コメントアウト → #Hostkey /etc/ssh/ssh_host_ecdsa/key
コメントアウト → #Hostkey /etc/ssh/ssh_host_ed25519/key

コマンド実行(これをやらないとつながらない)

$ sudo ssh-keygen -t rsa -N '' -f ssh_host_rsa_key

sshdを起動

$ sudo /etc/init.d/ssh start

ここまでできれば、teratermcygwinsshで好きなように操作することができます。日本語もオッケーです。

4. mecabとneologdの導入

 これもUbuntuのインストール手順に従えば、問題ないです。標準のUbuntuLinuxにはデフォルト入ってないパッケージもあるので適宜入れていきます。

mecabソフトウェア各種インストール

$ sudo apt install mecab libmecab-dev mecab-ipadic
$ sudo apt install mecab-ipadic-utf8
$ sudo apt install python-mecab
$ sudo apt install python3-pip
$ sudo pip3 install mecab-python3
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n

mecabのデフォルト辞書をneologdに変更する

$ sudo vim /etc/mecabrc
変更 → dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd

動作確認(FGOは標準辞書にない)

$ echo "Fate/Grand Order" | mecab
Fate/Grand Order        名詞,固有名詞,一般,*,*,*,Fate/Grand Order,フェイトグランドオーダー, フェイトグランドオーダー
EOS

5. Anacondaとjupyter notebookの構築

最初Anacondaを使わずに入れようと思ったけど、ubuntuのwheelが通じないことながあって、Anacondaでインストールするのが楽でした。

Anacondaのパッケージを取得

$ wget https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh

インストール(sudoするとパーミッションが面倒なのでしない)

$ sh Anaconda3-4.3.1-Linux-x86_64.sh
(ひらすらyesで進めていく)

私の環境ではpython3.6のバイナリがAnacondaのPythonですので、Python3.6で実行できるようになります。

$ which python3.6
/home/{yourname}/anaconda3/bin/python3.6

なお、ipythonのkernelが不安定なので、以下のパッチを当てる必要があります。

conda install -c jzuhone zeromq=4.1.dev0

jupyter notebookのパスワードを作成します

In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed' <-これをコピーしておきます

jupyter notebookにパスワードを設定

$ vim ~/.jupyter/jupyter_notebook_config.py
コピーした内容を貼り付け
c.NotebookApp.password = u'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'

ついでにjupyterで形態素解析ができるようにする

$ sudo ipython -m pip install mecab-python3

これでClient側のWindowsからwebブラウザ等でjupyter notebookが利用可能です。

例でスクリーンショットを載せます。
f:id:catindog:20170319214656p:plain

図10. jupyter notebook上で最新の形態素解析ができました

6. XGBoostの導入

 自分はlibsvm形式で直接xgboostのバイナリに放り込むことが多いのですが、やりかは何でもいいと思います。

$ git clone --recursive https://github.com/dmlc/xgboost
$ cd xgboost
$ make -j4
$ sudo ln -s /home/{yourname}/xgboost/xgboost /usr/local/bin/xgboost

サンプルのアガリクスの有効判定みたいなのをときます。

$ cd demo/binary_classification
$ python mapfeat.py
$ python mknfold.py agaricus.txt 1
$ xgboost mushroom.conf

いろいろ入れられそうですが、この辺にしておきます。
再度になりますが、自分はQiitaとか見てて結構ハマって、よくわかんないなぁとか思っていたのですが、公式ドキュメントで解決することが多かったです。私の今回の方法も、ひと月後には通用しないものになっているかもしれません。
公式ドキュメントを正しく理解することが一番の近道かもしれません。
(何か間違い等がありましたら、ツイッターでお知らせいただけると幸いです。)