■デモ
http://needtec.sakura.ne.jp/serif/main.py?AnalyzeCaboCha
■前提
UTF8でコンパイルしたMeCab0.98がインストール済みであること。
インストールしている場所は$HOME/usr/local/とする
■手順
1、CRF++をインストールする
wget http://crfpp.googlecode.com/files/CRF%2B%2B-0.58.tar.gz
tar xzvf CRF++-0.58.tar.gz
cd CRF++-0.58
./configure --prefix=$HOME/usr/local
make install
2. CaboChaをインストールする
MeCab0.98がどうさするCaboCha0.60をUTF8でインストールする
wget http://cabocha.googlecode.com/files/cabocha-0.60.tar.gz
tar xzvf cabocha-0.60.tar.gz
cd cabocha-0.60
./configure --prefix=$HOME/usr/local --with-charset=utf8 --enable-utf8-only LDFLAGS="-L$HOME/usr/local/lib" CPPFLAGS="-I$HOME/usr/local/include" --with-mecab-config=$HOME/usr/local/bin/mecab-config
make
3. ~/.cshrcを編集して環境変数を修正してインストール先にパスが通るようにする
例:
setenv PATH $HOME/local/bin:$HOME/usr/local/bin:$PATH
setenv LD_LIBRARY_PATH $HOME/local/lib:$HOME/usr/local/lib
4.cabocha-0.60/python のsetup.pyを実行してPythonから使用できるようにする
python setup.py install
★インストール先にパスが通っていればcabocha-configを用いてビルド~インストールが行なわれる
Windowsと違ってSetup.pyを修正する必要はない。
5.Pythonで使用する
もし、import CaboChaでこけるばあいは、LD_LIBRARY_PATH が設定されていない。
TODO:
MeCabは-uでユーザー辞書を指定できたが、Cabochaはetc\cabocharcで指定したユーザー辞書しか使えない???
コード
main.py
★ LD_LIBRARY_PATHにcabochaのライブラリへのパスを指定しないと動作しない
#! /usr/bin/env -S LD_LIBRARY_PATH=/home/needtec/usr/local/lib:/home/needtec/local/lib /usr/local/bin/python
# coding=utf-8
import simplefw
simplefw.doRequest()
AnalyzeCaboCha.py
0.60だと、Tokenのsurfaceに2回アクセスすると落ちる
normalized_surface を使用すること。
# coding=utf-8
from simplefw import Controller
import cgi
import MeCab
import CaboCha
import os
import re
class AnalyzeCaboCha(Controller):
def index(self):
form = cgi.FieldStorage()
data = []
if form.has_key("serif") :
data = self.get_morpheme( form["serif"].value )
tmpl = self.template_loader.load('AnalyzeCaboCha.tmpl')
stream = tmpl.generate(data = data)
html = stream.render("html")
print html
def get_morpheme(self,sentence):
try:
c = CaboCha.Parser("")
tree = c.parse(sentence)
data = []
for i in range(tree.chunk_size()):
row=[]
chunk = tree.chunk(i)
s = ""
for j in range(chunk.token_pos,chunk.token_pos + chunk.token_size):
t = tree.token(j)
# 0.60だとt.surfaceだと2回アクセス時に落ちる
s = s + t.normalized_surface
r = ""
if chunk.link != -1:
rchunk = tree.chunk(chunk.link)
for j in range(rchunk.token_pos,rchunk.token_pos + rchunk.token_size):
t = tree.token(j)
# 0.60だとt.surfaceだと2回アクセス時に落ちる
r = r + t.normalized_surface
row.append(str(i))
row.append(s)
row.append(r)
row.append(str(chunk.score))
data.append(row)
except RuntimeError, e:
print "RuntimeError:", e;
return data