2008-03-20 16:10:46
次は日本語の文書を検索して結果をkwic表示してみようと考えた。日本語は分かち書きされていないので、形態素解析などする必要がある。「する」と「した」を同じ動詞として並べようとしたらそれなりの手間が必要になってくる。日本語形態素解析はいつものようにMeCabで。Pythonを含むスクリプト言語のバインディングも用意されているので、それをインストールして利用する。とりあえず下のようなのを書いてみた。何だかずいぶん要領が悪そうなものになってみっともないが、ここはほとんど見に来る人もいないからまあいいか。自分用の覚書である。
#!/usr/bin/ruby
# vim: set fileencoding=utf-8 :
import sys
import re
import MeCab
t = MeCab.Tagger()
word = sys.argv[1]
file = sys.argv[2]
wpos = int(sys.argv[3])
txt = open(file,'r').read()
txt = re.sub('\x0D\x0A|\x0A|\x0D', '\n', txt)
txt = re.sub('\n', '', txt)
txt = re.sub('――', 'ーー', txt)
txt = re.sub('……', '・・', txt)
txt = re.sub('《.+?》', '', txt)
txt = re.sub('[#.+?]', '', txt)
txt = re.sub('「', '', txt)
txt = re.sub('」', '。', txt)
lno = 1
sentences = txt.split('。')
reslist = []
for sentence in sentences:
stlist = []
m = t.parse(sentence)
res = m.rstrip(" \n").split("\n")
for rs in res:
elements = rs.split(',')
if elements.count(word) > 0:
for rs2 in res:
elms = rs2.split(',')
if len(elms) > 6:
stlist.append(elms[6])
if len(stlist) > 0:
stlist.append(sentence)
reslist.append(stlist)
newlist = []
for res in reslist:
pos = res.index(word)
if pos == 0:
nlist = ['','',res[0],res[1],res[2]]
elif pos == 1:
nlist = ['',res[0],res[1],res[2],res[3]]
else:
nlist = res[pos-2:pos+2]
nlist.append(res[-1])
newlist.append(nlist)
freqlist = []
for result in newlist:
freqlist.append(result[wpos])
wdict = {}
get = wdict.get
for fw in freqlist:
wdict[fw] = get(fw, 0) + 1
for item in newlist:
item.append(wdict[item[wpos]])
item.reverse()
newlist.sort()
newlist.reverse()
for line in newlist:
pos = line[1].find(word)
if pos >= 0:
if pos > 30:
left = line[1][pos-30:pos]
else:
left = line[1][0:pos]
left = ' '*((30-len(left))/3) + left
right = line[1][pos:(pos + len(word) + 30)]
output = left + right
if len(str(line[0])) == 1:
nr = ' ' + str(line[0])
else:
nr = str(line[0])
print nr, output
これをkmecab.pyという名前で保存したので、python kmecab.py keyword filename [0, 1, 3, or 4] とすれば、0ではキーワードの二つ前の語で並べ替え、1では一つ前、3で一つ後ろ、4で二つ後ろで並べ替えるようになる。並べ替えは頻度順である。夏目漱石の『吾輩は猫である』を検索対象として試してみると、
python kmecab.py 変化 neko8.txt 3 13 事は禅寺の筍が若竹に変化する勢で大きくなる 13 かえってこれを電力に変化して立派に役に立たせ 13 明は自分以外の状態を変化させて満足を求めるの 13 じ吾輩の眼玉のごとく変化する 13 門君一人の運命がどう変化しようと、主人の朝夕 13 て、あれは上段の間の変化したもので、上使が坐 13 眼球のように間断なく変化している 13 とも薬缶とも銅壺とも変化するだろう 13 の曾呂崎を天然居士に変化させたのは一体誰の所 13 られて細い高い隆起と変化して参りますーー実に 13 いの事で君子の挙動の変化する訳がない 13 降りようと企てた者が変化して落ちる事になる 13 いかに流行が変化し易くったって、横に 7 製作の上に変化をあらわすのが困難で 7 成算があってかほどの変化を示したものか、また 7 、目まぐるしきまでに変化を生ぜしめたのはかえ 7 両端を叩いて黒白の変化を同一物の上に起こす 7 画工が精力を消耗して変化を求めた顔でも十二三 7 ならば世界の表面に大変化を来したろうと 7 つうち、発音に自然と変化を生じてくるのは、彼 4 の第二則に曰く運動の変化は、加えられたる力に 4 脳漿一勺の化学的変化はとにかく意志の動い 4 想像力がないとこんな変化は出来んのである 4 由に肉が骨に一足飛に変化は出来ますまい 2 相違ないが、何となく変化に乏しい 2 吾輩はまだかかる心的変化に遭逢した事はない 1 吾輩も彼等の変化なき雑談を終日聞かね 1 物の形や、色の精細な変化などがよく分るようだ後ろに続く語で並べ替えた結果である。これはまあうまくできたように見える。「する」「を」「は」「に」「なき」「など」という順である。前の語で並べると、
python kmecab.py 変化 neko8.txt 1 6 の第二則に曰く運動の変化は、加えられたる力に 6 製作の上に変化をあらわすのが困難で 6 成算があってかほどの変化を示したものか、また 6 事は禅寺の筍が若竹に変化する勢で大きくなる 6 かえってこれを電力に変化して立派に役に立たせ 6 、目まぐるしきまでに変化を生ぜしめたのはかえ 6 吾輩も彼等の変化なき雑談を終日聞かね 6 て、あれは上段の間の変化したもので、上使が坐 6 両端を叩いて黒白の変化を同一物の上に起こす 6 由に肉が骨に一足飛に変化は出来ますまい 6 の曾呂崎を天然居士に変化させたのは一体誰の所 6 いの事で君子の挙動の変化する訳がない 2 られて細い高い隆起と変化して参りますーー実に 2 降りようと企てた者が変化して落ちる事になる 2 つうち、発音に自然と変化を生じてくるのは、彼 2 いかに流行が変化し易くったって、横に 1 相違ないが、何となく変化に乏しい 1 脳漿一勺の化学的変化はとにかく意志の動い 1 明は自分以外の状態を変化させて満足を求めるの 1 じ吾輩の眼玉のごとく変化する 1 門君一人の運命がどう変化しようと、主人の朝夕 1 物の形や、色の精細な変化などがよく分るようだ 1 眼球のように間断なく変化している 1 画工が精力を消耗して変化を求めた顔でも十二三 1 想像力がないとこんな変化は出来んのである 1 とも薬缶とも銅壺とも変化するだろう 1 ならば世界の表面に大変化を来したろうと 1 吾輩はまだかかる心的変化に遭逢した事はない何だか変だ。実は「の」と「に」の頻度が同じなので混ざってしまっているのだ。「が」と「と」もそうだ。頻度が同じもの同士の中でまとめてくれない。そういう考慮をしていないから、当然なのだが。二つ前、二つ後ろでやってみたら、全然並べ替えられなかった。キーワードが活用する語だと、頻度と結果が一致しないことになってしまうことにも気がついた。最後の表示用の整形のときには活用を考慮していないから。実際に作ってみるといろいろ考えなければならないことが判ってくる。