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

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テスト

import MeCab
tagger = MeCab.Tagger("-Ochasen")
node = tagger.parse("坊主が屏風に上手に坊主の絵を描いた")
print(node)
坊主  ボウズ   坊主  名詞-一般       
が ガ が 助詞-格助詞-一般     
屏風  ビョウブ    屏風  名詞-一般       
に ニ に 助詞-格助詞-一般     
上手  ジョウズ    上手  名詞-形容動詞語幹       
に ニ に 助詞-副詞化        
坊主  ボウズ   坊主  名詞-一般       
の ノ の 助詞-連体化        
絵 エ 絵 名詞-一般       
を ヲ を 助詞-格助詞-一般     
描い  エガイ   描く  動詞-自立   五段・カ行イ音便    連用タ接続
た タ た 助動詞   特殊・タ    基本形
EOS
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を有効にできていません。そもそもできるのか不明ですが…

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

Bash on Ubuntuの起動設定(追記)

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

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