<   2013年 06月 ( 15 )   > この月の画像一覧
さくらインターネットのスタンダードプランで日本語の入力と表示をする。
・PoderosaでUTF-8の接続をする。

・vimをインストールする
http://blog.o-live.jp/development/vim-on-sakura/

・環境変数LANGを設定する。
 .cshrcに下記を設定

setenv LANG ja_JP.UTF-8


接続しなおすと、これで日本語入力と表示ができるようになる。
[PR]
by mima_ita | 2013-06-19 14:51 | 実験
mimetexを試してみる
mimetexを使用するとHTMLのimgタグを使用して数式を記述することができます。


<img src="http://needtec.sakura.ne.jp/mimetex/mimetex.cgi?
x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}">





■導入方法
基本的にダウンロードしてきて、自分のWEBサーバーのcgiが動く場所に設置する。
バイナリでの配布もしてあるので、Windowsはそれを設置したほうが楽。

しかし、デフォルトの場合、設置したサーバー以外のサーバーから使用するとエラーとしてはじくようになっている。
特定のドメインから使用したい場合は下記のようにコンパイルを行う。


%cc -DAA -DREFERER=\"needtec.sakura.ne.jp,needtec.exblog.jp\" mimetex.c gifsave.c -lm -o mimetex.cgi


DREFERERで使用を認めるドメインを記述している。これはコンマ区切りで複数していすることができる。

■記述してみる
記法の実験ができるようにしてみた。
http://needtec.sakura.ne.jp/mimetex/index.php
[PR]
by mima_ita | 2013-06-19 12:11 | 実験
Excel VBAでメモリをダンプしてみる
■目的
ExcelVBAで変数のメモリをダンプしてみる。
これは非公開の関数を使用しているので、製品に組み込むような真似はすべきではない。


■コード

Option Explicit

#If VBA7 Then 'Office10 以降
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32.dll" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As LongPtr)
#Else ' Office 32-bit
Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)
#End If

#If VBA7 Then 'Office10 以降
Public Sub DumpMemory(ByVal offset As LongPtr, ByVal size As Long)
#Else ' Office 32-bit
Public Sub DumpMemory(ByVal offset As Long, ByVal size As Long)
#End If
ReDim data(1 To size) As Byte
Call RtlMoveMemory(VarPtr(data(1)), offset, size)
Dim i As Long
Dim j As Long
Dim hVal As String * 2
Dim add As String * 8

Dim ret As String
add = hex$(offset)
ret = add
For i = 1 To size
If j = 8 Then
j = 0
add = hex$(UnsignedAdd(offset, i))
ret = ret & vbCrLf & add
End If
hVal = hex$(data(i))
ret = ret & hVal & " "
j = j + 1
Next i
Debug.Print ret
End Sub
Private Function UnsignedAdd(ByVal Start As Long, ByVal Incr As Long) As Long
Const SignBit As Long = &H80000000
UnsignedAdd = (Start Xor SignBit) + Incr Xor SignBit
End Function


数値の変数の例:

Dim i As Long
i = 10
DumpMemory VarPtr(i), LenB(i)


出力結果

26F5D0 A 0 0 0

・・・0x000A すなわち10をあらわしている。


Stringの変数の例:

Dim s As String
s = "1あ3"
DumpMemory ByVal (StrPtr(s)), LenB(s)


59A590C 31 0 42 30 33 0

Unicodeのコード表と付き合わせると以下のようになる
http://ash.jp/code/unitbl21.htm
0x0031...UTF-16の「1」
0x3042...UTF-16の「あ」
0x0033...UTF-16の「3」


■説明
VBAでは基本的にポインタは使用できない。
だが、隠し関数として以下の3つが存在する

・VarPtr
変数のアドレスを返す

・StrPtr
UniCodeの文字列バッファのアドレスを返す
固定長の文字列を指定した場合、自動的に可変長の文字列を作成してそのアドレスを返す。
つまり、固定長の文字列に対しては使用すべきではない。

この挙動を確認するには次のコードを実行すればよい。

Dim fs As String * 5
Dim vs As String
fs = "12"
vs = "34"

Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))
Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))
Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))

可変文字列の場合は、アドレスは変更されないが、固定文字列はStrPtrを実行するたびにそのアドレスが代わっているのが確認できる。

