XREA で Python・MeCab を触ってみる・ついでに Python CGI で動かしてみる

s15 サーバの頃からお世話になり続けている XREA。Perl・PHP・Ruby・Python などの言語で実装した CGI の他、MySQL・PostgreSQL が使える。さらに、ひっそりと形態素解析ツールの MeCab までプリインストールされている。

コレは使うっきゃない、ということで確かめてみた。

目次

MeCab を試してみる

まずは XREA サーバに SSH 接続して、MeCab を試してみる。XREA サーバに SSH 接続する方法は以下の記事で紹介したとおり。

# LANG 環境変数は以下のとおりであること・設定されていなければ設定しておく
$ echo $LANG
ja_JP.UTF-8

# MeCab が入っていることを確認する
$ mecab --version
mecab of 0.996

# UTF-8 でエンコードされた辞書ファイルを参照してコマンドラインで動かしてみる
$ mecab -d /usr/lib64/mecab/dic/ipadic/
# Ctrl + D で抜ける

こんな感じ。

Python から MeCab を触ってみる

続いて、XREA にプリインストールされている Python の環境を確認する。

$ type python
python は /usr/local/bin/python です
$ python --version
Python 2.7.5

$ type python3
python3 は /usr/local/bin/python3 です
$ python3 --version
Python 3.6.8

このように、Python2 系と Python3 系が導入されている。

Python3 で MeCab を使うため、次のように mecab-python3 をインストールする。

$ python3 -m pip install mecab-python3 --user

この時点で、python3 コマンドで対話式プロンプトを立ち上げると、import mecab と出来るようになっている。

今回はもう少し進んで、Python CGI として実行してみる。

.htaccess を編集して Python CGI を有効にする

.htaccess ファイルを作り、.py 形式のファイルを CGI として処理するようにしておく。コレを書かないと、.py ファイルにアクセスしてもその内容がテキストファイルのようにそのままレスポンスされて終わってしまう。

# `public_html/` 直下に配置する
$ touch .htaccess
# 以下を記す
AddHandler cgi-script .py

MeCab を使用する Python CGI を書いてみる

次のように Python CGI を書いてみよう。

#!/usr/local/bin/python3

# 日本語文字を表示するための設定
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = 'utf-8')

import cgi
import MeCab
mecab = MeCab.Tagger('-d /usr/lib64/mecab/dic/ipadic/')

print('Content-type: text/html; charset=UTF-8\n')
print(mecab.parse('MeCab を使った形態素解析のテストです'))

固定文言を mecab.parse() し、その結果を出力しているだけ。

$ chmod 755 example-mecab.py

実行権限を付与したら、ブラウザでアクセスして動作確認してみよう。

もしも上手く動作していない場合は、import cgi の次の行あたりに以下を追加し、スタックトレースを表示できるようにして詳細を確認してみると良いだろう。構文エラーなどは検知できないが、実行時エラーは確認できる。

# CGI エラー時にデバッグ情報を表示する
import cgitb
cgitb.enable()

ココまでの内容で参考にした文献は以下のとおり。特に「日本語文字を表示するための設定」というのがないと、日本語文字列を print した瞬間に以降の行が動かなくなってしまって困っていた。

今回はココまで

というワケで、XREA にプリインストールされている MeCab を使ってみた。ついでに XREA 上で Python を CGI として実行できることまで確認した。

スクリプトを調整していけば、リクエストパラメータを mecab-python3 経由でパースさせることもできるので、様々な使い道が考えられそうだ。