実験結果
http://needtec.sakura.ne.jp/serif/main.py?AnalyzeSentence
手順:
1. UTF-8のMeCab0.98を取得して自分のディレクトリ内にインストールする
http://www.mwsoft.jp/programming/munou/mecab_sakura.html
MeCabは0.9xってのが最新だが、gcc4.2でmakeできないので0.98を入れておく
強行するとundefined reference to `__sync_val_compare_and_swap_4' ってエラーがでる。
2.IPA 辞書の辞書をshつ置くしてUTF8でmakeする。
http://sakuratan.biz/archives/1349
☆さくらサーバーにはMeCabとIPAの辞書は入っているがEUCなので色々めんどくさいので、UTF8のやついれとく。
3.mecab-python-0.98をいれとく
http://sourceforge.jp/frs/g_redir.php?m=jaist&f=%2Fmecab%2Fmecab-python%2F0.98%2Fmecab-python-0.98.tar.gz
こんなかんじでビルドしておく
$ tar -xzf mecab-python-0.98.tar.gz
$ cd mecab-python-0.98
$ python setup.py build
$ sudo python setup.py install
4.ユーザー辞書を作っておく
下のページ参考にutf-8のCSVファイルから任意のディレクトリにユーザー辞書を作っとく
http://blogs.yahoo.co.jp/igproj_fusion/14949865.html
5.Pythonで実装する。
・UTF-8でやらないとだめ。
・ MeCab.Tagger()をするさいに-uでユーザ辞書、-dでシステム辞書のパスを指定可能
・sys.path.append()で外部モジュールを追加しとかないとimportで認識しないかも。
・なるべく環境に依存しないように、iniファイルに切り出した。
iniファイルとmain.pyのshebangのパスを直せばWindowsでも動く。
main.py
#!/usr/local/bin/python
#!C:\Python27\python.exe
# coding=utf-8
import simplefw
simplefw.doRequest()
simplefw.py
# coding=utf-8
import os
import sys
import codecs
import ConfigParser
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = codecs.getwriter('utf-8') (sys.stdout)
class Controller:
""" Controller
あらゆるコントローラの規定クラスになります
Attributes:
conf : 設定ファイルのConfigParserです
template_loader : genshiのテンプレートローダです。
"""
def __init__(self, conf,template_loader):
self.conf = conf
self.template_loader = template_loader
def doRequest():
conf = ConfigParser.SafeConfigParser()
conf.read("serif.ini")
try:
i = 0
path = conf.get('system', 'path' + str(i))
while path != "":
i = i + 1
sys.path.append(path)
path = conf.get('system', 'path' + str(i))
except ConfigParser.NoOptionError as e:
pass
from genshi.template import TemplateLoader
loader = TemplateLoader( os.path.dirname(__file__) )
print "Content-type: text/html\n"
#params=os.environ['PATH_INFO'].split('/')
module_name = os.environ['QUERY_STRING']
class_name = os.environ['QUERY_STRING']
module = __import__(module_name, globals(), locals(), [class_name], -1)
classtype = getattr(module, class_name)
main=classtype(conf,loader)
main.index()
AnalyzeSentence.py
# coding=utf-8
from simplefw import Controller
import cgi
import MeCab
import os
import re
class AnalyzeSentence(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('AnalyzeSentence.tmpl')
stream = tmpl.generate(data = data)
html = stream.render("html")
print html
def get_morpheme(self,sentence):
usrdicdir = os.path.expanduser(self.conf.get('MeCab', 'user_dict' ))
dicdir = os.path.expanduser(self.conf.get('MeCab', 'sys_dict' ))
if dicdir == "":
p = "-u%s" % (usrdicdir)
else:
p = " -d%s -u%s" % (dicdir ,usrdicdir)
try:
t = MeCab.Tagger(p)
m = t.parseToNode(sentence)
data = []
while m:
feature = m.feature.split(',')
row = []
row.append(m.surface)
for f in feature:
row.append(f)
data.append(row)
m = m.next
except RuntimeError, e:
print "RuntimeError:", e;
return data
AnalyzeSentence.tmpl
<!DOCTYPE html>
<html xmlns:py="http://genshi.edgewall.org/">
<head>
<title>Mecab</title>
<link rel="stylesheet" href="base.css" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="contents">
<h1>セリフの解析</h1>
<form action="main.py?AnalyzeSentence" method="post">
<p>セリフ <input name="serif" size="50" value=""/></p>
<p><input type="submit" name="mecab" value="解析" /></p>
</form>
<table border='1'>
<tr>
<th>表層形</th><th>品詞</th><th>品詞細分類1</th><th>品詞細分類2</th><th>品詞細分類3</th><th>活用形</th><th>活用型</th><th>原形</th><th>読み</th><th>発音</th>
</tr>
<py:for each="tr in data">
<tr>
<py:for each="td in tr">
<td>
${td}
</td>
</py:for>
</tr>
</py:for>
</table>
</div>
</body>
</html>
serif.ini
[MeCab]
user_dict = ~/dev/serif/serif.dic
sys_dict =/home/needtec/lib/mecab/dic/ipadic-utf8
[system]
path0 = /home/needtec/local/lib/python/site-packages/Genshi-0.6-py2.7.egg
path1 = /home/needtec/local/lib/python2.7/site-packages