可変文字列と固定文字列は同じように見えるが、低レベルでメモリを操作する場合は根本的に違うということを認識しなければならない。




・ObjPtr
パラメーターとしてオブジェクト変数名を取得し、このオブジェクト変数によって参照されるインターフェイスのアドレスを取得する。


なお、配列のアドレスを取得したい場合はVarPtrArrayをせんげんして使用する

Private Declare Function VarPtrArray Lib "VBE7" Alias "VarPtr" (ByRef Var() As Any) As LongPtr

Dim a(0 To 10) As Byte
Debug.Print hex(VarPtrArray(a))

[PR]
by mima_ita | 2013-06-19 06:48 | VBA
tf-idfで文章の重み付けをする
■説明
MeCabで形態素解析を行い、文章中に含まれる名詞にかんしてtf-idfで重み付けをする。
nltk.TextCollection() を用いることで計算はおこなえる。

tf: Term Frequency 単語出現頻度
 文章jにおける単語iの出現回数 / 全文章で出現する総単語数

idf: Inverse Document Frequency 逆文章頻度
log(総ドキュメント数/単語iを含むドキュメント数)

tf-idf : tf * idf
 idfを逆数で取得しているのは、他の文章でよく使われる単語は、特定の文章の特徴をあらわすことにならないことを現している。
 つまり、他の文章で使われなくて、調査対象の文章でよく使われる単語は重くなる。

■コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import MeCab
import nltk
from collections import defaultdict
mecab = MeCab.Tagger("")

class tf_idf_result:
def __init__(self,doc):
self.text = ''.join(doc)
self.term_scores = defaultdict(int)

def set_score(self,term,score):
self.term_scores[term] = score

def get_tokens(text):
"""
テキストから単語のリストを取得する
text:UTF-8の文章
return 単語のリスト
"""
node = mecab.parseToNode(text)
words = []
while node:
fs = node.feature.split(",")
if (node.surface is not None) and node.surface != "" and fs[0] in [u'名詞']:
words.append(node.surface)
node = node.next
return words


all_text = [u'ここはまりさのゆっくりプレイスなのぜ!痛いめにあいたくなかったら、ゆっくりできない糞人間はあまあまをおいてさっさと出ていくのぜ!',
u'我輩は、まりさである。お飾りはない。どこで生まれたかも見当もつかぬ。なんでもゆっくりプレイスで「ゆんやー、ゆんやー」と泣いていたことだけは記憶している。我輩はここで初めて人間というものをみた。',
u'まりさは激怒した。かならずかの邪智暴虐の人間を除かねばらぬと決意した。まりさには政治がわからぬ。まりさは、町のゆっくりである。歌を歌い、れいむと遊んで暮らしていた。しかし、ゆっくりできないことには、ゆっくり一倍敏感であった。今日未明、まりさは村を出発して迷子になりました。おしまい。',
u'むかしむかし、あるところに、ありすとまりさとが住んでいました。ありすはゆっくりしに、まりさは川へゆっくりしに行きました。まりさが川でゆっくりしていると、ドンブラコ、ドンブラコと大きなれいむが流れてきました。沈みました。おしまい。',
u'むかしむかし、ある村に、心のやさしい、まりさというゆっくりがいました。まりさが海辺をとおりかかると、子供たちがゆっくり・れいむを捕まえていました。そばによってみると子供たちがみんなで、ゆっくり・れいむをいじめていました。「やい、くそ人間 。さっさとれいむから手を離すのぜ!さもないとこの最強のまりさ様がせいっさいするのぜ!」逆に制裁されました。おしまい',
u'ここはれいむのゆっくりプレイスだよ!ゆっくりしないででていってね!可愛くってごめんねー!']

docs = []
for txt in all_text:
docs.append( get_tokens(txt.encode('utf-8')) )

col = nltk.TextCollection(docs)

results = []

# tf : Term Frequency 単語出現頻度 文章jにおける単語iの出現回数/全文章で出現する総単語数
# idf : Inverse Document Frequency 逆文章頻度 log(総ドキュメント数/単語iを含むドキュメント数)
# tf-idf : tf * idf
for doc in docs:
ret = tf_idf_result(doc)
terms = list(set(doc))
for term in terms:
#print "%s : tf-idf%f tf;%f idf:%f" % (term, col.tf_idf(term, doc), col.tf(term, doc), col.idf(term, doc))
ret.set_score(term,col.tf_idf(term, doc))
results.append(ret)

