2017年5月25日木曜日

JUMAN で自然言語処理(1) - Windows に JUMAN を入れ、Python で処理

これまた学校で自然言語処理をするプログラムを作れとの課題が出ましたので作成過程を書こうと思います。

自然言語処理とは…われわれの使う言語をコンピュータにうまく理解させることだと思ってます。
日本語を処理するためには、膨大なデータとたいへん複雑な処理が必要ですが、いろいろなツールが公開されているためこれを使って日本語を処理したうえで何かするプログラムを作れます。

今回は京都大学の JUMAN を使えるようにするまで。
環境は Windows 10、使用言語は Python です。初めに言っておくと全然うまくいかなかったので妥協しました。全然うまくいかないので妥協したいという方は参考にしてください。

 

1. Windows に JUMAN を入れて、Python3 で使いたい

このサイトを見てやりました。
参考: Windows 7 64bit に JUMAN/KNP(構文解析器)を導入しました
ここまではダウンロードするだけなのでよゆーだと思います。コマンドプロンプトで確認もできます。
ここからが大変です。
Python(3) で使うのが非常に面倒なのです。
参考: 形態素解析システムJUMANをpython3で使う
上記リンクの環境は Ubuntsu。僕は Windows でやろうとしています。
いろいろ調べてると Windows で Python をやるのはマゾとか頭おかしいとか出てきます。
確かにモジュールの入れ方がさっぱりわからない。僕はそこで詰みました。
pip を入れてみても utf-8 やらのデコード関連でのエラーが絶えません。堪えられません。
冒頭でも述べたようにこのへんはきれいに解決できてないのでもし成功してる方いればやり方を聞きたいです。

2. 諦めて Python からコマンドプロンプトに介入する

コマンドプロンプトで juman って打てば動くんだから Python から juman コマンド打てばええやん!
と思ってやってみたら実際ちゃんと動きました。
バカみたいですけどその辺の練習にもなるしインストールは最小限で済むしありだと思います。
以下、介入の仕方
import subprocess

#入力
cmd = "juman"
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

#出力
str = input()
proc.communicate(str.encode('cp932'))

repr = proc.communicate()
line = repr[0].decode('cp932').split("\r\n")

参考: http://ja.pymotw.com/2/subprocess/
Python では subprocess モジュールをインポートすることでコマンドプロンプトとやり取りができるようになるそうです。今回はcmd = "juman"を呼び出した後、さらに入力したり出力を取り出したりしなければならないので、 subprocess.Popen を使うとよいです。PIPE とかはそういう風に書けば動くとしか理解してません。
Popen した後は communicate でプロセスとのやり取りができます。
入出力では encode や decode を忘れないようにしましょう。windows なら上のようにcp932かあるいは 'shift_jis' でエンコード/デコードすればうまくいくと思います。
出力では最後の行みたいに書くことで行ごとにリストに格納されますがその辺はお好みで。

これを実行すると juman を打った後の入力待ち状態でプログラムがスタートするので、てきとうに日本語を打ち込めば解析してくれます。やったね、PythonでJUMANが使えた!!!

…なんか違う気がするけども、今回は動けばいいということで。
次回からJUMANを使って何をするのか書いていきたいです。

0 件のコメント:

コメントを投稿