WSLでMeCabとJupyter Notebookを動かす

# WSLでMeCabとJupyter Notebookを動かす

PythonはWindowsでも動きますが、いざ色々やろうとするとUbuntu対応だってことが多いですね。
（そんな時のために？）Windows10ではWindows Subsystem for Linux(WSL)があるのですが、今回MeCabを入れて、Jupyter Notebookで動かしてみるのにそこそこ苦労したので、ご紹介します。
たぶんもう一回やろうとしても難しいので、備忘録です。

尚、MeCabについては、下記を参考にしています。
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md


## WSLインストール
下記リンクの手順なのですが、UbuntuはUbuntu 18.04 LTSを入れました。
尚、一度入れていたUbuntuではMeCabのインストールが行かなかった（MeCabが見つからなかった）ので、アンインストールしてやり直しました。
リンクの手順ではPower ShellでWSLを有効にしていますが、コントロールパネルからでも（おそらく）同じだと思います。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

![2019-02-11.png](https://qiita-image-store.s3.amazonaws.com/0/271789/c980bfe8-ff15-10b4-d799-a0eb730a5f07.png)

## Ubuntu起動
スタートメニューからUbuntu 18.04を最初に起動すると、下記のようにusernameとpasswordを設定します。

```
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: XXXXXXXX
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
```

## aptitudeインストール
手順ではaptitudeを使うとありますが、`aptitude: command not found`と怒られるので、インストールします。
尚、sudoコマンドを最初に使うときには、passwordを求めらます。

```
sudo apt-get install aptitude
[sudo] password for XXXXXXXX:
```
```
Do you want to continue? [Y/n] y
```

installが終わったら、手順の通りupdateとupgradeします。

```
sudo aptitude update
```
```
sudo aptitude upgrade
```
```
Do you want to continue? [Y/n] y
```

## MeCabインストール
手順の通りMeCabその他をインストールします。Ubuntuを再インストールする前はここでエラーが出てました。

```
sudo aptitude install make automake autoconf autotools-dev m4 mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
```
```
Do you want to continue? [Y/n] y
```
```
sudo sed -i -e 's%/lib/mecab/dic%/share/mecab/dic%' /usr/bin/mecab-config
```

## mecab-ipadic-NEologd をインストール

```
~$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

Cloning into 'mecab-ipadic-neologd'...
remote: Enumerating objects: 75, done.
remote: Counting objects: 100% (75/75), done.
remote: Compressing objects: 100% (74/74), done.
remote: Total 75 (delta 5), reused 55 (delta 0), pack-reused 0
Unpacking objects: 100% (75/75), done.
```
```
~$ cd mecab-ipadic-neologd
~/mecab-ipadic-neologd$ ./bin/install-mecab-ipadic-neologd -n
```
```
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
yes
```

インストール先はオプション未指定の場合 mecab-config に従って決まります。
以下のコマンドを実行すると確認できます。

```
~/mecab-ipadic-neologd$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```

テスト

```
~$ echo "8月3日に放送された「中居正広の金曜日のスマイルたちへ」(TBS系)で、1日たった5分でぽっこ りおなかを解消するというダイエット方法を紹介。キンタロー。にも密着。" | mecab
8       名詞,数,*,*,*,*,*
月      名詞,一般,*,*,*,*,月,ツキ,ツキ
3       名詞,数,*,*,*,*,*
日      名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
さ      動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ      動詞,接尾,*,*,一段,連用形,れる,レ,レ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
「      記号,括弧開,*,*,*,*,「,「,「
中居    名詞,固有名詞,人名,姓,*,*,中居,ナカイ,ナカイ
正広    名詞,固有名詞,人名,名,*,*,正広,マサヒロ,マサヒロ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
金曜日  名詞,副詞可能,*,*,*,*,金曜日,キンヨウビ,キンヨービ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
スマイル        名詞,一般,*,*,*,*,スマイル,スマイル,スマイル
たち    名詞,接尾,一般,*,*,*,たち,タチ,タチ
へ      助詞,格助詞,一般,*,*,*,へ,ヘ,エ
」(     名詞,サ変接続,*,*,*,*,*
TBS     名詞,一般,*,*,*,*,*
系      名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)       名詞,サ変接続,*,*,*,*,*
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
1       名詞,数,*,*,*,*,*
日      名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
たっ    動詞,自立,*,*,五段・タ行,連用タ接続,たつ,タッ,タッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
5       名詞,数,*,*,*,*,*
分      名詞,接尾,助数詞,*,*,*,分,フン,フン
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ぽ      形容詞,接尾,*,*,形容詞・アウオ段,ガル接続,ぽい,ポ,ポ
っ      動詞,非自立,*,*,五段・カ行促音便,連用タ接続,く,ッ,ッ
こり    動詞,自立,*,*,一段,連用形,こりる,コリ,コリ
おなか  名詞,一般,*,*,*,*,おなか,オナカ,オナカ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
解消    名詞,サ変接続,*,*,*,*,解消,カイショウ,カイショー
する    動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
という  助詞,格助詞,連語,*,*,*,という,トイウ,トユウ
ダイエット      名詞,サ変接続,*,*,*,*,ダイエット,ダイエット,ダイエット
方法    名詞,一般,*,*,*,*,方法,ホウホウ,ホーホー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
紹介    名詞,サ変接続,*,*,*,*,紹介,ショウカイ,ショーカイ
。      記号,句点,*,*,*,*,。,。,。
キンタロー      名詞,一般,*,*,*,*,*
。      記号,句点,*,*,*,*,。,。,。
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
も      助詞,係助詞,*,*,*,*,も,モ,モ
密着    名詞,サ変接続,*,*,*,*,密着,ミッチャク,ミッチャク
。      記号,句点,*,*,*,*,。,。,。
EOS
```

## PIPインストール

```
sudo aptitude install python3-pip
```

## mecab-python3インストール
mecab-python3をインストールするのですが、`unable to execute 'swig': No such file or directory`と怒られるのでswigをインストールします。

```
sudo aptitude install swig
```
```
pip3 install mecab-python3
```

pip3でnumpyなど、他に使うライブラリをインストールします。
（尚、pipをアップグレードしようとして何かやらかしたので、以後 --user を付けないとpip3が動かなくなりました…）

## Jupyter Notebookインストール

```
pip3 install ipython[all] --user
```
```
pip3 install jupyter --user
```

## Jupyter Notebook起動
jupyter notebookをタイプすると、下記メッセージが出るので、ブラウザのURLに`http://localhost:8888/?token=7517a29f9ebd226603577be161642b11961463aaf2674d05`を張り付けるとjupyter notebookが起動します。やったー！

```
~$ jupyter notebook
[I 16:16:51.697 NotebookApp] Writing notebook server cookie secret to /home/XXXXXXXX/.local/share/jupyter/runtime/notebook_cookie_secret
[I 16:16:52.689 NotebookApp] Serving notebooks from local directory: /home/XXXXXXXX
[I 16:16:52.689 NotebookApp] The Jupyter Notebook is running at:
[I 16:16:52.690 NotebookApp] http://localhost:8888/?token=7517a29f9ebd226603577be161642b11961463aaf2674d05
[I 16:16:52.691 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

## MeCabテスト

``` python
import MeCab
```

``` python
tagger = MeCab.Tagger("-Ochasen")
node = tagger.parse("坊主が屏風に上手に坊主の絵を描いた")
print(node)
```
```
坊主	ボウズ	坊主	名詞-一般		
が	ガ	が	助詞-格助詞-一般		
屏風	ビョウブ	屏風	名詞-一般		
に	ニ	に	助詞-格助詞-一般		
上手	ジョウズ	上手	名詞-形容動詞語幹		
に	ニ	に	助詞-副詞化		
坊主	ボウズ	坊主	名詞-一般		
の	ノ	の	助詞-連体化		
絵	エ	絵	名詞-一般		
を	ヲ	を	助詞-格助詞-一般		
描い	エガイ	描く	動詞-自立	五段・カ行イ音便	連用タ接続
た	タ	た	助動詞	特殊・タ	基本形
EOS
```
``` python
def tokenize(sentence):
    """日本語の文を形態素の列に分割する関数

    :param sentence: str, 日本語の文
    :return tokenized_sentence: list of str, 形態素のリスト
    """
    node = tagger.parse(sentence)
    node = node.split("\n")
    tokenized_sentence = []
    for i in range(len(node)):
        feature = node[i].split("\t")
        if feature[0] == "EOS":
            # 文が終わったら終了
            break
        # 分割された形態素を追加
        tokenized_sentence.append(feature[0])
    return tokenized_sentence
tokenize("坊主が屏風に上手に坊主の絵を描いた")
```
```
['坊主', 'が', '屏風', 'に', '上手', 'に', '坊主', 'の', '絵', 'を', '描い', 'た']
```

## 今後の抱負
Windows環境でMeCabは無理かなと思っていたのですが、なんとかできてよかったです。
MeCabとPyTorchを組み合わせてNLPをやりたいのですが、PyTorchのインストールはできていますが、WSLでGPUを有効にできていません。そもそもできるのか不明ですが…

``` python
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
```
```
device(type='cpu')
```

## Bash on Ubuntuの起動設定（追記）
作業フォルダを設定したショートカットを使えば、Ubuntuからデフォルトのフォルダを参照しやすい形で起動できます。

![2019-02-11 (2).png](https://qiita-image-store.s3.amazonaws.com/0/271789/5ac679a7-4752-c244-1ba0-162ecdf0c816.png)

GPUは色々やったけど、だめでした。
ネットを見ても、対応していないようですね…