i = 1
for ret in results:
print "(%d)の上位100位キーワード"%(i)
j = 1
for k, v in sorted(ret.term_scores.items(), key=lambda x:x[1], reverse=True):
print " %s : %f" % ( k, v )
if j > 100:
break
j = j + 1
i = i + 1



[PR]
by mima_ita | 2013-06-18 23:10 | python
テキストを類似度毎に階層的クラスタリングで分類してみた
■説明
・それぞれの文字列をmasiで類似度を計測する
 これは前回の記事参照

・clusterモジュールのHierarchicalClusteringを使用して階層的クラスタリングで分類する
easy_install cluster でインストールできる
 このアルゴリズムの説明は以下参照
 http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/hierarchical.html

 HierarchicalClusteringのインスタンスを作るとき、第三引数で"single","complete","average"の3種類が選択できる。デフォルトはsingle. クラスターとクラスターを比較するさいに、最も近い距離動詞のアイテムで比較するか、平均するか、遠くのものを選択するかを選べる。

 階層型クラスタリングは全てのノードがそれぞれのノードに対する距離を計算しているのでアホみたいに遅い。

・pydotを経由してGraphVizで階層構造を表現する
 以下をダウンロードしてインストールする。
 http://www.graphviz.org/
 http://pyparsing.wikispaces.com/
 http://code.google.com/p/pydot/
 ★PATH を設定してdot.exeへのパスを設定しておく
 GraphVizで日本語を表示したい場合は、UTF-8のコードで記述して、ノードやエッジを作る際に、fontnameを指定してやればよろしい。

■コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from cluster import HierarchicalClustering
import pydot
import MeCab
import nltk

mecab = MeCab.Tagger("")



def get_tokens(text):
"""
テキストから単語のリストを取得する
text:UTF-8の文章
return 単語のリスト
"""
node = mecab.parseToNode(text)
words = []
while node:
if (node.surface is not None) and node.surface != "":
words.append(node.surface)
node = node.next
return words

class token_data:
"""
トークンの情報
tokens : MeCabで解析した単語のセット
text : 解析元の文
"""
def __init__(self, text):
self.tokens = set(get_tokens(t.encode('utf-8')))
self.text = text

def score(t1, t2):
"""
階層クラスタリングの際の距離を計算する
t1 : token_data 単語セット
t2 : token_data 単語セット
"""
ret = nltk.metrics.distance.masi_distance(t1.tokens,t2.tokens)
return ret

def add_node(graph,next_id,node_r,data):
"""
Graphにノードを追加する
graph : 操作対象のグラフ
next_id : 次のノードに割り当てるID
node_r : 接続先のノード
data : 今回解析対象のノード
return 次のID
"""
if type(data) == tuple or type(data) == list:
node_data = pydot.Node(str(next_id), label=" ", style="filled", fillcolor="green",fontname = "ms ui gothic")
next_id=next_id+1
graph.add_node(node_data)
graph.add_edge(pydot.Edge(node_r, node_data))
for d in data:
next_id = add_node(graph,next_id,node_data,d)
else:
label = data.text
node_data = pydot.Node(str(next_id), label=label, style="filled", fillcolor="white",fontname = "ms ui gothic", shape="box")
next_id=next_id+1
graph.add_node(node_data)
graph.add_edge(pydot.Edge(node_r, node_data))
return next_id


tests = [u"Take it easy!",
u"Yu-.We can take it easy here even if mister rain fall.",
u"Yufufu...nobady can find Maricha.",
u"Reimyu is Mister Bird!",
u"Maricha has got the sky in her hand je!",
u"YAAAAAAAAAAAAAAAAAAAAAAA-HA!",
u"ここはまりさのゆっくりプレイスだよ!",
u"ここはまりさのゆっくりプレイスだよ!ここからさっさとでっていってね!",
u"ゆっくりしていってね!ここはまりさのゆっくりプレイスだよ!",
u"ここはまりさのゆっくりプレイスなのぜ!",
u"きょきょはまりちゃのゆっくちプレイちゅなのじぇ!",
u"ここはれいむのゆっくりプレイスだよ!",
u"むーしゃむーしゃするよ!しあわせー!",
u"ぷくー!",
u"ヒャッハーーー!!!!",
]
test_tokens = []
for t in tests:
test_tokens.append(token_data(t))

