mecab-python3をつかってみる

前回の記事でインストールした mecab-python3 の使い方を書いておきます。
MeCabについてはWikiがあるのですが、このライブラリについては詳細なマニュアルはなく、
リポジトリの test.py を読むようにとそっけなく書いてあります。

ただ、実際のところつかのは非常に簡単です。
次の例のようにMeCab.Tagger() と parse を呼び出すだけで結果を得られます。


>>> import MeCab
>>> text = 'すもももももももものうち'
>>> tagger = MeCab.Tagger()
>>> print(tagger.parse(text))
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

各行の出力結果は次の形です。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

注意点としては、 parseした戻り値は一つのテキストなので非常に使いにくいことです。

多くの場合、必要なのは原型の列です。
そこでプログラムでこのテキストから原形の情報を取り出すことになります。
僕はいつも下記のような関数を作って実行しています。


tagger = MeCab.Tagger()


def mecab_tokenizer(text):
    parsed_text = tagger.parse(text)
    parsed_lines = parsed_text.split("\n")[:-2]
    surfaces = [l.split('\t')[0] for l in parsed_lines]
    features = [l.split('\t')[1] for l in parsed_lines]
    bases = [f.split(',')[6] for f in features]
    # ここに、必要な品詞の単語だけ選抜する処理を入れることもある
    result = [b if b != '*' else s for s, b in zip(surfaces, bases)]
    return result

jupyter notebook 上で pycodestyle を使う

テキストエディタで.py ファイルを使う時はコードを綺麗にするために、
pycodestyle (pep8の新しい名前)をよく使います。名前変更の経緯はこちら

これを jupyter notebook でも使えるようにします。
その際に必要になるのが、こちらの pycodestyle_magic というツールです。
flake8というライブラリも必要になるので、一緒に入れます。
(pycodestyleがない場合はそれも必要なのでpipインストールしてください。)

pip install flake8 pycodestyle_magic

使う時は、notebookで事前に読み込み、フォマットをチェックしたいセルで、マジックコマンドを使います。


# magicコマンドを使えるように読み込む
%load_ext pycodestyle_magic

そして、チェックしたいコードが書かれたセルの一番上の行にマジックコマンドを入れて実行します。


%%pycodestyle
#ここにチェックしたいプログラムが書かれている。

問題があれば下記のように警告が表示されます。# の後ろにスペースがありませんでしたね。


2:1: E265 block comment should start with '# '

注意として、この時プログラム自体は実行されないようです。
そのため、スタイルをチェックし終わったら、
マジックコマンドを外して改めてセルを実行する必要があります。

jupyter notebookをバックグラウンドで起動する

普段のPythonプログラミングには、jupyter notebook を使用しています。
AWSのサーバーに立てたnotebookを使っている時は良いのですが、
ローカルのMacで動かしている時は
ターミナルを立ち上げっぱなしにしておかないといけないので少し不便です。

そこで、jupyterをバックグラウンドで動かすようにします。
利用するのは nohupコマンドです。
頻繁に使用するので、下記のような内容でスクリプト化しておくと便利です。


#!/usr/bin/env bash
nohup jupyter notebook >> jupyter.log 2>&1 &

これを実行すると、notebookが立ち上がり、しかも端末を切っても動き続けます。

Macにpyenvとanacondaをインストールする

Mac book Pro のOSをMojave にアップデートして以来、Homebrew関係の環境がおかしくなってしまっているので、最近環境を作り直しています。
その一環でpyenvも入れ直したので記事にしておきます。

まず前提として、pythonには2系と3系があり、macに標準で入っているのは 2系です。


$ python --version
Python 2.7.10

これはOSも使っているそうで、直接このpythonのバージョンをあげるのは良くないこととされているので、
pyenvというツールを使って、独立した環境に3系のpythonを入れます。
また、機械学習等に使うのが目的なので、便利なライブラリが同梱されたディストリビューションである、
Anacondaを使います。

pyenvの導入手順は リポジトリのReadmeの該当箇所を参考に、以下のコマンドを順に実行します。


$ brew update
$ brew install pyenv
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ exec "$SHELL"

.bash_profile への initの追記についてですが、
shell configuration fileの最後に書けと書いてありますので、
今後.bash_profile ファイルを編集するときにこの後ろに何か書いてしまわないように、注意書きか何かコメントしておきましょう。

Please make sure eval “$(pyenv init -)” is placed toward the end of the shell configuration file since it manipulates PATH during the initialization.z

pyenvが入ったら、Anacondaの導入です。 下記コマンドで、インストール可能なバージョンが一覧表示できます。


$pyenv install -l
-- 略 --
  anaconda3-5.1.0
  anaconda3-5.2.0
  anaconda3-5.3.0
  anaconda3-5.3.1

今回は anaconda3-5.3.1 を導入します。


$ pyenv install anaconda3-5.3.1

さらに、導入したバージョンを利用するように設定して、確認します。


$ pyenv global anaconda3-5.3.1
~$ python --version
Python 3.7.0

昔の Anacondaは version表示するとその名前が出てきた覚えがあるのですが仕様が変わったのかもしれませんね。