形態素解析システムJUMANをpython3で使う

公式のpythonバインディングは、python2 onlyのためpython3用に若干修正して利用する。環境はUbuntu 14.04LTS。

 

1. JUMANのインストール

$ sudo apt-get install juman

動作確認。

$ juman

libjumanのエラーが出る場合は追加でインストールする。

$ sudo apt-get install libjuman

 

2. pythonバインディングの修正

黒橋・河原研究室のKNPのサイトからpython2のバインディングをダウンロードして解凍。

$ curl -L -O http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/pyknp-0.1.zip&name=pyknp-0.1.zip
$ unzip pyknp-0.1.zip

2to3でpython3用にコンバート。

$ cd ku_nlp-pyknp-a32529dbce0d/
$ 2to3 -w ./

さらにpyknp/juman/juman.py, pyknp/juman/morpheme.pyを修正する必要がある。

差分をパッチ(git diff –no-prefix)にまとめたので、これダウンロードしてku_nlp-pyknp-a32529dbce0d/直下で適用。

$ patch -p0 < pyknp4python3.patch

インストール。

$ sudo python3 setup.py install

 

3. 動作確認

下記をtest.pyとして作成。

from pyknp import Juman 
 
juman = Juman() 
result = juman.analysis('今日はいい天気ですね。') 
 
for mrph in result.mrph_list(): 
    print("見出し:{}, 読み:{}, 原形:{}, 品詞:{}, 品詞細分類:{}, 活用型:{}, 活用形:{}, 意味情報:{}, 代表表記:{}".format(
    mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))

動作確認。

$ python3 test.py

出力結果は以下。

見出し:今日, 読み:きょう, 原形:今日, 品詞:名詞, 品詞細分類:時相名詞, 活用型:*, 活用形:*, 意味情報:代表表記:今日/きょう カテゴリ:時間, 代表表記:今日/きょう
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:いい, 読み:いい, 原形:いい, 品詞:形容詞, 品詞細分類:*, 活用型:イ形容詞イ段, 活用形:基本形, 意味情報:代表表記:良い/よい 反義:形容詞:悪い/わるい, 代表表記:良い/よい
見出し:天気, 読み:てんき, 原形:天気, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:天気/てんき カテゴリ:抽象物, 代表表記:天気/てんき
見出し:です, 読み:です, 原形:だ, 品詞:判定詞, 品詞細分類:*, 活用型:判定詞, 活用形:デス列基本形, 意味情報:NIL, 代表表記:
見出し:ね, 読み:ね, 原形:ね, 品詞:助詞, 品詞細分類:終助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:。, 読み:。, 原形:。, 品詞:特殊, 品詞細分類:句点, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:

 

■参考文献

Webサイトをselenium + Xvfb + sshでpythonから操作する

SeleniumのWebDriverを使って、webページをpythonプログラム内から操作する。

SSH先のサーバでディスプレイがない環境を想定。

1. Seleniumのインストール

公式サイトに従ってSeleniumをインストール。

$ pip3 install -U selenium

 

2. Xvfbのインストール

仮想ディスプレイのXvfbをインストールする。

$ sudo yum install xorg-x11-server-Xvfb
$ sudo yum -y groupinstall "X Window System"
$ sudo yum -y groupinstall "Japanese Support"

~/.bashrcに以下を追記。

export DISPLAY=:1

Xvfbを起動。nohubしなくてもssh終了時に強制終了しない。

$ Xvfb :1 -screen 0 1024x768x24 &

上記Xvfbコマンドでmachine-idなしエラーが発生する場合は下記。

$ su -
# dbus-uuidgen > /var/lib/dbus/machine-id

 

3. サンプル実行

# 日本語環境
fp = webdriver.FirefoxProfile()
fp.set_preference('intl.accept_languages', 'ja-JP, ja')
# ドライバ取得
browser = webdriver.Firefox(firefox_profile=fp)
# javascriptなどの動的ページで要素がない場合5秒待つ。
browser.implicitly_wait(5)
# Yahooを表示してから、天気のページへ。
browser.get('https://yahoo.co.jp/')
browser.find_element_by_xpath('//*[@id="yahooservice"]/ul/li[6]/a').click()
# 画面キャプチャー
browser.save_screenshot(file_name)
# 終了(ブラウザを閉じる)
browser.close()

 

参考

Mac, HomebrewでPL/Pythonを利用する

Mac OS 10 Yosemite + HomebrewでPostgreSQLを利用する。

Pythonは、python3をhomebrewでインストール済みとする。

1. PostgreSQLのインストール

$ brew install --with-python postgres

postgresでPL/Pythonを利用するために–with-pythonオプションを付加する。