hc = HierarchicalClustering(test_tokens,score)
hc.cluster()
datas = hc.topo()

next_id = 0
graph = pydot.Dot(graph_type='digraph')
node_r = pydot.Node(str(next_id), label=" ", style="filled", fillcolor="green", fontname = "ms ui gothic")
graph.add_node(node_r)
next_id=next_id+1
for d in datas:
next_id = add_node(graph,next_id,node_r,d)

graph.write_png('HierarchicalClustering.png')


■結果
b0232065_2403864.png

[PR]
by mima_ita | 2013-06-18 02:43 | python
文字列の類似度の尺度について試してみた
MeCabで形態素解析したものをnltkを使用して距離を取得する。
今回実験した内容は次の機能
・編集距離
 nltk.metrics.distance.edit_distance
・Nグラム類似度
 nltk.bigramsによるバイグラムの取得。
・Jaccard距離
 nltk.metrics.distance.jaccard_distance
・MASI距離
 nltk.metrics.distance.masi_distance

■コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import MeCab
import nltk

mecab = MeCab.Tagger("")

def get_tokens(text):
node = mecab.parseToNode(text)
words = []
while node:
if (node.surface is not None) and node.surface != "":
words.append(node.surface)
node = node.next
return words

print "単語の編集距離===================================================="
print "片方の文字がもう片方の文字列に変換するには、挿入、削除、置換を何回やらなければならないかを計算する。小さいほど類似"
s = u"まりさ"
tests = [u"まりさ",u"まりざ",u"まりちゃ",u"まり",u"まいしゃ",u"まっけんろー",u"れいむ",u"れいみゅ"]
for t in tests:
print t + str( nltk.metrics.distance.edit_distance(s,t) )

print "Nグラム類似度===================================================="
print "2つの文に共通するバイグラムがいくつあるか調べる。大きいほど類似"
s = u"ここはまりさのゆっくりプレイスだよ!"
tests = [u"ここはまりさのゆっくりプレイスだよ!",
u"ここはまりさのゆっくりプレイスだよ!ここからさっさとでっていってね!",
u"ゆっくりしていってね!ここはまりさのゆっくりプレイスだよ!",
u"ここはまりさのゆっくりプレイスなのぜ!",
u"きょきょはまりちゃのゆっくちプレイちゅなのじぇ!",
u"ここはれいむのゆっくりプレイスだよ!",
u"むーしゃむーしゃするよ!しあわせー!",
u"ぷくー!"
]
ceo_bigrams = nltk.bigrams( get_tokens(s.encode('utf-8')),pad_right=True,pad_left=True)
print "元文章のバイグラムの数:" + str(len(set(ceo_bigrams)))
for t in tests:
cto_bigrams = nltk.bigrams( get_tokens(t.encode('utf-8')),pad_right=True,pad_left=True)
print " " + t +":"+ str(len(set(ceo_bigrams).intersection(set(cto_bigrams))))

print "Jaccard距離===================================================="
print "2つの集合の類似度を |set1 ∩ set2| / |set1 ∪ set2|であらわした。小さいほど類似"
for t in tests:
r = nltk.metrics.distance.jaccard_distance(set(get_tokens(s.encode('utf-8'))),set(get_tokens(t.encode('utf-8'))))
print " " + t + ":" + str(r)

print "MASI距離===================================================="
print "Jaccard距離の改造重複があったら距離が短くなる。小さいほど類似"
for t in tests:
r = nltk.metrics.distance.masi_distance(set(get_tokens(s.encode('utf-8'))),set(get_tokens(t.encode('utf-8'))))
print " " + t + ":" + str(r)


■実行結果

C:\dev\python\nltk>python distance.py
単語の編集距離====================================================
片方の文字がもう片方の文字列に変換するには、挿入、削除、置換を何回やらなければならないかを計算する。小さいほど類似
まりさ0
まりざ1
まりちゃ2
まり1
まいしゃ3
まっけんろー5
れいむ3
れいみゅ4
Nグラム類似度====================================================
2つの文に共通するバイグラムがいくつあるか調べる。大きいほど類似
元文章のバイグラムの数:9
ここはまりさのゆっくりプレイスだよ!:9
ここはまりさのゆっくりプレイスだよ!ここからさっさとでっていってね!:9
ゆっくりしていってね!ここはまりさのゆっくりプレイスだよ!:8
ここはまりさのゆっくりプレイスなのぜ!:6
きょきょはまりちゃのゆっくちプレイちゅなのじぇ!:1
ここはれいむのゆっくりプレイスだよ!:7
むーしゃむーしゃするよ!しあわせー!:2
ぷくー!:0
Jaccard距離====================================================
2つの集合の類似度を |set1 ∩ set2| / |set1 ∪ set2|であらわした。小さいほど類似
ここはまりさのゆっくりプレイスだよ!:0.0
ここはまりさのゆっくりプレイスだよ!ここからさっさとでっていってね!:0.428571428571
ゆっくりしていってね!ここはまりさのゆっくりプレイスだよ!:0.111111111111
ここはまりさのゆっくりプレイスなのぜ!:0.4
きょきょはまりちゃのゆっくちプレイちゅなのじぇ!:0.923076923077
ここはれいむのゆっくりプレイスだよ!:0.222222222222
むーしゃむーしゃするよ!しあわせー!:0.833333333333
ぷくー!:1.0
MASI距離====================================================
Jaccard距離の改造重複があったら距離が短くなる。小さいほど類似
ここはまりさのゆっくりプレイスだよ!:0.0
ここはまりさのゆっくりプレイスだよ!ここからさっさとでっていってね!:0.617142857143
ゆっくりしていってね!ここはまりさのゆっくりプレイスだよ!:0.404444444444
ここはまりさのゆっくりプレイスなのぜ!:0.802
きょきょはまりちゃのゆっくちプレイちゅなのじぇ!:0.974615384615
ここはれいむのゆっくりプレイスだよ!:0.743333333333
むーしゃむーしゃするよ!しあわせー!:0.945
ぷくー!:1.0

C:\dev\python\nltk>

[PR]
by mima_ita | 2013-06-13 17:10 | python
R言語でTwitterを操作する
■目的
R言語のパッケージtwitterRを使用する
マニュアルどおり遣ってもうまくいかなかったので、なんとかしてみた

■手順
#任意の箇所にtwitteRパッケージをダウンロードする
install.packages("twitteR","c:\\dev\\R")

#ダウンロードした箇所をライブラリのパスに追加する
.libPaths("c:\\dev\\r")

#ライブラリを読み込む
library(twitteR)

#任意のフォルダをカレントディレクトリとする。これは認証用のファイルの入出力で使用する
setwd("C:\\doc\\r")

# SSLの認証をするためのpemファイルをダウンロードしておく
# これがないとHTTPSのプロトコル経由で操作できないYO!
download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")

#OAuthの認証開始
# consumerKeyとconsumerSecretは下記のURLから取得しておく
# https://dev.twitter.com/
cred<-OAuthFactory$new(consumerKey="Twitterで登録したコンシューマキー",
consumerSecret="Twitterでとうろくした値",
requestURL ="https://api.twitter.com/oauth/request_token",
accessURL = "https://api.twitter.com/oauth/access_token",
authURL="https://api.twitter.com/oauth/authorize")

#接続開始
cred$handshake(cainfo="cacert.pem")

この際、下記のような画面になる
b0232065_817518.png


現在、oauth_verifierの値の入力待ちの状態なので、ここに表示されているURLをブラウザで表示する。
すると、次のような画面になる
b0232065_8192138.png


アプリケーションの連携を許可するとリダイレクトされる。
b0232065_8201487.png

ブラウザのURLのoauth_verifier以降の値を入力待ちされているRに入力すると認証が完了する。

# 認証情報をTwitterに登録
registerTwitterOAuth(cred)

#タイムラインを取得。この際、PEMファイルを指定しないとHTTPSでは通信できない
userTimeline("mima_ita",cainfo="cacert.pem")

b0232065_82385.png


やったね、Rちゃん!ツイートがみれたよ!


More
[PR]
by mima_ita | 2013-06-13 08:24 | R
PythonでXpathを利用したHTMLの操作
urlib2で取得した内容をlxmlに渡して遣ればよろしい。


# -*- coding: utf/-8 -*-
# lxmlのインストール
# easy_install lxml
import urllib2
import lxml.html
import codecs
import datetime, time
import sys