以前の設定が残っている場合削除する。

$ rm -rf /usr/local/var/postgres

データベースの初期化。

-Uオプションでしていしたユーザ名がスーパーユーザとして追加される。

指定しない場合、ログインユーザ名が使われる。

$ initdb -U postgres /usr/local/var/postgres

起動。

$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

psqlできることの確認とユーザが作られていることの確認。

$ psql -U postgres
postgres=# \du

以下のエラーがでてpsqlできない場合は、古いpostgresプロセスが生きている可能性があるのでkillしてから再トライ。

psql: FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory

データベースの作成。

$ createdb -U postgres -E utf-8 hoge_db

終了。

$ pg_ctl stop

 

2. PL/Pythonの設定

現在使えるPL一覧を確認。通常PL/PgSQLのみ。

$ createlang -U postgres --list hoge_db
 Name | Trusted?
 ---------+----------
 plpgsql | yes

PL/Pythonを追加する。

$ createlang -U postgres plpython2u hoge_db

あとは言語としてpythonが使える。

 

参考

PythonからRを利用

PythonからRを利用する。

ライブラリはPypeR(PYthon-piPE-R), RPy2がメジャーなようだが、Google Trendsによると下図の状態なのでPypeRを使う。

スクリーンショット 2014-12-13 21.57.23

 

1. インストール

公式サイトに従って行う。

$ pip3 install PypeR

公式サイトの記述はいたってシンプル。同梱のtest.pyを見ろとのこと。

 

2. 基本的な連携

準備

from pyper import *
r = R()

Rコード実行

r('a <- 1; b <- 2; a + b')

or

r(['a <- 1'], ['b <- 2'], ['a + b'])

値の設定

r['a'] = x

or

r.a = x

値の取得

x = r['a']

or

x = r.b

少し複雑なコードの実行。

val = r['(2*pi + 3:9)/5']

3. 実践

Rのnnet(ニューラルネットワーク)を使ってXOR問題を解く。

from pyper import *
import numpy
r = R()
r('library(nnet)')
data = [[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]]
r['xor.data'] = numpy.array(data)
r('xor.data <- data.frame(xor.data)')
r('xor.nnet

XORの場合、過学習を考えるとsoftmaxの方がいい。

上記と同様のRコードは下記。

library(nnet)
xor.data = data.frame(matrix(c(0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0), 4, 3))
xor.nnet <- nnet(X3~., size = 2, decay = 0, data = xor.data)
xor.pred <- predict(xor.nnet, xor.data)
xor.pred

参考

Pylearn2でニューラルネットワーク(python3 + mac)

Pybrainのニューラルネットワークが遅すぎたので(Cで実装されたR nnetの100倍くらい?)、Deep learningで有名なPylearn2を使う。(CやGPU利用で高速化されている)

 

1. 依存ライブラリのインストール

Theano, Cythonをインストール。Theanoはpip3でインストールするとpython3かCコンライラ関連でエラーになるので、gitから直接インストール。

$ pip3 install --upgrade --no-deps git+git://github.com/Theano/Theano.git
$ pip3 install Cython

 

2. Pylearn2のインストール

公式ドキュメントに従って進める。

$ git clone git://github.com/lisa-lab/pylearn2.git
$ cd pylearn2
$ python setup.py develop

 

3. ニューラルネットワーク

Pylearn2は通常YAML形式で構造などを記述するが、慣れないのでここGist)を参考に普通のPythonコードっぽく構築する。

print文だけ、python3の形式に変更する必要がある。

 

参考

Vimのカラースキーマを変更する

画像

Vimのカラーを変更する。

 

1. カラースキーマのダウンロード

ここで紹介されている人気のmolokaiをダウンロード。

 

2. スキーマの設定

$ mkdir ~/.vim/colors
$ mv molokai.vim ~/.vim/colors/

~/.vimrcに以下を記載

colorscheme molokai

3. 設定後

スクリーンショット 2014-12-08 0.03.58

参考

Vimでpython開発環境を準備する

mac + vimでpython3の開発環境を準備する。(python3自体のインストールは$ brew install python3)

1. vimのインストール

macにデフォルトでインストールされているvimはクリップボード連携がサポートされていないため、homebrewでvimをインストールする。

この際、単純brew install vimだとpythonがサポートされていない(jedi-vimで必要な)ため、以下のオプションでインストール。すでにbrewでインストール済みの場合は事前にbrew remove vimする。

$ brew install vim install --enable-interp=python,python3

pythonをサポートしていることを確認。+pythonならサポート。-pythonだとサポートしていない。

$ vim --version | grep python
+python

 

2. プラグインのインストール