def download(url):
html = ""
for line in urllib2.urlopen (url):
html = html + "\n" + line
html = html.replace("\r","\n")
root = lxml.html.fromstring(html)
contents = root.xpath('//dd')
for content in contents:
print content.text_content().encode('utf-8')

html = sys.argv[1]
download(html)



■使用例:
2chの内容を落としてCabochaによる係り受けの解析をする
http://needtec.sakura.ne.jp/serif/main.py?Analyze2ch
[PR]
by mima_ita | 2013-06-11 17:24 | python
CaboChaを使ってツイート中の係り受けの出現頻度をしらべる
■デモ
http://needtec.sakura.ne.jp/serif/main.py?AnalyzeCaboChaTwitter

TODO:
・遅い
・タイムラインで取得できるていどの情報だと、あんまり傾向とか見えてこない。

■コード
AnalyzeCaboChaTwitter.py

# coding=utf-8
from simplefw import Controller
import cgi
import MeCab
import os
import re
import twitter
from collections import defaultdict
from math import log
import CaboCha

class AnalyzeCaboCha:
def __init__(self):
self.cbocha = CaboCha.Parser()
self.link = defaultdict(int)

def Reset(self):
self.link = defaultdict(int)

def AnalyzeCaboCha(self, txt):
c = CaboCha.Parser()
tree = c.parse(txt)
pos = [u'形容詞', u'形容動詞',u'感動詞',u'副詞',u'連体詞',u'名詞',u'動詞']
exclude=[u'RT',u'TL',u'sm',u'#',u'さん',u'する',u'いる',u'やる',u'これ',u'それ',u'あれ','://',u'こと',u'の',u'そこ',u'ん',u'なる',u'http',u'co',u'jp',u'com']
for i in range(tree.chunk_size()):
chunk = tree.chunk(i)
if chunk.link == -1:
continue

link = tree.chunk(chunk.link)

for ix in range(chunk.token_pos,chunk.token_pos + chunk.token_size):
t1 = tree.token(ix)
fs1 = t1.feature.split(",")
if fs1[0] not in pos:
continue
val1 = (fs1[6] != '*' and fs1[6] or t1.normalized_surface)
if val1 in exclude:
continue

for jx in range(link.token_pos,link.token_pos+link.token_size):
t2 = tree.token(jx)
fs2 = t2.feature.split(",")
if fs2[0] not in pos:
continue

val2 = (fs2[6] != '*' and fs2[6] or t2.normalized_surface)
if val2 in exclude:
continue

key=val1 + '->' + val2
#if key not in self.link:
# key=val2 + ':' + val1

self.link[key] += 1

class AnalyzeCaboChaTwitter(Controller):
def index(self):
form = cgi.FieldStorage()
data = []
if form.has_key("user") :
c = AnalyzeCaboCha()
c.Reset()
api = twitter.Api()
statuses = api.GetUserTimeline(form["user"].value,count=3000)
for s in statuses:
text = s.text
sentences=re.split(u'[/”「」!?!?。.「」]',text)
for t in sentences:
if t == "":
continue
c.AnalyzeCaboCha(t.encode('utf-8'))

for k1, d1 in sorted( c.link.items(), key=lambda x:x[1], reverse=True):
if d1 == 1:
break
data.append([k1,d1,log(float(d1)/float(len(c.link.items())))])

tmpl = self.template_loader.load('AnalyzeCaboChaTwitter.tmpl')
stream = tmpl.generate(data = data)
html = stream.render("html")
print html



AnalyzeCaboChaTwitter.tmpl

<!DOCTYPE html>
<html xmlns:py="http://genshi.edgewall.org/">
<head>
<title>CaboChaによるTwitterの単語の係り受け解析</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>CaboChaによるTwitterの単語の係り受け解析</h1>
<form action="main.py?AnalyzeCaboChaTwitter" method="post">
<p>Twitterユーザー名 <input name="user" size="50" value=""/></p>
<p><input type="submit" name="mecab" value="解析" /></p>
</form>


<table border='1'>
<tr>
<th>単語</th><th>出現回数</th><th>log(出現回数/総単語数)</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>



More
[PR]
by mima_ita | 2013-06-06 09:10 | python
さくらレンタルサーバーにCaboChaを入れてみる
■デモ
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



[PR]
by mima_ita | 2013-06-06 06:26 | 実験



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