このエントリーのNeoBundleで下記のプラグインをインストールする。

  • quickrun → コードの簡易実行
  • jedi-vim → 入力補完
  • syntastic → 文法チェック
  • unite → unite-outlineに必要
  • unite-outline → アウトライン表示(originalの’h1mesukeha’はメンテナンスされていないためuniteのauthorのShougo/unite-outlineを使用)

3. quickrunの設定

.vimrcに下記を記載。実行時に縦分割でなく、横分割する。

let g:quickrun_config = {}
let g:quickrun_config = {'*': {'split': ''}}

4. jedi-vimの設定

mac + brewインストールのpython3を使用している場合、jedi-vimから呼び出されるpythonがdefaultのpython2.xを利用していることがあるのため、~/.vim/bundle/jedi-vim配下で以下を実行。

$ git submodule update --init

5. unite-outlineの設定

unite-outlineをctrl + oで実行できるようにする。.vimrcに以下を記載。

nnoremap <C-o> :Unite -vertical -no-quit -winwidth=32 outline<Esc>

6. 設定後

スクリーンショット 2014-12-08 0.06.58

参考

Vim PluginをNeobundleで管理する

Vimの管理にVundleを導入して、管理を容易にする。

1. インストール

公式のマニュアルに従って行う。

$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

~/.vimrcに以下を追記。今回は、quickrun, jedi-vim, syntastic, unite-outline(requiring unite)を管理対象にする。

" Note: Skip initialization for vim-tiny or vim-small.
if !1 | finish | endif

if has('vim_starting')
  set nocompatible               " Be iMproved

  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" My Bundles here:
" Refer to |:NeoBundle-examples|.
" Note: You don't set neobundle setting in .gvimrc!
" Run commands quickly
NeoBundle 'thinca/vim-quickrun'
" autocompletion
NeoBundle 'davidhalter/jedi-vim'
" syntax checking plugin
NeoBundle 'scrooloose/syntastic'
" Outline plugin
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/unite-outline'

call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck

2. 実行

vimを起動するか、起動時にインストールNoにした場合は起動後に以下のインストールコマンドでインストール可能。

操作 コマンド 備考
インストール :NeoBundleInstall
アップデート :NeoBundleUpdate
アンインストール :NeoBundleClean .vimrcの記述削除後に実行

 

参考

カテゴリー: Vim

Pybrainでニューラルネットワーク

Python3、ニューラルネットワークで機械学習する。
ニューラルネットワーク自体は古い手法だが仕組みは簡単なので、ざっとした手元検証用。

1. インストール
ニューラルネットワークでメジャーなPybrainをインストール。

pip3だとpython2対応のpybrainになるため、gitからコピーしてインストールする。

$ git clone git://github.com/pybrain/pybrain.git
$ cd pybrain
$ python3 setup.py install

あとは公式のdocに従って下記の通り進める。

# 公式ドキュメントがpythonコマンドを使っているところはpython3を使用する。

2-a. シンプルな方法でバックプロパゲーション

xor問題を説く。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, TanhLayer, SoftmaxLayer, BiasUnit
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# 入力ユニット2、隠れユニット2、出力ユニット1、隠れと出力にバイアス入力有り。
nn = buildNetwork(2, 2, 1, bias=True)
# 訓練データ
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# バックプロパゲーションをセット。学習係数と安定化係数を設定。
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
# 1,000回繰り返し訓練
trainer.trainEpochs(1000)
# 結果出力
print(nn.activateOnDataset(ds))

結果は以下で、正しくパターン認識できている。

[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]

 

2-b. 柔軟な方法でバックプロパケーション

ユニットの接続などを柔軟に行える方法で、2-aと同じネットワークを作る。

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, SoftmaxLayer, BiasUnit
from pybrain.structure import FullConnection
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# ベースとなるフィードフォワードネットワークを作成
nn = FeedForwardNetwork()
# 入力、バイアス、隠れ、出力レイヤーを作成
input = LinearLayer(2)
bias = BiasUnit()
hidden = SigmoidLayer(2)
output = SigmoidLayer(1)
# ネットワークにレイヤーを追加。
nn.addInputModule(input)
nn.addModule(bias)
nn.addModule(hidden)
nn.addOutputModule(output)
# レイヤーを接続。バイアスは隠れ層と出力層両方に接続。
nn.addConnection(FullConnection(input, hidden))
nn.addConnection(FullConnection(bias, hidden))
nn.addConnection(FullConnection(hidden, output))
nn.addConnection(FullConnection(bias, output))
# 学習前の準備
nn.sortModules()
# 学習データの作成
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# 学習
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
trainer.trainEpochs(1000)
# テスト
print(nn.activateOnDataset(ds))

結果は2-aと同様。

 

参考