Ruby 0
全268件 (268件中 201-250件目)
○ 記憶と再生 その5(Python で人工無能)やっとのことで pickle にたどり着いた。実を言えば、ここが最初から本命のところで、pickle を使っていろいろ記憶したり再生したりしようと考えているのだ。で、pickle てなんだろう。ふっ。pickle を 英辞郎で引いてみる。ちなみに、いつの間にか111万語になっているな。すさまじいものがある。旅辞郎とか、文辞郎、とか、耳辞郎、掲辞郎、日辞郎、コー辞郎とよくわかんない展開にもなっているが、おー、コー辞郎とはコーパス+辞郎ということなのか。すごい。けっきょく辞書というコンテンツ作成から生まれてくるものっていう付随価値をよく理解しているってことなのだよな。1ヶ月あたり1万語を収集しているらしい。でも何でも載っている辞書を作りたいらしく、この速度だと2200年あたりになるとか(笑)いかに辞書作りが大変かってことだな。このプロジェクトに参加している人は、英検2級、TOEIC 700点相当以上の人たちで 変な日本語 が認識できない人はお断りと。で、1バイトにつき0.3円支払われているようだ。辞書データが仮に 100MB くらいあるとすると、おー、すごい金額になっちゃうな。やっぱり辞書作りは金がかかるわい。総人件費で考えたらなにげに億に突入してるんだろうな。すごいこっちゃ。ん、ふと英辞郎は使える?というページを見ると、「TOEIC900点以上、英検1級」の人たちが作っていると書かれている。2002-09-29 だな。突然、敷居が下げられたのかな。上記の「700点相当以上」というのは、今、確認したばかりなので間違えていないし。たんなる勘違いでこう書かれているのか、それとも、突然、敷居が下がったのかどっちかな。何にしても、こういう安いコストで手に入る電子辞書を利用しない手はない。人工無能に組み込めるように考えることにしよう。PDIC の代わりに人工無能から辞書引きできるだけでもおもしろいかな。でも、PDIC ってやたら検索速度が速いからな。あとは、マルチユーザで利用できるシステムに組み込んじゃいけないというのもあるし、著作権的に厳しいものがあるから下手な使い方はできないということもある。でも、なんらかの形で使いたいな。まあいいや。EBStudio実践編:『英辞郎』のEPWING化 という方向でツールとしてなら問題ないと。電子辞書検索ソフトDDwin もチェック。"英辞郎" 検索を公開するためのページのソースコードはリンク切れだな。英辞郎検索ツール by Rubyが見つかる。これは参考にできそうだ。英語伝なんて商品もあるのか。英辞郎がしゃべると。こういう商品もおもしろいかもしれない。リンク集 辞書・辞典・用語集はあれリンクが載っているので記録しておこう。オンライン辞書は、AllAboutの辞書・事典・電子辞書でもさしあたってちぇっくすればだいたい把握できるが、してどうする(笑)。翻訳のためのインターネットリソース でもみりゃいいのか。いかん、本質から遠ざかってしまった。SPACE ALC の英辞郎 on the Web (左上に検索がある)で検索してみる。何をって、pickle。これが今日の話題だったのに・・・。で、ようするに、漬け物の類で、ピクルスじゃん。さすがに python 用語の pickle は英辞郎でも載ってないな。オブジェクトをpickleにするなんていう用例はない。まあいい、要するに、python の pickle というのは、オブジェクトを長期保存が利くように漬け物にしてしまうということで、今日は終わり。
2003.02.20
コメント(0)
三菱重工、無線LAN内蔵の家庭で役立つロボットを開発、三菱重工、主人の顔を識別する家庭用人型ロボット「wakamaru」を発表、ついに家庭向けに留守番ロボットが発売 - 4足歩行ロボット「番竜」など、最近、ロボットが家庭で役立つような形に進化し始めているようだ。単にエンターテイメントを指向する AIBO とはちがった次元で進化していく。AIBO も一番安いやつは、6,9000円にまで下がってるのね。お話AIBOみたいなソフトも出てる。これとある意味、同じ文脈にくるのが、バウリンガル(犬の気持ちを翻訳する)や、日本HP、管理職に「会話メーター」配布-対話相手の理解度判断 かもしれない。こうしたものがロボットにも組み込まれるようになると、さらになにげに対話的なロボットになっていくのだろう。まず、人を認識して、それに加えて、その人の感情や状態を理解するロボット。それが本当にいい気持ちのするものなのかどうかは知らない。愛玩用ロボットではなく、下手に実用のロボットが人間の感情を推測するようになると、それはそれで間違いが起こるような気もするが、望むと望まざるとに関わらず、そうした方向で発展するロボットも出てくるだろう。監視ロボットというのが実用上最初に発展していくのかもしれない。ロボットに仕事を監視されたら深いかもしれないな。上司がロボットなんて人もそのうちでてきたりして。○ 記憶と再生 その4(Python で人工無能)Python のデータベース系統には、anydbm、dumdbm、dbm、gdbm 、bsddb などいくつかのライブラリがあるようだ。anydbm モジュールを使うと、dumbdbm, dbm, gdbm の各モジュールのどれを使うかを意識しなくてすむ。勝手に anydbm がインストールされているものを使ってくれるらしい。これは dbm や gdbm をインストールしていないので確認してないが、ラッパーの一種といったらよいのだろう。dbm、gdbm の2つともインストールされていない場合は、dumbdbm モジュールがロードされるようだ。で、とにかく dbm 系統のどれかが、shelve からも呼び出されているので、簡単に辞書として扱いたいなら、dbm を直接使わなくてもいいだろうという気もする。ただし、gdbm や bsddb を直接あつかった方が細かい制御はできる。とにかく、まず anydbm のインターフェイスを見てみる。|処理 | 説明|dic[key] = val |値(val)をデータベースに挿入する。|val = d[key] |データベースから値を取得する|dic.close() |データベースを閉じる|dic.has_key(key) |キー(key)がデータベースに含まれるかをチェック|dic.keys() |キーの一覧を返すこのレベルであれば、shelve からだけ使った方がいいかもしれない。dbm や gdbm、bsddb はダウンロードしてきていれないといけないし。ただ、bsddb (BerkeleyDB へのインターフェイス) の場合、first, next, previous, last, sync の類のメソッドが用意されているので、シーケンシャルにアクセスしたりすることがある場合には、いいかもしれないし、sync の類があるということは、キャッシュが効いているということで、速度の点ではこっちの方がメリットはあるかもしれない。ハッシュ、Bツリー、DBレコード形式のそれぞれのタイプも指定できるので、bsddb が一番高度なのかな。gdbm の方も、firstkey, nextkey, reorganize, sync などのメソッドが用意されている。reorganize があるので、データベースの領域を再構成してよけいな領域を使わないように縮小することができるようだ(要するにふくれあがっちゃうということだよな)。Berkeley DB(sleepycat.com) は、もうちょっと調べてみるかな。まあ、かなりマニアックな領域に入ってしまているので、ここではこの程度にしておこう。ちなみに BSDDB のダウンロードはここから。Berkeley DB XMLなんていうものできている。Python Bindings for BerkeleyDB 3.1 thru 4.1 はここから。とにかく shelve を使うにしても、bdm を使うにしても、キーになることができるのは文字列だけなので、オブジェクトを値としては格納できても、キーにはできない。キーにオブジェクトを格納するためには、なんらかの形でシリアライズしてあげないといけない。んんと、今日のオチは、とりあえず shelve で適当にやった方が楽でいいかということ。dbm 系は直接みなくていいや。で、次は、pickle。なんだかますますマニアになっていくが、とりあえず、いくとこまで行っちゃうのだ。
2003.02.19
コメント(0)
昨日は、marshal 関数を使って、リストを保存したり、読み込んだりしてみた。形態素解析の結果をログとして保存したり読み込んだりする程度であれば marshal でもよいのかなという感じもする。が、独自に作成したクラスのインスタンスを保存することができないのが不便だし、再帰構造も扱えないという問題があり、永続的オブジェクトを保存するのには向いていないことがわかった。もしかしたら、形態素解析処理の結果をキャッシュ(一時的に保存しておいて、同じリクエストがきたらそこから取り出すために格納) しておくのに使えないこともないかな。場合によってはできるだけ形態素解析を呼び出す回数を抑えておきたいこともあるかもしれない。そういう場合には、キャッシュを検索してそこから結果を直接取り出すとか。あとは、形態素解析がこけるとわかっている文については、あらかじめ修正結果を入れておくとか。もっともキャッシュのヒット率は、限りなく0に近い、低いものになるので効率がよいかといえば、悪いといった方が正しいだろう。意味ないじゃん。形態素解析器の中で、ある条件に基づいて形態素情報の一部をキャッシュしておけば実行速度があがるだろうが、文単位になるとほとんどキャッシュから取り出されることはなくて、むしろ、同じ文を何回も解析させられるような DoS (Denial of Service) 対策といえるようなものかもしれない。が、それにしても、要求する文を毎回変えてリクエストするのは簡単なわけだし、文単位の単純なキャッシュはほとんど有効ではないだろうが。まあ、いいや。python でプログラミングすると永続的オブジェクトの扱いが楽だというのはよく言われるが、そもそも永続的オブジェクトって何という話がある。伝統的なプログラミング手法では、オブジェクトを生成したり、消滅させたりというのは、プログラムの起動から終了までの間の話で、オブジェクトそのものをプログラム終了後も残すというようなことはしない。オブジェクトのプロパティなどの値をプログラム終了後も残しておきたいならば、データをRDBMS に格納したり、テキストファイルに格納したり、あるいは独自の形式のファイルに格納するが、オブジェクトそのものを残しておくようなことはしない。したがって、プログラム起動後に毎回、オブジェクトを保存されていたデータから生成し、また終了時には、オブジェクトからデータを取り出して明示的に保存してやることになる。python の永続的オブジェクトでは、データだけでなくオブジェクトそのものを丸ごと保存してやるので、ある意味、非常に効率がよく、また非常に効率が悪い。つまり、データを明示的に読み出してオブジェクトを生成して、あるいは、終了時にオブジェクトから値を取り出して保存して・・・とやらずにすむ点で非常に効率がよいプログラミングができる。その反面、オブジェクトそのものを格納するために、データ領域については、データだけを格納するより効率は悪い。また、ディスクアクセスの量も微妙に多くなるわけだから、その分のハンディもあるだろう。でも、やっぱり、オブジェクトそのものを格納してしまえるという点では、特に膨大なステータスの簡単に行えるのだから、やっぱり有効なわけだ。たぶん、Lisp プログラマとかで Python を使うようになった人の一部は、この永続的オブジェクトを簡単に使えるところが気に入っているのじゃないかと思う。で、余談はさておき、今日は shelve を見てみることにする。shelve というのは、shelf 棚の複数形だな。永続的オブジェクトを棚に並べるようにして保存してやると言うことなんだろう。shelve は、実際のところ、dbm や gdbm といったデータベースが裏では動くことになる。つまり、実際に格納されるのは dbm や gdbm ということだな。shelve の便利なところは辞書(ディクショナリ)と同じ操作で扱えることだ。データベースを開いたり閉じたりするところをのぞけば、ほとんどデータベースを意識するところがないのがいい。shelve に格納するのは、辞書と同じなのでほんとに簡単。# shelve をインポートして使えるようにしておくimport shelve# shelve (拡張子なしのファイル名を指定) を開くdic = shelve.open(’my_shelve’)# shelve に登録dic[’僕’] = ’私’dic[’俺’] = ’私’# shelve を閉じるdic.close()で、格納されているかを確認してみよう。# もう一度開くdic = shelve.open(’my_shelve’)# 1) 僕のエントリを検索して、表示val = dic[’僕’]print val# 2) 俺のエントリを検索して、表示val = dic[’俺’]print val# 3) キーの存在の確認方法 has_key# 値が 1 なら登録されているprint ’僕 = ’, dic.has_key(’僕’)print ’俺 = ’, dic.has_key(’俺’)# 全部のキーを表示print dic.keys()# 俺を削除del dic[’俺’]# 5) もう一度、全部のキーを表示print dic.keys()# shelve を閉じるdic.colse()そうすると、1)「私」2)「私」、3)「僕 = 1」「俺 = 1」、4) [’僕’, ’俺’]、5) [’僕’] と、ちゃんと登録されていることがわかる。じゃあ、前日の例をもう一度試してみよう。class testdic: """ test用の辞書クラス """ def __init__(self): "初期化" self.dic = {} def setValue(self, key, val): "キーに対応する値を設定する" self.dic[key] = val def getValue(self, key): "キーの値に対応する値を返す" return self.dic[key]# インスタンスを生成して、dic にセットdic = testdic()# キーに対応する値を登録してやるdic.setValue(’俺’, ’私’)dic.setValue(’僕’, ’私’)# 試しに値を見てみるprint dic.getValue(’俺’)print dic.getValue(’僕’)# 両方とも「私」が返るこれで、dic には、テスト用辞書クラスのインスタンスが代入されていることになる。ここで、新しく ’my_shelve2’ に、このクラスインスタンスを’testdic’ という名前でぼこんと直接放り込んでやることにする。# shelve をインポートして使えるようにしてimport shelve# my_shelve2 を開くsdic = shelve.open(’my_shelve2’)# オブジェクトのインスタンスを放り込む# marshal だったらこれでエラーになったが# shelve ならどうだ。sdic[’testdic’] = dic# shelve を閉じるsdic.close()shelve の場合、はエラーが出ないで保存できる。いったんPython を終了した後、もう一度 python を起動して、試しに開いて読み込み直してみよう。# shelve をインポートして使えるようにして>>> import shelve# my_shelve2 を開く>>> sdic = shelve.open(’my_shelve2’)# 登録されているキーを表示>>> print sdic.keys()# testdic をキーにして読み込む>>> dic = sdic[’testdic’]# 表示してみる>>> print dic.getValue(’俺’)>>> print dic.getValue(’僕’)# shelve を閉じる>>> sdic.close()クラスインスタンスもそのまま登録できてしまうということが、これで確認できた。次のように再帰構造であっても問題ない。なかなか便利なのだ。>>> a = [1, 2]>>> b = [a ,4]>>> a[1] = b>>> a[1, ...], 4>>> sdic[’a’] = a>>> print sdic[’a’][1, ...], 4ただし、my_shelve でも my_shelve2 でも開いてみるとわかるが、バイナリファイルになっていて、ぐちゃぐちゃ見えるので、ここにはとても貼り付けられない中身になっている。明日は dbm や gdbm を見てみることにしよう。
2003.02.18
コメント(0)
今日は腰が痛いな。どうもわがまま老人のようでいやだ。早く春になってほしいが、時間が早く過ぎるのも困る。もうしばらく耐えねば。PS2 は昨日も書いたが、ゲームもちゃんとできるし、CD-ROM も再生できるのに、DVD だけ調子悪くなってしまってるので、中途半端でやだな。どうもぱっとしない日々だ。○ 記憶と再生 その2(Python で人工無能)テキストファイルの読み書きだと何かと面倒なのでなんとかならないか、というのが昨日の課題。ということで、まずは、Python オブジェクトの読み書きがファイルに対して行うことができる関数として marshal を取り上げてみることにする。ちなみに marshal というのは英語で「元帥、司令官」といった軍事的な地位や「整列する、整理する、導く、先導する」といった意味がある。ここでは後者の方だな。で、marshal という関数は、Python オブジェクトをシリアライズするために使われる。シリアライズって何?Python オブジェクトをファイルに書き込もうとしたら、「文字列じゃないと書き込めないよ」とエラーが出てしまったが、要するにオブジェクトの形になっているものを一直線の文字列の形にしてやることととらえておいたらいいだろう。直列化ということ。シリアライズしておけば、文字列の形で、遠くに離れたところにあるパソコンにでもオブジェクトを送りつけてやることができるだろう。文字列を受け取った側ではそれをまた組み立てて python オブジェクトにしてやることができると。ディスクに書き出したり、遠くのマシンに送り込んだりするときにシリアライズというのは必要になってくるだろう。将来的には人工無能同士が話をするとき、自分の情報をシリアライズしてぽーんと相手に送り込んであげて・・・などということも考えられるが、まあ、ウソウソというレベルの話ではある。Python のシリアライズの関数としては、marshal の他に shelve (本棚の複数形)や pickle (塩漬け、酢漬けにする)といったなめた名前の関数があるのだが、実はそちらの方が高度なことができる。marshal というのは、非常に直情型の関数なので、単純なオブジェクトしか扱えないのだ。政治ができない軍人のようなものかもしれない。ちなみに戒厳令のマーシャルローは、martial law で違う言葉だ。「軍の、戦争の」とかいった意味。え、似てる。うん、たぶん、marshal も martial も、軍神を司る火星の Mars からきているからなんじゃないかな。つまり、語源的には同じところからきている。なんて話はどうでもいいんだ。非常に単純なことにしか使えないから、永続オブジェクトといって、つまり、複雑なことを記憶させておいて、それを取り出したりとかいうことには、向いていない関数なのだな。ん、使えないじゃないって。まあ、あんまり、今後使うことないかもしれないな。まあ、でもちょっと扱ってみることにしよう。昨日ちょっと困るなといった例をもう一度あげてみよう。dic = {1:{’エントリ11’: [’情報111’, ’情報112’], ’エントリ12’: [’情報121’, ’情報122’]}, 2:{’エントリ21’: [’情報211’, ’情報212’], ’エントリ22’: [’情報221’, ’情報222’]} }これを marshal を使って保存してみる。# marshal を読み込んで使えるようにするimport marshal# 書き込み可能なモードでファイルを開くfo = open(’記憶庫2.txt’, ’w’)# どかーんと、ファイルにはき出す# ゴミ捨て場にゴミを捨てる感じで荒っぽいぞmarshal.dump(dic, fo)# ファイルを閉じるfo.close()ほれ、これだけで記憶できてしまったよ。思い出すときには、次のようにする。import marshal# 書き込み可能なモードでファイルを開くfo = open(’記憶庫2.txt’, ’r’)# よっこいしょと積み込むmarshal.load(dic, fo)fo.close()ファイルの中身は次のようになっている。ちょっと特殊な制御文字が入っているのでそのまま表示することができないので書き換えてあるところがある。{i {s エントリ11[] s■ 情報111s■ 情報112s エントリ12[] s■ 情報121s■ 情報1220i[ {s エントリ21[] s■ 情報211s■ 情報212s エントリ22[] s■ 情報221s■ 情報22200値に加えて、制御用の記号を一緒に入れてやっているのだな。つまり、昨日タブで区切りを入れたのより、もっと情報を多くしてファイルに落としてやることによって、オブジェクトの構造を記憶しておけるようになっているというわけ。なーんと便利なんでしょう。自分でごちゃごちゃ文字列から切り出さなくても、勝手にオブジェクトを作ってくれてしまうのだから、こういうものを使わない手はないということになる。とはいえ、上でも書いたように marshal は、こういう単純なディクショナリやリスト、文字列、整数、複素数、タプルなどを保存するのにはいいけれど、クラスのインスタンスを保存したり、再帰的なオブジェクトを保存することはできない。つまり、次のような例をやってみるとわかる。class testdic: """ test用の辞書クラス """ def __init__(self): "初期化" self.dic = {} def setValue(self, key, val): "キーに対応する値を設定する" self.dic[key] = val def getValue(self, key): "キーの値に対応する値を返す" return self.dic[key]まず、いいかげんに辞書のクラスを定義してやる。っていままで、クラスの話を出していないので反則だが、まあいいや。要するにオブジェクトの実体を作るときのひな形というか設計図を用意してやると。で、実際にそのひな形を使ってオブジェクトの実体、つまり、オブジェクトのインスタンスを作ってやる。これをやって初めてモノができるわけね。# インスタンスを生成して、dic にセットdic = testdic()# キーに対応する値を登録してやるdic.setValue(’俺’, ’私’)dic.setValue(’僕’, ’私’)# 試しに値を見てみるprint dic.getValue(’俺’)print dic.getValue(’僕’)# 両方とも「私」が返るそうしたら、前と同じように、ダンプしてやろう。# marshal を読み込んで使えるようにするimport marshal# 書き込み可能なモードでファイルを開くfo = open(’記憶庫3.txt’, ’w’)# どかーんと、ファイルにはき出す# ゴミ捨て場にゴミを捨てる感じで荒っぽいぞmarshal.dump(dic, fo)# ファイルを閉じるfo.close()とやろうとするのだが、marshal.dump(dic, fo) を実行した時点で、エラーが出てしまう。>>> marshal.dump(dic, fo)Traceback (most recent call last): File "", line 1, in ? marshal.dump(dic, fo)ValueError: unmarshallable objectun-marshal できないオブジェクトの値が含まれているから、エラーだよと教えてくれる。というか、実行を拒絶されてしまう。つまり、このオブジェクトは後でいったんmarshal しても、そこから復帰できない(unmarshal できない) と言っているのだ。で、どういうことかとえいば、marshal を使ったときには、class testdic: の定義はファイルにダンプされないので、設計図がなかったら、別のところにいって組み立てることができないからだめよということなのだ。単純な値が並んでいるだけであれば、これの次はこのタイプのこの値がきてとルールを作っておけば後で読み込むときにその逆をやればいいので OK だが、クラスのように設計図が別にあるようなものだと marshal は扱えないのだ。ほんとのことを言えば、文字列やリストやディクショナリにしたって、ほんらい設計図が必要なんだけど、これは、どのマシンにも python の基本環境として整っているから、次は文字列ね、次はリストね、という情報だけを入れておき、文字列のオブジェクトを作成するときには、各マシン上の基本環境の設計図を見てオブジェクトを作っているという裏舞台があるんだろう。あと、再帰というのは、たとえばもの。リスト a には、とりあえず整数の1と2を入れておく。リスト b の一番目の要素としては、リスト a、2番目の要素としては 4 を入れる。まあ、ここまではいい。ここで、a の2番目の要素(a[1])として、b を入れてやることにする。そうすると、b の中にはすでに a というリストが入っているので、自分の中にさらに自分を含むという形になる。>>> a = [1, 2]>>> print a[1, 2]>>> b = [a, 4]>>> print b[[1, 2], 4]>>> a[1] = b# 0 から始まるので a[1]は2番目の要素# a の2番目の要素(a[1])に b を代入>>> print a[1, [[...], 4]]# [...]の部分が再帰を意味するそうすると、自分の中をさらに参照してしまうところは、その中の自分をまた見に行き、その中のと、合わせ鏡の中の鏡のような状態になってしまうので、このような場合には、[...] と表示される。こうした再帰構造も python は扱えるところがえらいんだけど。でも、marshal の場合は、やっぱりこれを保存しようとするとエラーになってしまう。つまり、こうした構造が発生するようなデータを保存する場合にも使えないということになる。ということで、単純で扱いやすいのだけど、ちょっと機能的に不足したところがある marshal なので、永続的オブジェクトとしては最初から使わない方がいいということになる。クラスのインスタンスを含んじゃいけないというのが致命的。
2003.02.17
コメント(0)
『銀河英雄伝説』の DVD がそろそろ、届くんじゃないかと期待しているのだが、まだ、届かないなー。しかし、最近 PS2 の調子が悪くて、きれいな DVD ディスクでもちゃんと読み取れないことが多々あるのだよな。レンズの周辺にでも埃がついてしまったんだろうか、しょっちゅう DVD クリーナーで掃除してやるのだけど、よくならない。困ったなー。修理に出すしかないか。箱はもう捨てちゃったし、送るのも面倒だ。困ったな。あけて自分で掃除しようかと思ったが、しっかりシールで封印されていて空けちゃだめって書かれてるし。うーん。○ 記憶と再生 その1 (Python で人工無能)いくら人工無能といえども少しはものを覚えたり、記憶している情報を使った会話を行ってほしいものだ。対話型に会話をしているだけでは、すべてメモリ上に一時的に保存しておいたとしても、プロンプトを閉じてしまえば人工無能は忘れてしまう。「覚えておく」ためには、何らかの形で情報を保存する必要があり、また、それを「思い出す」ことができなくてはならない。ずーっと動かし続けて、すべてメモリ上に保持するという手も可能なんだけど、まあ、プログラムのできが悪ければどこかで異常終了してしまうこともあるし、停電に備えて無停電電源装置でも入れなきゃならないからね。一番単純な方法は、fo = open(’記憶庫.txt’, ’w’) として記憶庫を開いて、f.write(’覚える文字列’) でテキストファイルとしてどんどん書き出してしまうこと。そして、読み込むときには、fi = open(’記憶庫.txt’, ’r’) として読み取り用に再度記憶庫を開いて、mem = fi.readlines() として読み込むことによって思い出すということが考えられる。でも、それじゃあ、じゃんだんだん、問題が出てくる。テキストファイルに書き出す場合には、オブジェクトをそのまま書き出すことができないからだ。 たとえば次のように、ディクショナリとして覚えていることを書き出そうとしても、エラーになってしまう。>>> dic = {’俺’:’私’, ’僕’:’私’}>>> print dic[’俺’], >>> dic[’僕’]>>> 私 私>>> fo = open(, ’記憶庫.txt’, ’w’)>>> fo.write(dic)Traceback (most recent call last): File "c:/path/to/script.py", line 8, in ? fo.write(dic)TypeError: argument 1 must be string or read-only character buffer, not dictこれは非常に都合が悪い。この形式でファイルに書き出すためには、文字列でなければならないのだ。ディクショナリという python オブジェクトをそのまま書き出すことができないのだ。だから、たとえば次のようにしてやらなくてはならなくなる。たとえば、次のようにカンマ区切りにしたファイルに書き込んでしまうという手もある。for k in dic.items(): l = "%s\t%s\n" % k fo.write(l)こうすれば、というようにタブ区切りの行として書き出していくことができる。僕 私俺 私読み込むときには、次のようにできないことはない。dic = {}for l in fi.readlines(): (key, val) = l.split(’\t’) dic[key] = val# dic.items() で辞書のエントリの対を取り出して# 表示してみる。for k in dic.items(): print k[0], k[1],だけど、毎回毎回、こんなことしていたら非常に非常にめんどくさい。たとえば次のような場合はどうか。これを文字列として保存したり、取り出したりするのは、非常にめんどくさい。形態素解析の解析結果を取り出すときに面倒だったのと同じことだ(ちなみに、ほんとは便利な MeCab とのインターフェイスを使えば簡単なのを、ワザと使わずに泥臭い文字列処理としてやったのだが)。文字列から情報を切り出していくのは非常にめんどくさいので、あまりやりたくない。>>> dic = {1:{’エントリ11’: [’情報111’, ’情報112’], ’エントリ12’: [’情報121’, ’情報122’]}, 2:{’エントリ21’: [’情報211’, ’情報212’], ’エントリ22’: [’情報221’, ’情報222’]} }>>> print dic[1]{’エントリ11’: [’情報111’, ’情報112’], ’エントリ12’: [’情報121’, ’情報122’]}>>> print dic[1][’エントリ11’][’情報111’, ’情報112’]>>> ということでもっと、効率よく python オブジェクトをそのまま書き出すことができるような方法がほしくなるわけだ。ということで、あ、今日は本題に入る前に終わってしまった。
2003.02.16
コメント(0)
気がついてみるともう2月の半ば。時間がたつのは早い。いかんなー。1日48時間ほしい。○ 学習についてちょと (Python で人工無能)昨年の日記の、第二言語の教授法とe-Learningで書いた、『心理言語学』(D.D スタインバーグ、研究社)の話がちょっと引っかかっている。第二言語の教授法には次のようなものに分類できる(最新のは知らん)。・文法-訳読法(Grammer-Translation)・自然教授法(Natural Method)・直接教授法(Direct Method)・聴覚口頭法(Audiolingual Method)・認知体系学習(Cognitive Code)・沈黙法(Silent Way)・共同言語学習(Community Language Learning)・暗示的教授法(Suggestopedia)・理解優先法(Comprehension Primary)・演劇法(Dramma)人工無能の学習方法についても、それぞれに対応するような形を考えながら、どういう学習方法があるかを考えてみるとヒントになりそうな気がしている。学習方法に複数のモードというか modal というかを設けて学習させてやることがよいのだろう。ルールベースのものについては、自動学習は難しいので非常に単純なもののみ自動学習が可能として、基本的にルールは人手で入力できるような形を考える。これは KURA がやっぱり参考になるだろうか。ただ、係り受け解析までやらずに、表層のパターンで変換する単純なものが中心。非常に単純なパターンにのみ対応。ルールの記述方法を考えなければいけないな。未知語を中心として、1個だけしか未知語がなければ、なんらかの形でそれを記憶したり、問い合わせたりする。また、鸚鵡返し的に質問文を発生させながら、仮説検証を繰り返しながら、なんらかのイメージ(コネクション)を人工無能中に作り出す。チャットベースで考えると、単文の場合が多いし、それほど複雑な構文は出てこないだろうから、非常に短いパターンのみを対象にしてやっていく。長いものは、難しいから無視。人工無能が学んだ言葉をどういう形で、会話の中で修正させたり、新規に覚えさせていくかの教師信号の出し方も検討する必要がある。既存の多くの人工無能の場合、これがあまりに不自然でうざったく感じるので、「xxx て何。わかんない。教えて」とかやって、入力するのではなく、もっと自然な会話の中で行うことはできないか考える。これには、前述の未知語を中心として、過去の入力文を検索し、「"未知語" は"過去の例文からの切り出し" だよね」などと適当な文を引っ張ってきて表示し、「いや、そうじゃなくて、"未知語" は・・・だよ」という会話が成り立つとおもしろいが、難しいな(笑)。演劇法というのは、ちょっと文脈ベースを考えるときに、文脈をどう作っていくかというところで、引っかかりを持つ。文脈を持った会話というのも、何らかの形で実装したいところだ。なんにせよ、学習方法は、いくつかのモード持った形だな。あとは、眠るコンピュータ。やっぱりコンピュータも眠らないとね。眠っている間に学習すると。つまり、会話しているときにはがんがん記憶するだけで、直接そのときには学習しない。眠っている間に、学習したものを整理して、次の会話のための再学習や、質問文の生成や、誤りの訂正などを行うと。いや、非常に大それた考えだな。が、リアルタイムに学習するのより楽だろう。リアルタイムだと高速化を考えなければいけないが、睡眠するなら、数時間、応答できない状態があったってかまわないわけだから。話しかけても、「ぐぅ、ぐぅ、ぐぅー、ズーズーズー」としか答えてくれない状態。ただ、それも処理マルチスレッド化したりしなければならなくて大変なので、最初は、手動で応答モードと睡眠学習モードの切り替えだな。学習中は、うんともすんとも言わずに、デバグ情報をはき続けると。まあ、寝言みたいなもの。同じようなことを何度も考えて書いているような気がする(笑)。でも、だんだん、自分の中でイメージが固まってきた。要するに、どういう実装の仕方で記憶させたり、引っ張り出してきたりするかというところが、ほんとは悩んでいるところなのだな。ということで、そろそろ、Python オブジェクトの記憶と再生の話に突入することにしよう。shelve、 marshal、 pickle、dbm、Gadfly(Python で書かれたRDBMS)、ZODB(Zope で使われている Object指向のデータベース) などとりあげながら、考えてみるかな。ここが Python というプログラミング言語を使うと一番メリットになるところだと思う。あっちこっちいったりきたりで、何を書いているのかわからなくなってきた(^^;;
2003.02.15
コメント(0)
パターン・ランゲージってどんなものですか? のページを中心に読んだ。絵本を読むときのパターン・ランゲージみたいなものもおもしろい。YukiWiki などの作者でもある、結城 浩さんの文章はすごくわかりやすい。ギコ猫とデザインパターンなんかもう何ともいえないおもしろさ。うーん、この人はほんとにセンスあるな。ちゃんと理解すればするほど笑えるのだろうな。いや、Java に鞍替えとかいうことではなくて、デザインパターンとか、そちら方面もちゃんと勉強しておこうと思っただけなのだが。○ 試験文を用意する一昨日ダウンロードした 富士通研究所の日本語形態素解析システム breakfast を動かしてみる。JUMAN の辞書を使ってしまうと、ほとんど JUMAN と変わらない結果になっちゃうな。当然か。でも、ほとんど、というのがミソかもしれない。微妙な違いを見ていくと、理解に役立つ。これで、JUMAN、茶筅、MeCab、breakfast を入手できたわけだが、あとは、NTT基礎研究所の形態素解析システム「すもも」 ぐらいかな。kakasi は分かち書きはしてくれるけど品詞はつけてくれないので別扱い。NTT、『日本語語彙大系』CD-ROM版と文章解析プログラムを完成(1999)ALTJAWSやほかの商用のものもほしいが、手に入らないものはしょうがないな。まあ、そんなにいくつも比べてもしょうがないんだけど、単なる収集癖なのだ。めんどくさいのが、解析結果を同じ土俵に並べることか。茶筅と MeCab は MeCab に茶筅互換の出力をさせればよいとして、他のは形式を同じにするスクリプトを書かないといけないな。本質的な問題として、比較したら人工無能に役立つか? たぶん、役に立たないだろう(笑)どう転んでも MeCab でいくことには決めてるわけだから。MeCab の API は理解できたんで、そのうち、対応させよう。係り受け解析まではやらなくても、文節区切るのぐらいまでは MeCab の情報で適当になら簡単にできそうだから、その程度まではやってやるかなと。比較するときのテスト用に使う文章はどうしようか。いかんよね。形態素解析 試験文で検索してもほとんど検索に引っかからない。機械翻訳機能試験文 くらいしか使えるものないじゃん。まあ、機能試験文というぐらいだから、機械翻訳用のものかもしれないがちょうどよいな。検索してるときに、ここで、History in Picturesをみつけたが、マウスの発明者 Engelbart 関連のページか。おもしろいな。んー、リンク元のFuture Cruiseも、「第一線で活躍する科学者の対談やアカデミックなリンク集、東芝の最先端技術がわかるページ」っておもしろそうじゃないか。いいリンクがあったということは、ここもそのうち見てみよう。んと、試験文を見てみる。5桁の数字があって、タブが入って日本語となっているので、こいつを抽出してやることにする。こういうスクリプトは、適当に動きさえすればいいので、適当に書いてやる(というか、いつも適当じゃないという話はあるが)。extract-japanese.py を試験文と同じディレクトリにおいて実行してやると、mt-test-jpn.txt というファイルができる。で、日本語だけ抽出することができた。あとは、形態素解析器にかけてやればいいと。時間もアバウトにとってやるかな。あとは明日だな。def extractJapanese(doc): jp = [] for line in doc: jpflag = True for i in line[:5]: if i in "0123456789": pass # 0-9 なら OK else: jpflag = False # それ以外なら対象外 break # チェック打ち切り # 最初の5文字が全部 0-9 ならリストに追加 if jpflag: jp.append(line) return jpif __name__ == ’__main__’: # 試験文のファイルを開く fi = open(’mt-test-set-1.txt’, ’r’) doc = fi.readlines() # 試験文のファイルを閉じる fi.close() # 書き込みファイルを開く fo = open(’mt-test-jpn.txt’, ’w’) for l in extractJapanese(doc): # 7文字目以降をファイルに書き込み(0から始まるから) # ただし、元ファイルが euc-jp なので shift jis に変えてやる l = unicode(l[6:], ’euc-jp’).encode(’mbcs’) fo.write(l) # 書き込みファイルを閉じる fo.close()人工無能のテストに使ったら、さすがに怒られるかな(笑)。特に制限は書いていないしいいっか。そのうち、日本語語彙大系CD-ROM版 でも買うから許してな。うーむ書籍だと8万か。CD-ROM 版だと特価 54,000円(税別)で売っているところあるな。使わないけど、CD-今昔文字鏡 単漢字8万字TTF版もほしくなる。物欲そそるなー。今、とてつもなく貧乏だから、もうしばらくあとにしよ。しかし、高い娯楽じゃ。もっとも AIBO 買うよりやすいけど(笑)
2003.02.14
コメント(0)
言い換えシステム KURA のドキュメントをちょっと眺めてみる。やはり言い換えをちゃんとやるためには、この程度やらないとならないだろうな。うーん、このあたり実にいいと思うんだが、環境整えるのがちょっとめんどくさいし、ルールを作るのも面倒そうだな。でも、将来的にはやっぱりこういう方向を人工無能に取り入れたい。とはいえ、ちゃんとやらずに効果を上げる方法を探るのはいうまでもない。KURA で必要になる、特定のタグに囲まれた部分の表示・非表示を選択できる tagrep はおもしろい。名前の由来は「タグのgrepでtagrep」というのは、そのまんまじゃんという気がするが(笑)。これけっこう便利かもしれない。日本語形態素解析器、MeCab の辞書を眺めていたら、ちょっとおもしろいことを考えついた。茶筅形式の辞書ではなくて、MeCab 形式になっているからこそというような。どんなことかというは秘密。同じような元データでも、活用を展開している MeCab の形式の辞書の方が、遊びやすいかもしれない。たいしたことじゃないが。とりあえず時間がないのでそのうちに書くことにしようといっているうちに忘れちゃうんだけど。
2003.02.13
コメント(0)
危機言語のホームページ なんてあるのだな。言語の多様性が失われるということは、コミュニケーションのギャップが少なくなる可能性がある一方で、そによって失われていく文化の多様性が失われていくという面もある。また、言語が失われれば、それと同時に、その民族の過去が歴史的に葬られていくことにもつながっていくのだろう。言葉の問題は難しいな。[言語館] アイヌ語と魏志倭人伝のことばなども面白い。日本語の歴史と日本語研究の歴史には、たくさんのリンクがまとまっている。環太平洋の「消滅に瀕した言語」にかんする緊急調査研究 文部省科学研究費補助金「特定領域研究(A)」A04 日本班ホームページなんてものもある。方言にしても 日本主要都市方言音声データベースみたいな形で残しておかないと消えていってしまうものもあるだろう。JCHAT 日本語のための CHILDES プロジェクトみたいに言語獲得研究という面から日本語を見てみるのもおもしろいかもしれない。科学研究費(平成8-10年度) 「日本語学習者の作文コーパス:電子化による共有資源化」 の 日本語学習者の作文コーパス とか面白い。人工無能を考えるのによいかもしれない。などといったら殴られそうだが( JCHAT 日本語のための CHILDES プロジェクトみたいに言語獲得研究という面から日本語を見てみるのもおもしろいかもしれない。科学研究費(平成8-10年度) 「日本語学習者の作文コーパス:電子化による共有資源化」みたいなの日本語学習者の作文コーパス とか面白い(http://cookie.lang.nagoya-u.ac.jp/pub/)。人工無能を考えるのによいかもしれない。などといったら殴られそうだが。Web 日本語というサイトを見つけた。時間があるときに眺めると面白いかもしれない。言葉について調べたり、考え始めたりすると、ほんとにキリがない。
2003.02.12
コメント(0)
茶筌の辞書をしげしげと眺めてみる。うーん、やっぱり、けっこう問題あるなー。辞書作りって凄く大変なので、あんまりこの領域には入り込まない方がいいと思っていたのだが、それでも、こういうエントリになっていたら、こういう結果になっちゃうよなーというのが見えてくると何とかしたくなってきてしまう。マニア的な性格が災いするのだ。でも、ちょこっとエントリをいじる程度であればいいが、大幅にいじるとなると、根本的に辞書の作り方を理解して、なおかつ、大量のデータを作らないといけないから手間も時間もかかる。一年たっても終わんないだろうな。しばらく、辞書の勉強を一からやり直して、考えてみることにする。しかしまあ、これ真剣にやり始めるとほんとの研究になっちゃうのだよな・・・。適度にお茶を濁しつつ、比較的楽に改良できる方法はないかな。そこをまず考えてみることにしよう。ふー。まあ、とにかく辞書内容の検証用にツールを作らんといけないけないな。気分転換に、富士通研究所の日本語形態素解析システム breakfastをダウンロードする。なんていう気分転換なんだろう。同研究所のフリーソフトのページを眺めてみると、あぁ、IRC クライアントの CHOCOA もいっしょにならんでいるな。リストを眺めると、フームさすがに研究所。XML CSV圧縮なんかもおもしろい。XML 文書は、CSV形式に比べデータ量がどうしても大きくなってメモリも食うから、処理に必要な要素以外は圧縮しちゃおうっていうことか。なるほどね。XMLの一部をCSV形式にしちゃうと。そのために「XSLシートによってXSL変換として実行」ということか。XMLのお勉強用にダウンロードしとくか。XML CSV圧縮のページも別にあるな。これが分かりやすい。うーん、ほとんど詐欺みたいな仕様だな(笑)。発想の勝負というのはこういうことか。実にリーズナブルで、発想としては面白いけど、実用では普及しないタイプの技術かな。まあ、トイレの貯水タンクにペットボトルを入れて水量を調整して節約するような感じだ。なんていったら怒られちゃうかもしれないが。ようするに有効だけど、標準技術としては普及しないタイプ。でも、ときにこうした発想の転換は重要だよなと思う。XLink/XPointer機能付きXML/SGMLブラウザは、60日間限定のデモ版みたいなものだな。XBRL タクソノミエディタ とかも面白いかなと思ったけど、すぐにフリーのライセンス期限切れになるから使えんな。ま、営利企業の研究所だからフリーといっても、そんなもんでしょという感じだな。やさしい技術口座なんかは面白い。だれでも読めるような形で書かれていて、いいかもしれない。「人民日報タグ付きコーパス」公開についてを見ると、ふーん、なるほどね。やっぱり大企業は違うな。
2003.02.11
コメント(0)
茶筌やMecab といった形態素解析に使用している IPA辞書を見ているうちに、なんだか気に入らないところがでてきた。辞書いじりはなんだかマニアックな世界に入ってしまうのでやめとこうと思ったが、やっぱり好みの辞書に最初にしてしまった方が、あれこれ処理をいじるよりよかろうという気がしてきた。ipadic-2.5.0 の場合、euc-jp の端末で見たら、ヨコマミサキ(横??岬)、ヤナハジマ(屋那??島)... と、たくさん表示できないようなものが入っているのだな。MeCab ではどうなんだろう。「穴澗湾(アナマワン)」「下甑島(シモコシキジマ)」穴湾,3524,名詞,固有名詞,一般,*,*,*,穴湾,アナマワン,アナマワン下島,3524,名詞,固有名詞,一般,*,*,*,下島,シモコシキジマ,シモコシキジマだめじゃん。ipadic-2.5.1 とかだと直ってるのかな・・・。それとも自分がへんなことしたのかな。うーん。やっぱり、辞書からちゃんと見よう。しかし、こういう情報はどこにいったらあるんだろう。みんな知ってて知らんふりして直して使っているのか、それとも、気にしていないのか・・・。ちょっとまともに、ipadic の問題点から調べてみよう。なんだか、どんどんマニアな世界に入ってしまうな・・・。
2003.02.10
コメント(0)
『ウーマン・ラブ・ウーマン』を見た。これは、質が高くてかなりいい映画だと思う。内容はちょっと特殊といえば特殊だけれど。3組のレズビアンのカップルをオムニバス形式で描いた映画。オムニバスという形式を効果的に使って時代の流れを出している。最初の話は、悲しくなってしまうような老女の話だが、2話目、3話目と徐々に明るさが出てきて、見終わった後の後味がよいようになっている。いわゆる同性愛者のカップル(男女を問わず)、子育てをする機会(つまり人工授精や養子縁組など)を与え、子育てをさせれば人口減少に少しは歯止めがかかるか。まあ、動物の同性愛は6%程度だろうから、そこから類推してその程度のパーセンテージが増えても、焼け石かな。ただ、多数の子供を育てる権利が与えられれば面白い社会になる。メチャクチャ?○ 助動詞廃止論? (Python で人工無能)「君は何にする?」「ぼくはウナギだ」みたいな文を「うなぎ文」 という(奥津敬一郎『「ボクハ ウナギダ」の文法』、くろしお出版 1978) が、このリンクのページで、AはBだという文に対して「ウナギ度」という表現で文脈依存のあいまい性を論じているのは笑ってしまった。××度とかすると、もっともらしい基準になるので笑える。これは使える。ただ、「文脈がなくても理解できるだろう」と書かれているものが私に言わせれば、かなりウナギ度が高いように見えるんだが。まあ、言語感覚は人によってかなり違うものだな。文法用語にこだわるや“助動詞”のない文法 のページも面白いが、この吉川武時という方は、(「助動詞」を廃止すれば、日本語文法はすっきりします。)という主張なのか。ふーん。『日本語文法入門』(アルク ISBN4-900105-68-6 C13181)を書かれている方なのね。 別の aurinko のホームページ でも、やっぱり助動詞廃止論を唱えている(笑)。教えるための文法の視点というのは、いろいろ興味深いものがあるな。こういうのは助動詞とするなと。「独立して発音されることはないから、助動詞ではない。変化語尾だ。このごく当たり前のことが分からない人が多いのは実に嘆かわしい。 」とおっしゃっている。食べた。食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。食べます。食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス。 記号,句点,*,*,*,*,。,。,。助動詞とあえてしてもいいのは、「おく」みたいな例。買っておく。買っ 動詞,自立,*,*,五段・ワ行促音便,連用タ接続,買う,カッ,カッて 助詞,接続助詞,*,*,*,*,て,テ,テおく 動詞,非自立,*,*,五段・カ行イ音便,基本形,おく,オク,オク。 記号,句点,*,*,*,*,。,。,。別のページであげられている「やがれ」の例も面白い。「やがれ」はうまく MeCab の形態素解析では扱えていないな。読みやがれ。読み 名詞,一般,*,*,*,*,読み,ヨミ,ヨミや 助詞,並立助詞,*,*,*,*,や,ヤ,ヤがれ 名詞,一般,*,*,*,*,がれ,ガレ,ガレ。 記号,句点,*,*,*,*,。,。,。読みやがる。読み 動詞,自立,*,*,五段・マ行,連用形,読む,ヨミ,ヨミや 動詞,自立,*,*,五段・ラ行,体言接続特殊2,やる,ヤ,ヤがる 動詞,接尾,*,*,五段・ラ行,基本形,がる,ガル,ガル。 記号,句点,*,*,*,*,。,。,。こっちに来やがれ。こっち 名詞,代名詞,一般,*,*,*,こっち,コッチ,コッチに 助詞,格助詞,一般,*,*,*,に,ニ,ニ来 動詞,自立,*,*,カ変・来ル,未然形,来る,コ,コや 助詞,並立助詞,*,*,*,*,や,ヤ,ヤがれ 名詞,一般,*,*,*,*,がれ,ガレ,ガレ。 記号,句点,*,*,*,*,。,。,。(「テの形」という概念)というのも面白い。「雨が降っている、月が出ている」「窓が開いている、窓が開けてある」の違いを説明するときなどに役立つと。「さんまを焼く煙」も面白いが、こういうのはやっかい。うーん。よくよく読んでみると人工無能を考えるときに役立つようなことがたくさんあるようだ。まあ、助動詞という言葉を使うかどうかは、人工無能を作る場合、直接関係ないんで、いいやというのが今日のオチ。そういえば、Python で人工無能といいつつ、コードをぜんぜん出してなかったからまたちょっと時間を作ってコードを入れるかな。
2003.02.09
コメント(0)
『プラクティカル・マジック』を見た。いまいち。○ 意味構造を持つべきか (Python で人工無能) 「日本語文章の意味解析システムSAGEの開発研究」(pdf) をちらと眺める。SAGE というのは、Semantic frame Automatic GEnerator)の略のようだ。日本語要求仕様を分析して、そこからオブジェクト指向設計図を自動生成するCAMEO と呼ばれるシステムがあったらしい(今あるのか知らないので)。このシステムでは、日本語要求仕様をいったん手作業で日本語の文を解析して、格フレームと言われるコンピュータが扱いやすい意味構造を表す表現(RSL, Require Specification Language) を作ってやり、これを元に要求仕様を生成するシステムのようだ。で、この手作業でやっていた部分を自動化するようなことをするのが SAGE。この前には、日本語形態素解析システム JUMAN で形態素解析して、構文解析システムSAX で統語解析して、JANUS (この研修室のもの)で意味解析をしていたようだ。解析は、Chasen の結果を元に Prolog と呼ばれる Lisp とともに人工知能なんどによく使われてきた言語に理解しやすい形式にいったん変換してやり、EDR の書を使って意味フレームと呼ばれる構造に変換してやるというもののようだ。「人はエレベータに乗ると行き先階のボタンを押す。」(日本語として言い悪いは別として(^^;;、論文のどこかに、こういう例があげられていたので)という文の場合は例えば、次のようなどの単語がどの単語にかかっているかを考慮したうえで、動詞を中心として意味を表す構造にしていく。押す -- ボタン | |- 行き先階の | |-乗ると | |-エレベータに | |-人は「××」が「○○」を「△△」する。みたいなパターンとしてとらえていくということだな。このパターンがたくさんあって、「(人)」が「(人)」を「なめている」というのと、「(人)」が「(食べ物)」を「なめている」というのを別のパターンとしてとらえられるようにしておけば、「私は彼をなめていた」という表現を、決してペロペロとなめていたのではないということが認識できるようになると(そんなことは、上記の論文を見ても出てこないが、念のため)。ひらがなを漢字に変換する場合にも、この格フレーム相当のものが使われているから、最近の漢字変換は賢いのだよな。まあ、ジャストシステムの ATOK が一番このあたりはすすんでいるのかな。まあそれはよいとして、人工無能の場合もある程度、各フレーム相当のものを用意してやる必要があるだろう。それを構造化しているかしていないかは別にして。既存の人工無能にしても、穴埋め的なことができる答え用のパターンを持っているのだから、それをどこまでちゃんとやるかという話になるだろう。EDR の辞書は所詮使えないので、独自に何らかの形で、それ相当のものを持たせるか、それとも、いっさいそういうものを持たせないかは難しいところ。まあ、穴埋め用のスロットを作った時点である意味、格フレームを持たせるに等しい部分が出てくるのかもしれないが、フィルモアの格文法とか採用した時点で人工無能としてはダメなので、そういういかがわしいものは(笑)、使わないことにする。だいたい、下手な意味構造を持たせると処理が大きくなりすぎるし、格フレームの登録も大変で使い物にならないから、そういうところからして問題外なのだな。でも、やっぱ、EDR の辞書は欲しい(笑)
2003.02.08
コメント(0)
大ショック。せっかく、昨日のうちに、今日の分まで書いておいたのに・・・。労作を何をボケたか上書きしてしまった。さて、貼り付けてちょっとメモ書いておしまいと思って開いてみたら・・・。○ よけいなタグを削除する、その2 (Python で歴史探索)昨日までで、インターネットからダウンロードした HTML ファイルの文字コードを変換するところまでいったので、今日は、それを加工して余計なタグを削除する本題に入る。>>> html = ’’.join(html)>>> html# どーっと出てくる。リストから1つの長い文字列に変換してしまう。>>> shtml = html2safehtml(html,valid_tags=’(b, a, i, br, p)’)>>> shtml# どーっと出てくるけれど、タグがだいぶ削除されている。# 場合によってはこの程度のものを元に加工した方がいい場合もある。>>> thtml = html2text(shtml)>>> print thtml傀儡師の館 - 人工無能とか、CMS、… メール メッセージを送る 友達にすすめる モバイルケータイで見る ページ一覧 CMS関連リンクなど 日記からのリンク抜き出し Zope について知識と自然言語のリンク ニュース関連 時間があるときに読みたいもの 最近見た映画など...という感じに、タグを削除したテキストファイルの形式にできた。うーん、気を取り直して書こうと思ったが、やっぱり、書く気にならない・・・・。詳細に手順を追って書いたのに、出し惜しみするんじゃなかった(涙)今日はめげたのでこれまで・・・。もう少し細かい変換をかけたり、一部のタグだけ取り出したりとかいろいろ今後やると思うので、そのときにまた説明書くことにしよう。要するに後で形態素解析に渡してキーワードの切り出しをして云々をするわけ。固有名詞を抜き出したりなど。そしたら、たとえば織田信長のページをすぐ資料として取り出せるでしょ。年号なども取り出すようにしておくとかいろいろ考えられる。とにかく、グスン。今日は、余計なタグならず、テキスト削除してしまったというオチか(^^;;
2003.02.07
コメント(0)
『ワイルド・ワイルド・ウェスト』を見た。うーん、アメリカ人て、むちゃくちゃなもんに金かけるなー。まあ、娯楽作品だからいいんだけどさ。すごくアメリカっぽい映画だ(笑)。○ よけいなタグを削除する、その1 (Python で歴史探索)そういえば、こんな自主企画をやろうとしていたのを忘れていたので、ちょこっと進める。なんだかんだで、Python で人工無能でやっていることと結びつきはどこかであるんだけれどね。で、とにかく Google API について最初に書こうと思っていたけれど、まとめている時間もないので、ぱっと書けるものを扱ってみることにした。最初に何を書いたんだか忘れてしまったが、インターネット上から資料を取ってきて、保存しておき、何か使えないかという話も入れておいたと思うので、今日は、指定された URL から HTML ファイルを取ってきて加工することをやってみようかと思う。そのまま HTML で保存すると、何かと扱いにくいのでタグを削除してやろうというのが、とりあえずの目的。まず、Python がインストールされているのは前提として、Strip-o-Gram HTML Conversion Libraryというのをダウンロードしてくる。ファイルを解凍したら、DOS プロンプトまたはシェルを起動して、setup.py があるディレクトリに移動する。setup 一発でインストール終わり。で、ちゃんとインストールされているか、確かめてみる。c:\work\> cd stripogramc:\work\> python setup.py installc:\work\> pythonそうしたら、html2text と html2safehtml という関数を stripogram ライブラリからインポートして使えるようにして、urllib ライブラリからは urlopen という関数をインポートする。で、とりあえず、source に指定した URL に urlopen で接続する。>>> from stripogram import html2text, html2safehtml>>> from urllib import urlopen>>> source = ’http://plaza.rakuten.co.jp/kugutsushi/’>>> try: urlhandler = urlopen(source) except: print source+’ が開けません。’>>> print urlhandler<addinfourl at 10119688 whose fp = <socket._fileobject instance at 0x009A91D0>>もし、’proxy_open’ なんのかんのとエラーが出るようなら、DOS プロンプトでとりあえず、set HTTP_PROXY= として HTTP_PROXY を空にしておく。で、この時点で urlhandler という変数に設定されているのは、ソケットクラスのファイルオブジェクトのインスタンスであることが分かる。まあ、要するにサーバにソケットという仕組みで接続して、それをファイルとして開いた状態になっているよと、つまり f = open("something.txt", ’r’) と同じような状態になっているということ。んー、ぜんぜん説明になっていないけどいいや。ようするにファイルと同じ扱いしてもいい状態になっているの。で、次に>>> html = urlhandler.readlines()>>> urlhandler.close()で、readlines() でまとめてURLに指定されたファイルを読み込んで、html という変数に保存して、ハンドラを閉じておく。次に、>>> print htmlとすると、ドヒャーっと画面に文字が流れてビックリする。何が起こったかというと、html ファイルの中身がリストになっているのをそのまま表示してしまったから。で、目がいい人は気づくと思うが、EUC-JP という文字コードになっているので、Shift JIS の端末だと文字化けしている。これじゃあ、再利用がしにくいので、まとめて、Shift JIS に変換してあげることにする。>>> import pykf>>> html = map(pykf.tosjis, html)>>> print htmlとすれば、今度はちゃんと Shift JIS の文字がドヒャーと表示される。pykf というのは、文字コードを変換してくれる Perl でいえば Jcode みたいなもので、日本語対応版の Python であれば最初からインストールされているのでそのまま使える。pykf.tosjis で文字コードを SJIS に自動変換している。で map という関数は数学の写像と同じように、一つの集合から、関数を適用することによってもう一つの集合を作り出している。つまり、html はリストになっているので、リストの各要素について、pykf.tosjis を適用してやっているということ。もっと簡単にいうと、全部 Shift JIS に変換してやりなさいということなのだ。なお、Linux などを使っている場合は、JapaneseCodecs と pykf もあらかじめインストールしておく必要があるので注意。で、今日はここまで。実は明日の分まで一気に書いてしまったのだが、長いので2日に分けることにした。だって、1時間以上書くのにかかっちゃったし(笑)
2003.02.06
コメント(0)
2003-02-03 の日記で書いた大阪弁 Proxy に使われているフィルタのソースを眺めてみる。やっていることはシンプルだけれど、登録数が3000強あるので、それなりの変換になるわけだ。3000語で覚える大阪弁か。ふーむ、大阪弁覚えるのも、けっこう大変なのだな。逆に考えたら大阪弁の人が東京弁をしゃべろうとしたら、やっぱり大変だということか。イントネーションも違うし。うーん、大変だろうな。両方使えるひとはバイリンガルだな。 {"、けれど", "、そやけど"}, {"、けれども", "、そやけど"}, {"、だって", "、そやかて"}, {"、って", "、ちう"}, ... {"偉い人", "お偉いはん"}, {"偉い人たち", "お偉いはんら"},それにしても、static struct { char *indata; char *outdata; } henkan[] = 上のリスト3000語強で、変換辞書を構造体にぶち込んでいるプログラムにはスゲーと思った。リストの順番が重要になるがさすがに手で並べるのは大変だろー。いや、ちゃんとソートのスクリプトもついているので、ひたすらリストを作ってソートしたものをぶち込むということなのだ。リストを変更するたびにコンパイルしなおさなくてはならないのがちょっと面倒かな。このパターンだと、sed で試して高速化のためにコンパイルってことでいいかな。いや、どっちにしろソートが必要だから、スクリプトに全部まとめてコンパイルするまで面倒見てしまえば手間はかからないか。なんにせよ、字面の置換もバカにしたものではないということだな。話は変わるが 3000単語、英語を覚えたら、日常会話が問題なくなるというのは大いなるウソであることが分かる。3000語の用法をすべてのパターンで使えるように覚えたら別だが。基本語彙を共有している関西弁と標準語の差異をとるだけで3000以上はあるのだから。"get out of here" だったら、get, out, of, here の4語についてのみカウントするという手法をとらない限り無理。「Give and Get 辞典」というのを持っているが、300ページ近くあるのだなこれが。お、英文中に使用されているイディオムの抽出ってのは、けっこう難しい課題だ。しばらくのらりくらりなのだ。
2003.02.05
コメント(0)
しばし、時間もないので適当にお茶を濁しながら日記を書き続けることにする。VisualMorphs が MeCab でも使えるようになるといいのだがな~。jar xf vm.jar で解凍してみたら、ChasenHandler.java と ChasenRemoteHandler.java でもいじればなんとかなるのかなーとか思ったが、フォーマットオプション見くらべたりするのが億劫なのでやめた(^^;;ちなみに Visual Morph は形態素解析の結果をグラフィカルに表示してくれる Java で作られたツール。漠然と文字面のリストを眺めているより複数の候補がグラフィカルに表示されている方がぼうっと眺めて考えるのにはいいので。○No! が分かる人工無能 その2 (Python で人工無能)一昨日は「はい」と「いいえ」についてちょっと考えてみたが、もうすこし考えてみることにする。Yes と No で答えが返ってくるものについては、バリエーションを用意して置換してしまうという方法をとれば、「わたし」と「あなた」を変換したときの同じように何かできるが、それ以外の補われたり、明示的な Yes No がない場合に、ちょっとやっかいになりそうだということを考えてみた。「いいえ」については、形態素解析をすると間違いも発生するので、なんらかの補いをつけてやらねばならないだろう。めんどくさいので、いい(動詞、自立)+え(動詞、非自立)+助詞(格助詞)または「、。」などの句読点が連続している場合は、感動詞のいいえに書き換えてやるとか(安易すぎ)、特定の誤りパターンがきたら書き換えてやる処理を考えておくことにしよう。いいえといいました。いい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイえ 動詞,非自立,*,*,一段,連用形,える,エ,エと 助詞,格助詞,引用,*,*,*,と,ト,トいい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイまし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。あぁー、しかし、こういうのは嫌だなー。確率統計的に誤り検出なんてまともなことはしたくないし、やっぱり漸次学習がいいかな。ブツブツブツ。あとは、フリーのかな漢字変換辞書たち など使って、もう少し辞書のエントリをどうにかしたいなと思う今日この頃。やっぱり辞書のエントリは100万程度はないといかんかもしれない。しかし、100万語の辞書を持つ人工無能というのは、いかにも不毛でいいか。でも大変だから50万を目標として。うー。どうするかな。でもやっぱり感覚的には50%程度まともに解析できていればいいやというスタンスでやるべきか・・・。MeCab に連結品詞機能が入ると、どの程度なにがどうなるんだろうか・・・。ChaSen の仕様を眺めなおしてみる。うーん、この手の形態素解析って、いったい何処まで何を正しくできていればいいんだろう。1つだけ結果を出した場合、その正しさがあくまでも蓋然性を前提としたもであるとするなら、複数の結果のまま後の処理で、もう少し高位の処理で曖昧さを解消してやるほうが、むしろ正しい姿勢なのかなとも思えてくる。いや、まともに考えちゃいかん・・・。やっぱり、初心にもどって単純な方向でまずやることにしよ。とりあえずやっぱり、No! は、分からんでもいい (^^;;ちょっと投げやり。
2003.02.04
コメント(0)
hohhoh さんの日記に 「がんばれ!!ゲイツ君」 の「成毛ちゃんの大阪弁バージョン」のページへのリンクがあったので、久々だなーと思って見に行った。面白い。うーん。で、この変換をしている 大阪弁変換Proxyサーバ を見にいく。大阪弁化フィルタを delegate のフィルタとして動かしているようだ。これはおもしろい。たとえば、こんなふうにして、http://www.yorosiku.net:8080/-_-http://cl.aist-nara.ac.jp/~taku-ku/software/mecab/ 、「http://www.yorosiku.net:8080/-_-」 の後ろに見たいページをブラウザで指定してアクセスすれば、大阪弁でページをみることができるのだな。体言止だと変換がかからないのでMeCab のページはいまいち面白くない。カタイページも大阪弁フィルタを通したら面白くなるかと思ったが、まあ、部分的に楽しめるぐらいだな。第156回国会における小泉内閣総理大臣施政方針演説 http://www.yorosiku.net:8080/-_-http://www.kantei.go.jp/jp/koizumispeech/2003/01/31sisei.html でも眺めてみる。うーん、やっぱり成毛ちゃんにはかなわん。口語調のものでないといけないな。まあ、とっつきにくそうなものを、http://www.yorosiku.net:8080/-_-http://www.borland.co.jp/j2ee/ こんな風にしてみると、以外におもしろいんじゃないかという気もしてくる。Borland のページはけっこうまじめにいいかもしれないな。大阪弁フィルタは人工無能に必須の機能だな。たくさんヒントが得られるだろうし、この手の変換フィルタをちょっと調べてみることにしよ。単純で、効果が高いいい方法だ。うーむ。弱点。私は方言しゃべれないから、方言フィルタ作れないのね。独自の人工的な方言作るしかないか・・・。じゃなくて、書き換えの要点をつかむのが目的なのだ。つい、本末転倒になる傾向が自分にはある (^^;;
2003.02.03
コメント(0)
Alice についてちょっと調べてみる。アリスといえば、『不思議の国のアリス』だが、こんなアリスも楽しいだろう。このアリスは 3D 対応のプログラミングを女子中学生にでも簡単に楽しくできるように開発されているもの。アリスというキャラクタを選んだのは、やはりそういうターゲットだからというのもあるのだろう。中学生から大学生のプログラミングを学ぶような年代をターゲットにして、自らコンピュータを使ってストーリーを作り出していくことができるというコンセプト。プログラミングがメイン。だから、ちょっと人工無能の文脈とは違っているかもしれない。で、この Alice プロジェクトは、元々、Randy Pausch がバージニア大学の Computer Science Departmen で 1990年代前半に開始したものだったが、1997年からはプロジェクトの本拠が移ってカーネギーメロン大学(Carnegie Mellon University) Pausch 教授のプロジェクトとなった。そして、従来のバージョン Alice99を最初から書き直したのが Alice 2.0 ということになるようだ。いや、このプロジェクトスポンサーがすごい。Microsoft Research や Intel、なんと PIXAR、Advanced Network & Service Inc 、そして、Chevron なんかも入っている。もちろん NSF, DARPA, NASA なんかもスポンサーに入っている。Python もスポンサーのページでリンクが張られているが、これは Python を使っているからということだろう。Alice には、あらかじめ 3D オブジェクトも用意されているので、自分でオブジェクトをデザインしなくても使うことができる(自分で作ってもよいが)。POV Ray ファイルには対応していない。VRML にも対応していないが、作成されたアリスの世界を Web ページでアプレットとして利用できるようにするプロジェクトも進行中らしい。対応している OS は、Windows ME、Windows 2000、Windows XP。Pentium 500MHz、RAM 128MB、サウンドカード、16bit カラー以上に対応したグラフィックカードが必要。推奨としては、Pentium 1GHz、8MB 3D ビデオカード、256MB RAM、解像度 1024x768 となっていて、一時代前のパソコンだとちょっと辛いかもしれないが、最近のものならストレスなく動くだろう。Macintosh (OSX) や Linux で動かす試みもあるようで、そのうち、Mac や Linux でも動くようになるかもしれない。人工無能に近い文脈としては、A.L.I.C.E. AI Foundation の alicebot (download) の方だな。A.L.I.C.E. Foundation は2001年設立された組織で Alicebot エンジンと AIML を配布している。ずいぶんいろいろな言語で実装されているようだ。 Live Alicebots on the Web のページに実際に動いているがたくさんある。さてどこからどう見ていったらよいものやら。 The History of A.L.I.C.E. あたりから読むか。本題に入る前に力尽きてしまったので今日は終わり。
2003.02.02
コメント(1)
Today 2003-02-01文字コードというのは、普通の人にとって非常に厄介な話なのだが財団法人日本規格協会 符号化文字集合調査研究委員会(新JCS委員会)(長いねー)が JIS X 0213 改正原案の公開レビュー を求めている。よく専門家だけでxxxxを決めてとかいう話が出るが、こうやって、一般に対してレビューやコメントを求めているものは案外多い。だが、ファイル壊れていて読めない~。うーん、困ったものだね。○ 未知語についてさらに (Python で人工無能)「1999年」や「4月3日」のようなものについては、次のようにちょっと人工無能側では扱いにくい形になっている。これは形態素解析がいけないわけではなく、そういうものなんだけど。じゃあ、どう扱うかというところが問題。1999年。1 名詞,数,*,*,*,*,1,イチ,イチ9 名詞,数,*,*,*,*,9,キュウ,キュー9 名詞,数,*,*,*,*,9,キュウ,キュー9 名詞,数,*,*,*,*,9,キュウ,キュー年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン1999年1999 未知語,*,*,*,*,*,*,*,*年 名詞,一般,*,*,*,*,年,トシ,トシ4月3日。4月 名詞,副詞可能,*,*,*,*,4月,シガツ,シガツ3 名詞,数,*,*,*,*,3,サン,サン日 名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ4 未知語,*,*,*,*,*,*,*,*月 名詞,一般,*,*,*,*,月,ツキ,ツキ3 未知語,*,*,*,*,*,*,*,*日 名詞,接尾,一般,*,*,*,日,ビ,ビ月の扱いだけ特別扱いで不純な気がするが、まあ、とにかく英数字を半角にすべてあらかじめしておいて形態素解析に流して未知語として後で扱うか、あるいは全角にしておいて扱うか。ちょっと迷う。未知語にしておいて後処理の方が扱いやすい気もするし。「IBM」なんかは固有名詞として登録されているけれど、半角のIBM はとうぜん未知語になる。「ACミラン」とか「AFLACスクェア」とかの類もせっかく辞書に登録されているのに、半角にして流したら未知語になってしまうのもなんだな。「AP通信,3031,名詞,固有名詞,組織」こういう「組織」という情報はあとで使えるわけだし捨ててしまうのはもったいない。となると、やっぱり、全角に全部変換しておいてから形態素解析に流すというのがよさそうだ。まあ、本来、そういう使い方が前提だから当然なんだけど。英数字を登録してとなると、じゃあ、「IBM」と「IBM」の両方を登録するかとなったら無駄だしな。次のように部分的に登録されているものも、けっこうやだな。やっぱり、半角にしてわざと未知語にしておいて、後処理で未知語を全般的に扱う処理を作った方がいいな。元辞書からバッサリエントリを削除して、未知語に流れるものを多くした上でルール化すると。GIADIE。GIA 名詞,固有名詞,組織,*,*,*,GIA,ジーアイエイ,ジーアイエイD 記号,アルファベット,*,*,*,*,D,ディー,ディーI 記号,アルファベット,*,*,*,*,I,アイ,アイE 記号,アルファベット,*,*,*,*,E,イー,イー。 記号,句点,*,*,*,*,。,。,。GIADIE。GIADIE 未知語,*,*,*,*,*,*,*,*。 記号,句点,*,*,*,*,。,。,。ときおり、辞書のエントリを見ると笑えるものがある。「A子,2886,名詞,固有名詞」とか登録されているのだな。「A子」はあるけど、実は「B子」はない(笑)「広島YMCA」はあるけれど、「名古屋YMCA」はない。とか、まあ、辞書としての純粋さって何?という話もある(MeCab が使っている IPA 辞書っていうのは、そういうものなのだな)。「A子」と登録したら、「B子」、「C子」・・・「Z子」とすべて登録していくのが一つの純粋性だろう。もう一つのやり方としては、「アルファベット一文字」+「子」であれば、固有名詞とするルールベース的なやり方。「広島YMCA」のパターンでは、「固有名詞、地域」+「YMCA」というパーターン。さらに抽象化すれば、「固有名詞、地域」+「固有名詞、組織名」というパターンが成り立つだろう。このあたりもわざと未知語にして流して、後でルールに従ってやったほうが、統一的な枠組みで扱いやすいかもしれない。また、動詞に関しても、「走り続ける」「呼び続ける」が登録されているが、「読み続ける」「泣き続ける」なんかは登録されていない。でも、その割には登録されたエントリが使われていなかったりするな(笑)。つまり、MeCab の場合、登録されていようがいまいが変わらない。私は叫び続けた。私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシは 助詞,係助詞,*,*,*,*,は,ハ,ワ叫び 動詞,自立,*,*,五段・バ行,連用形,叫ぶ,サケビ,サケビ続け 動詞,非自立,*,*,一段,連用形,続ける,ツヅケ,ツズケた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。私は泣き続けた。私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシは 助詞,係助詞,*,*,*,*,は,ハ,ワ泣き 動詞,自立,*,*,五段・カ行イ音便,連用形,泣く,ナキ,ナキ続け 動詞,非自立,*,*,一段,連用形,続ける,ツヅケ,ツズケた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。JUMAN の場合は、登録がストレートに反映されているので、次のようになっている。「叫び続ける」は登録されているから1つ、「泣き続ける」は登録されていないので「泣き」「続ける」と2つに分けられる。私は叫び続ける。私 (わたし) 私 普通名詞は (は) は 副助詞叫び続ける (さけびつづけ叫び続ける 動詞 母音動詞 基本形。 (。) 。 句点私は泣き続ける。私 (わたし) 私 普通名詞は (は) は 副助詞泣き (なき) 泣く 動詞 子音動詞カ行 基本連用形続ける (つづける) 続ける 動詞 母音動詞 基本形。 (。) 。 句点ふーん。アルゴリズムの違いってことか。形態素解析の純粋さからいったら、MeCab の方が一貫してる結果でいいんだけど。どうせ出てこないエントリだったら削除しちゃったらダメなんだろうか。JUMAN 用の辞書とごっちゃになって変になっちゃったかな。うーん、ヘンなところにはまり込んでしまったな。人工無能を作ろうとしているのか、形態素解析の後処理を作ろうとしているのかわからなくなってきてしまった(^^;;うーむ。しかし、人工無能をできるだけ単純にするには、やっぱり、ここをやってやらねばいかんしなー。こういうのをやり始めると、結局は辞書ってことになってきちゃうのだよな。ここにハマるか、先に進むか迷うところだ。うーん。でも、やっぱり、辞書の中をもうちょっとちゃんと見てみることにしよう。
2003.02.01
コメント(0)
今日は、いきなり本題のみなのだ。「はい」と「いいえ」は、はっきり言いましょうね、と子供のころに言われたことはないだろうか。私は小さいころから優柔不断で「はい」と「いいえ」がはっきりしないタイプかもしれない。考えれば考えるほど、「はい」と「いいえ」の境界が曖昧になってどちらだか分からなくなってしまうところがある。「お腹すいた?」「うーん・・・」。こういう人は肥満になりやすい(^^;;また、人の返事をきいても、「はい」が「いいえ」に思えたり、「いいえ」が「はい」に思えたりすることもある。人の返事は意外に複雑なのだ。だから、「はい」と「いいえ」を聞き分けるということは、実は難しいことなのかもしれない。「あなたは、花が好きですか?」「はい」味気ない会話だこと。とにかく、「はい」のバリエーションには、「ええ」とか、「あぁ」とか「うん」・・・とたくさんのバリエーションがあるので、これを人工無能にまず覚えさせる必要があるだろう。「私」や「あなた」のバリエーションと同じように、「はい」と「いいえ」にすべて標準化してしまう方式でまず、この単純パターンに対応することにしよう。ところで、これまであまり、文の末尾が「。」で終わっているかどうか気にかけないでやってきたが、形態素解析にかけるときには、ちゃんと「。」で文が終了しているかどうかを確認して、「。」で終わっていなかったら補完してやる処理をつけておかないと問題がおきるということに、今頃気づいた。いいえ。いいえ 感動詞,*,*,*,*,*,いいえ,イイエ,イーエ。 記号,句点,*,*,*,*,。,。,。いいえいい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイえ 動詞,非自立,*,*,一段,連用形,える,エ,エ「。」で終了していないと、へんな解析をしてくれる。「xxxと言いえる」とかの「いいえ」と解析されてしまっているのだろうか。まあ、これは、ちゃんと文を「。」で終わらせておけばいいので問題ないが、ちょっと心配なので別の文を解析させてみる。いいえといいました。いい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイえ 動詞,非自立,*,*,一段,連用形,える,エ,エと 助詞,格助詞,引用,*,*,*,と,ト,トいい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイまし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。いいえ、といいました。いい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイえ 動詞,非自立,*,*,一段,連用形,える,エ,エ、 記号,読点,*,*,*,*,、,、,、と 助詞,格助詞,引用,*,*,*,と,ト,トいい 動詞,自立,*,*,五段・ワ行促音便,連用形,いう,イイ,イイまし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ。 記号,句点,*,*,*,*,。,。,。うーむ、思ったとおり、このあたりはあんまりうまく解析できないようだ。はいという。はい 感動詞,*,*,*,*,*,はい,ハイ,ハイと 助詞,格助詞,引用,*,*,*,と,ト,トいう 動詞,自立,*,*,五段・ワ行促音便,基本形,いう,イウ,イウ。 記号,句点,*,*,*,*,。,。,。「はい」だとうまく解析できているので、いいえに関してはちょっと、注意して解析結果も見ていくことにしよう。あぁ、それにしても「はい」とか「いいえ」は、「まあ、きれい」とか「やあ、げんきかい」とかの「まあ」とか「やあ」と同じように感動詞なのだな。感動詞は、活用のない自立語で、独立語以外になれないもので、感動、呼びかけ、応答、反問、掛け声、あいさつなどが、この感動詞に含まれるわけで、正しいのだが、感動してしまうんだな。つぎに、「あなたは、花が好きですか?」「うん。好きだよ」うん 感動詞,*,*,*,*,*,うん,ウン,ウン、 記号,読点,*,*,*,*,、,、,、好き 名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ。 記号,句点,*,*,*,*,。,。,。「はい」「いいえ」だけでなく、相手の質問の形容動詞を繰り返すことによって、強調というか確認の発言が加わっている。まあ、こういうふうに同じ形容動詞が繰り返された場合は、素直にバッサリ削除してしまっていいかもしれない。「食べますか?」「食べます」「はい」と「いいえ」が省略されて、動詞が繰り返されることによって肯定される場合もあるのだな。当然、逆のパターンもある。「食べる?」「食べないよ」食べ 動詞,自立,*,*,一段,未然形,食べる,タベ,タベない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ。 記号,句点,*,*,*,*,。,。,。もうちょっと違うパターンを見てみると、「あなたは、花が好きですか?」「ええ。雛罌粟が好きです」ひなげしって、こんなに難しい字なのか。まあ、それはおいといて、花が好きかどうか聞かれただけなのに好きな花の名前まで答えるなよ、処理がめんどくさくなるじゃないか、とは思うものの、こういうパターンに対しても、ある程度なんとかしたいところだ。というわけで、次に続く。ちなみに、子供のときに「ありがとう」と「ごめんなさい」をちゃんといいなさいと教わったが、人工無能に「ありがとう」と「ごめんなさい」を言わせるにはどうしたらいいだろう。どういう文脈で言わせたらいいのだろうと、ふと思った。そりゃ、前の利用時刻を覚えて、会話のはじめに、「xxさん、今日もきてくれてありがとう」とか言わせるのは簡単だし、利用時間が短いのに「ばいばい」とか「さようなら」とか言われたら「話がつまらなかったですか。ごめんなさい」とか言わせるのは簡単なのだが、会話の中で文脈にあった「ありがとう」と「ごめんなさい」をどうするかということ。もうすこし言うと、「頭いいね」とか褒め言葉があったら「ありがとう」とかいうレベルではなくて。擬似感情というパラメータは使わない。理屈によってありがとうと言わせることはできるのか・・・。
2003.01.31
コメント(0)
IBM、人工知能に統合的アプローチという記事を読む。UIMA という新技術を使っているらしい。UIMA とは「Unstructured Information Management Architecture」の略で、XMLベースのデータ検索アーキテクチャらしいが、本質的なものなのかなー。XML ベースでデータのやり取りをしやすくすれば作りやすくなる部分もあるだろうが、それが人工知能の能力の本質に関わるようにも思えないし、基礎技術というより、実装論としてとらえた方がよいのかもしれない。まあ、データがとってきやすくなれば、賢い振る舞いをさせることもできるだろうが、やっぱり本質的に人工知能を発展させるようなものに思えない。Combination Hypothesis って、けっきょく複数の技術を統合して扱うってことなんだろうか。XML ベースにすることによって、人工知能の「ための」データから、人工知能「にも使える」データになることによって、量的な変化が質にも変化を与えるみたいな。『(人工知能の進歩には)おそらく文法的、統計的、高度な統計アプローチ、意味論を組み合わせることが必要だが、共通のアーキテクチャなしではこれは実現できない」とSpector氏。』(上記記事より引用) というのは、それはそうなんだろうけど、だから XML ベースにして人工知能が大躍進というは文脈的に楽観的過ぎるなぁ。ある意味、人工知能版の .NET 構想的というところかな。「共通のフレームワーク」ということに関しては、まあ、システム的な無駄を省くために、あるいは協調分散がやりやすいようにメリットが強調され、注目されるのは時代の流れなのだろうな。もう一度 UIMA にもどると「構造化されていない情報を管理するためのアーキテクチャ」つうことだな。やっぱりデータ構造とその管理のアーキテクチャなわけだ。人工知能そのものアーキテクチャというより。オートのミックコンピューティングとか eLizaとかの延長線上にある戦略の一環ととらえたらいいのかもしれないな。進化する自律型コンピューティング、グリッドにも必須 - 米IBM、日本IBM、“オートノミック・コンピュータ”に関する記者説明会を開催みたいな記事を見ても、だんだんと未来のイメージを明確にしたたかに作り上げてきているのが IBM だな。なんだか TRON という言葉が浮かんでくるような。さて、日本では TRON をどう扱ってまた祭り上げるかと考えている人も多いだろう。とりあえず TRON の日を作って、1日中 TRON の話題を24時間テレビのように連続する特番でもテレビ局がやるといいのだが(笑)。日本人は表面上の言葉に踊らされる人も多いから、ちゃんと構想自体の重要さを理解してあげられる人が少ないのが問題だろうな。これだけ社会もシステムも複雑になってしまうと、笑われたとしても、やっぱり構想をぶち上げることも必要なのだよな。ある程度枠組みがないと無駄が大きくなりすぎるし。話がずれたようだけど、まあ、あちらの人の戦略構想というのは、そういう広い範囲で一つのフレームワークを作り上げているんだから、それを語ればこうなるのは当たり前の話なのだ。でも、まとまりない文章だな(爆)
2003.01.30
コメント(0)
しばらく前に o3124a さんのページで紹介されていた「もういちど月へ RETURN TO THE MOONを久々に見てみた。やっぱりよくできているので、繰り返し見ても飽きない。NHK教育の番組でも見ているようなできばえで、何度も見られる。いいコンテンツだと思ったものは、忘れたころにまた見てみるといいかもしれない。こういう無料で見られる有料コンテンツだけ集めたリンク集や検索エンジンがあれば楽しいのにな。『千と千尋の神隠し』がテレビで放映されてすごい視聴率を記録したようだが、やっぱり何度も見られるような良質なコンテンツを作っていくということは大切なことだと思う。そして、それを大切にしていく姿勢も大切なことだと思う。消費されるコンテンツが多すぎるのだよな。マスメディアというものは、基本的にどれも新しいものをどんどんと消費しながら生き血を吸って生きているわけだし、多くのコンテンツがニュース化されて話題に上がることだけを目的にしたかのように生まれて死んでいくが、やっぱり、じっくりお金をかけて作られるコンテンツというものは大切だなと思う。しかし、『千と千尋の神隠し』が大ヒットするというのは、やっぱり、日本がいかに病んでいるかってことでもあるな・・・。○ 未知語についてもう少し (Python で人工無能)とりあえず、今日の話題の前に、日本語形態素解析器 MeCab のメーリングリスト(このページにリンクがある) の [Mecab 00027] で MeCab の作者、工藤氏が未知語(要するに辞書に載っていないもの)の処理について説明してくれていた。やっぱり MeCab を使うなら、ML を購読しておくといいことがある。でもって、もう少し未知語について考えることにした。MeCab の未知語処理では、単純にいえば文字種(ひらがな、カタカナ、漢字、数字、記号、・・・)によって単語の境界が決められていくということだが、そのあたりで、いろいろいじると何か面白いのかもしれない。1,999円1 未知語,*,*,*,*,*,*,*,*, 未知語,*,*,*,*,*,*,*,*999 未知語,*,*,*,*,*,*,*,*円 名詞,一般,*,*,*,*,円,エン,エンこの場合、「,」の文字種が違うので一まとまりになってくれないようだが、やっぱりつながってくれた方があとで扱いやすいし、製品名などの扱いにしても、つないでしまいたいパターンがたくさんある。ヒューリスティックなルールをどんどん入れていったら当然処理が重くなってしまうんだろうけど、手を入れてみたい気もする。うーむ、でも C++ はなぁ。とりあえず Python でルールを作っていろいろ検証してみる方向かな。で、未知語そのものの本質について考えてみる。言葉はどんどん増殖していくのだから、辞書をどんどんアップデートしていかなければ分からない言葉がどんどん増えてくるのは当然。固有名詞だってどんどん増える。そもそも、MeCab にしても、茶筌にしても、フリーで入手できるものは、辞書の登録数という点では、最初から限界があるので(ある程度限られた数のエントリしかない)、どうやって辞書登録を増やしていくかも考えないといけない。固有名詞に関しては、ものすごい不公平があって(笑)、有名な会社は登録されているけれど、有名ではない会社は当然、辞書に載っていないので正しく扱ってくれない。東急建設東急建設 名詞,固有名詞,組織,*,*,*,東急建設,トウキュウケンセツ,トーキュー大東亜建設大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ東亜 名詞,固有名詞,地域,一般,*,*,東亜,トウア,トーア建設 名詞,サ変接続,*,*,*,*,建設,ケンセツ,ケンセツこれが世の常というものだ。じゃあ、こういう不公平をどうやって解消していったらいいか。一つは地道に辞書登録することだろう。とりあえず会社名であれば、上場企業のリストだけでなく、店頭公開企業まで広く辞書に登録してやることかもしれない。ちなみに、MeCab の辞書だと「マイクロソフト」は載っていても、「オラクル」は載っていない。MeCab 0.72 で未知語処理が改良されるまでは「オ(未知語)/ラ(未知語)/ク(名詞)/ル(未知語)」などと解析されていたわけなのだ。未知語処理が入ったおかげでいちおう未知語の一単語として「オラクル」となったわけだが、「マイクロソフト」(固有名詞,組織)という扱いに比べると非常に低い扱いになっている(爆笑)。これが世の常というものだ。全部登録するの大変だし無駄も多いから、特定のキーワードにマッチして、xx建設だったら、その前も固有名詞とか、株式会社、有限会社、合資会社が前か後ろにつく未知語は固有名詞とか、やっぱりそういうヒューリスティックなルールもとりあえず人工無能側でつくるかな。とりあえず、大量にテキストを解析させて、未知語を拾い出してパターンを調べるのが先決か。また、分かち書きは一見正しくできていても意味上の解析誤りもある。カールを食べる。カール 名詞,固有名詞,人名,名,*,*,カール,カール,カールを 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ食べる 動詞,自立,*,*,一段,基本形,食べる,タベル,タベル。 記号,句点,*,*,*,*,。,。,。お菓子のカールを食べるつもりで、人間のカール(固有名詞,人名)さんを食べてしまうわけだ。ちょっとイジワルなやり方をしたが、人工無能で形態素解析結果の品詞を使うのであれば、未知語じゃないものでも、望んだ解析結果になるとは限らないということをやっぱり前提にしなければならないだろう。「~を食べる」という形で認識させるには、最低でも係り受け(どの単語がどの単語に掛かっているかを解析する)が必要となるんだろうが、単純な文であれば人工無能にそうした格フレーム([主体:人]が[対象:食物]を[動作:食べる])をもたせて、扱ってしまうことも考えるかな。人工無能があんまり賢くなっちゃいけないとは思うが、ある程度やらないと、やっぱり無能すぎるし。うーん、でもそういうことをしないでなんとかする方法もとってみたいな。自動学習に近い形でなんとかするか。なんにせよ、辞書は人工無能の世界観そのものなわけで、どうやって辞書をメンテナンスしていくかも考えないといけないということだな。別に、特定用途の辞書であれば、人名「カール」を辞書からわざと削除してしまってもいいわけだし。辞書っていうのは、追加していけば賢くなるだけでなく、削除することによっても賢くなるだろうし。最初から知らなければ迷わないことだってあるし、間違えることだってないのだから。特定分野に最適化した辞書を用意しておいて、文脈に応じて切り替えてみたり、そうして作った複数の辞書を使って複数回、形態素解析をしてその結果を使って何かしてもいいわけだし。そういう無駄ならしてもいい時代だろうし。
2003.01.29
コメント(1)
人間の感情を読み取る軍用ロボット、開発中(HotWired, Louise Knapp, 2003/01/15) について、「ロボットのセンサーは、心拍を記録するための心電図センサー、発汗などの小さな変化を捉える皮膚センサー、顎と眉の微細な筋肉の動きを検出する筋電計、動脈の収縮を計測する血圧計、体温計で構成されている。」とあるが、言葉ではなく、こうした体の発する言語を元に反応するロボットも確かに面白い。ちょっとオ下劣になるが、軍事よりも究極のダッチワイフを作るという方向で進むと面白いかもしれない。意思決定にかかわる部分よりも、むしろ快感という一点に集中した方が研究もしやすいだろうし。ここの感情を持つロボット開発のようなものを見ていて、やっぱり、こういう形のロボットが社会に溶け込んでいくのは欧米に比べて日本が早いだろうと思う。最低10年ぐらいは効果な娯楽といった感じだろうが、この分野と警備システムというのは研究上、両輪になっているところがあるんだろうな。あとは、自動車産業とロボットか。ロボット産業は、22世紀の大きな産業になるのは間違いないだろう。未知語をどうする (Python で人工無能)日本語形態素解析器の MeCab の新バージョンに関しては、若干不具合があったようで新しいもの(0.73)が出ていた。まあ、ここではDLL を使ってというのはまだ先になりそうだし影響もないだろうからスキップしちゃおう。で、未知語を見ていてよくなったなと思うのは次のようなものだ。基本的に辞書に入っていないカタカナはギタギタ状態だったので、そういうものは全部よくなっている。人工無能の形態素解析はこのくらいやってくれると嬉しい。あとは、人工無能側で MeCab の辞書登録候補を会話から出してやるようなものを作ればいいかなという気になってくる。たとえば、「メーリングリストサーバ」であれば、「メーリングリスト」と「サーバ」がそれぞれ単独で会話の中に出てくるようであれば、個別に登録してやろうとかいった具合。品詞は面倒だから名詞/固有名詞かサ変名詞にでもしてしまえばいいだろう。会話をすべて保存しておいて、その中で適当に類推する程度でも、まあ、人工無能なら許されるし。新: デジカメ 未知語,*,*,*,*,*,*,*,*古:デ 助詞,格助詞,一般,*,*,*,デ,デ,デ ジカ 名詞,一般,*,*,*,*,ジカ,ジカ,ジカ メ 未知語,*,*,*,*,*,*,*,*新:シンコイワミナミ 未知語,*,*,*,*,*,*,*,*旧:シン 名詞,固有名詞,人名,姓,*,*,シン,シン,シン コイ 名詞,一般,*,*,*,*,コイ,コイ,コイ ワ 助詞,終助詞,*,*,*,*,ワ,ワ,ワ ミナミ 名詞,固有名詞,組織,*,*,*,ミナミ,ミナミ,ミナミ新:メーリングリストサーバ 未知語,*,*,*,*,*,*,*,*旧:メ 未知語,*,*,*,*,*,*,*,* ー 未知語,*,*,*,*,*,*,*,* リング 名詞,一般,*,*,*,*,リング,リング,リング リスト 名詞,一般,*,*,*,*,リスト,リスト,リスト サーバ 名詞,一般,*,*,*,*,サーバ,サーバ,サーバ新:ツッコミ 未知語,*,*,*,*,*,*,*,* ツ 未知語,*,*,*,*,*,*,*,* ッ 未知語,*,*,*,*,*,*,*,* コ 未知語,*,*,*,*,*,*,*,* ミ 未知語,*,*,*,*,*,*,*,*新:WikiWiki 未知語,*,*,*,*,*,*,*,* W 記号,アルファベット,*,*,*,*,W,ダブリュー,ダブリュー i 記号,アルファベット,*,*,*,*,i,アイ,アイ k 記号,アルファベット,*,*,*,*,k,ケイ,ケイ i 記号,アルファベット,*,*,*,*,i,アイ,アイ W 記号,アルファベット,*,*,*,*,W,ダブリュー,ダブリュー i 記号,アルファベット,*,*,*,*,i,アイ,アイ k 記号,アルファベット,*,*,*,*,k,ケイ,ケイ i 記号,アルファベット,*,*,*,*,i,アイ,アイまあ、あと例は2Mバイトのテキストをかけるだけでも、凄い量があるのでかなりの改善といえるだろう。微妙だと思うのが記号の扱い。これはくっつけない方がいいのかなぁという気がしないでもないのだが、新: )、 未知語,*,*,*,*,*,*,*,*旧: ) 未知語,*,*,*,*,*,*,*,* 、 記号,読点,*,*,*,*,、,、,、こういうものを見ると、旧:わーーーーい。 わ 助詞,終助詞,*,*,*,*,わ,ワ,ワ ー 未知語,*,*,*,*,*,*,*,* ー 未知語,*,*,*,*,*,*,*,* ー 未知語,*,*,*,*,*,*,*,* ー 未知語,*,*,*,*,*,*,*,* い 動詞,自立,*,*,一段,連用形,いる,イ,イ 。 記号,句点,*,*,*,*,。,。,。に比べると、新:わーーーい。 わ 助詞,終助詞,*,*,*,*,わ,ワ,ワ ーーー 未知語,*,*,*,*,*,*,*,* い 動詞,自立,*,*,一段,連用形,いる,イ,イこの方が、扱いやすい。連続したー~などはバッサリ削除してしまって、感情を示すフラグをつけておくとかできそうな感じもする。「xxだ」というときと「だよーーーん」というときは明らかに心理背景が違うのだから別に将来的には扱えるとかわいい人工無能になりそうだ。メーリングリストなどを対象に解析する場合なども、無駄な記号(笑)を取り除くのに若干処理が少なくなるし。うーんでも句読点に関しては、そのものが連続していない限りは単独で取り扱って欲しい気もするな。なんにせよ、形態素解析側で未知語として扱われているものと、人工無能側で何らかの知識を持つ単語がクロスしたときの取り扱いなども考えておくとおもしろいかもしれない。ほんとうは、単語単位で簡単にテンポラリに形態素辞書に追加できるようであれば、さらに面白いだろうが、とりあえず、学習情報を蓄積して、一定度溜まったらどうこうするとかいう方面で何か考えてみるかな。形態素解析レベルの未知語と人工無能の未知語が必ずしも一致するわけではないし、何かできそうだな。あと、英数記号の類かな。形態素解析ではこの程度にしておいた方がいいかもしれないが、人工無能側では、まとめてしまうようなことをした方が扱いが楽になる。EBN-3032EBN 未知語,*,*,*,*,*,*,*,*- 未知語,*,*,*,*,*,*,*,*3032 未知語,*,*,*,*,*,*,*,*PC9800PC 未知語,*,*,*,*,*,*,*,*9800 未知語,*,*,*,*,*,*,*,*ISBN-38920-43848-43ISBN 未知語,*,*,*,*,*,*,*,*- 未知語,*,*,*,*,*,*,*,*38920 未知語,*,*,*,*,*,*,*,*- 未知語,*,*,*,*,*,*,*,*43848 未知語,*,*,*,*,*,*,*,*- 未知語,*,*,*,*,*,*,*,*43 未知語,*,*,*,*,*,*,*,*EOSあと、人間の目からすると同じものが、微妙に違うのだな・・・。ふと思うに数詞という概念がないのか。1999年1999 未知語,*,*,*,*,*,*,*,*年 名詞,一般,*,*,*,*,年,トシ,トシ1999年1 名詞,数,*,*,*,*,1,イチ,イチ9 名詞,数,*,*,*,*,9,キュウ,キュー9 名詞,数,*,*,*,*,9,キュウ,キュー9 名詞,数,*,*,*,*,9,キュウ,キュー年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン1月2日1月 名詞,副詞可能,*,*,*,*,1月,イチガツ,イチガツ2 名詞,数,*,*,*,*,2,ニ,ニ日 名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ1月2日1 未知語,*,*,*,*,*,*,*,*月 名詞,一般,*,*,*,*,月,ツキ,ツキ2 未知語,*,*,*,*,*,*,*,*日 名詞,接尾,一般,*,*,*,日,ビ,ビちなみに、JUMAN を使ってみると、次のようになるから、JUMAN の場合全角数字にしておけば、ちゃんと数詞になってくれるので気にしていなかったが MeCab はちょっと、ここ負けてる。1月2日1 (いち) 1 数詞月 (つき) 月 名詞性名詞助数2 (に) 2 数詞日 (にち) 日 名詞性名詞助数1999年1999 (いちきゅうき1999 数詞年 (ねん) 年 名詞性名詞助数1999年1999 (1999) 1999 その他年 (ねん) 年 普通名詞1月2日1 (1) 1 その他月 (げつ) 月 普通名詞2 (2) 2 その他日 (にち) 日 普通名詞あれあれと思って、茶筌を見てみると、1999年1 イチ 1 名詞-数9 キュウ 9 名詞-数9 キュウ 9 名詞-数9 キュウ 9 名詞-数年 ネン 年 名詞-接尾-助数詞1999年1 1 1 未知語9 9 9 未知語9 9 9 未知語9 9 9 未知語年 トシ 年 名詞-一般1月2日1月 イチガツ 1月 名詞-副詞可能2 ニ 2 名詞-数日 ニチ 日 名詞-接尾-助数詞1月2日1 1 1 未知語月 ツキ 月 名詞-一般2 2 2 未知語日 ビ 日 名詞-接尾-一般うーん、めちゃくちゃ中途半端。全角半角の扱いは入力側でんとかせよというポリシーにすればいいとしても、うーん、このへんなんだかなーと思わんでもない・・・。
2003.01.28
コメント(0)
どこかに無くしたと思ったメモが出てきたので、昨日分を書いたばかりだけど、今日の分も入れてしまおっと。お、MeCab の 0.72 が出ている。「未知語処理ルーチンが少しまともになった」らしい。さっそく、感謝して使わせていただきましょう。ちなみに昨日の日記でちょっと書いた cocab との merge は次のバージョンと。楽しみ楽しみ。ちなみに、ちょっと使ってみたが、カタカナの未知語の扱いがすごくよくなった。記号については、ちょっと判断に迷うところがあるが、口語ベースの文やメールを扱う場合だと、まあ基本的に better なのだろーーーーーーう。うぁーーー、これでなくちゃという感じ。明日のネタができた~~~~(笑)。内山将夫,井佐原均.(2002) 日英新聞記事の対応付けと精度評価.情報処理学会研究報告, 2002-NL-151, pp.15--22.を読んだ。しかし、いかんせん、The Dialy Yomiuri なんて一般人の手出しできないようなものを使った研究は意味がないのだ(笑)。で、この内山将夫氏の並べる会というページにある再配布可能な訳文と原文の文対応付けは面白いな。プロジェクト杉田玄白正の成果の原文と訳文を対応付けをしているわけか。ヴェブレン、ソースタイン『所有権の起源』、レイモンド、エリック・S 『ハッカーになろう』、ロンドン、ジャック『火を起こす』、ワイルド、オスカー 『幸福の王子』 (html/data)、ワイルド、オスカー 『わがままな大男』が扱われている。こういものの量が増えてくると面白いことになってくる。こういうことをする人には、最大の賛辞を送りたい。あぁ、でも所詮、文対応付けソフトウェアがEDR日英対訳辞書とEDR英日対訳辞書とを必要とするのだよな・・・。結局のところ EDR - 日本電子化辞書研究所の辞書がネックになって自然言語処理は素人が手を出すものではないということになってしまうのだ。IPALの辞書だと語彙数がたかが知れているし、EDR の辞書が欲しい。○ 過分割についてちょっと考える (Python で人工無能)形態素解析結果から過分割を検出する統計尺度(pdf) も読んでみる。形態素解析の精度が97%~99%(Fuchi and Takagi 1998) ぐらいになってしまうと、人手で誤りを検出するのは大変だからプログラム的にやってしまおうということか。ふーん、実験結果で茶筌の過分割は1.5%以下か。でも、けっこうやっぱり多いな。一般的なものだと未知語の数も辞書を増強しないと増えるわけだし。過分割(「今日/の/金/相場/は」が「今日/の/金/相/場/は」になってしまうようなもの)と分割不足(「ユニックスワークステーション」が「ユニックスワークステーション」)、語境界交差型(「病気/が/まん延」を「病気/がまん/延」になってしまうようなもの)とに分けられると。語境界交差型は、「が/まん延」の「が」でまず切らなければいけないところを切らずに「がまん」としてしまっている分割不足と、「まん延」と一つにつなげなければいけないところで「まん/延」余計に分割してしまっているということか。東南アジアツアーを((東南)(アジアツアー))だと誤りで(((東南) アジア) ツアー)だと正解(東南-アジアツアーではなく、東南アジア-ツアー)とするのは、一般人の感覚にもマッチしているな。まあ認知的にはヨーロッパツアー、東ヨーロッパツーア、西ヨーロッパツアー、エジプトツアー・・・、と見ていくと、アジアツアー+東南[アジア]という枠組みになってるんだろうけど。末尾の誤りの例をざっくりと眺めてみる。人工無能の方では、まず助詞に関わるところをまず集中的にチェックしたらいいかな。助詞を軸にしてみていくような。「結果」が「結(普通名詞)/果(普通名詞)」とかいうこともあるのか・・・。普通名詞/普通名詞もなにか適当にやった方がいいかも。固有名詞+未知語なら、単純につないでしまうとか、「虹/を/描/い/た/旗/を/揚/げ」「高らか/に/歌/う」のパターンも実感として多そうだからエイやでやって、フィードバックをかけていくようなやり方にするかな。なんにせよ、形態素解析として正しくなくても、置き換えなどやったときに問題ない形になっていればいいのだから、適当にやりゃいいや。うーん、やっぱり、動詞と助詞、それに語尾、接頭.接辞など、名詞/形容詞/形容動詞以外のところを練っていった方が面白いものが作れそうだ。
2003.01.27
コメント(0)
トーくんというのが Nifty にあった。これ、Harbot に対抗して作ったのかなー。Harbot は無料だけど、トーくんは売り物というところがちょっと違うし、コンセプトも育てゲーム的な要素とランキングによる競争原理を取り入れ、また会話の要素が強いというところが違うんだけど。まあ、Harbot の二番煎じなわけだからそのくらいやらないとね。「はい」と「いいえ」の教師信号はやっぱりボタン使ってるし。1月29日からランキングが発表されるようになるようだ。月に200円だから、ここにも置いてみようかな。うーむ、かって設置したら、私が誰か Nifty の人にばれるな。まあバレたって所詮 anonymous なわけだから、特に問題ないといえばないんだけど。ほんとうの anonymous にしておくのは、サービスを利用しようとするとけっこう難しいもんだ。で、せっかく入れたから傀儡師研究室にも遊びにいってくださいませ。異分子(仮) - dissident - チョムスキー・アーカイヴ日本語版はなかなか面白い。言語学者として有名なノーム・チョムスキーだが、最近ではむしろ、アメリカの外交政策を批判するような政治的な発言をする著名人としての方が注目度が高いか。ここのサイトは面白い視点を提供してくれるので、ときどき眺めてみると面白いだろう。インターネットで一番面白いのは、やはり、大手メディアが封殺してしまうようなものを、どんどん流し続けるような人々への影響だ。サイトを立ち上げて、そこに主義主張を載せるだけで、書籍にして一般書店に並べるより、もっと大きな潜在的読者を得ることができるのだから。書籍にして販売すれば、確かにお金にはなるかもしれない。しかし、それと引き換えに言論の自由を失うのであれば、無料でできる限り多くの人に主義主張を知ってもらった方がはるかに得であると考えて行動する人も多いということだ。この部分については、地道にどんどんと草の根レベルで広がっていき、やっぱり、やがては世界を変えていくような動きにつながっていくのは間違いないだろう。ただし、すごーく長い時間がかかる。長い時間がかかったとしても変わっていくことに意義があるのだ。まあ、こうした動きとは正反対に、何にも考えない人の数も増えているのもまた確かなのだけど。英語のわかち書きについて、cocabという一般英語 + ゲノム文書のための解析器が公開される。理研の山本氏という人なのか。ソースはまだ公開されていなかったが、将来 MeCab から使えるなら面白そう。Python で使える英語用の Tagger には、MontyTaggerというのがあるらしいので、英語はそれでも使おうかと思っていたが、ちと考えてみる必要があるか。え、そりゃいまどきの人工無能はバイリンガルでしょ(笑)。で、このあといろいろ調べて書き込んだファイルをどっかにやってしまった。はぁ~。以上
2003.01.26
コメント(0)
MagicDraw UML をダウンロードしたことがあるが、そのリトアニアにある会社から EVSD (Eternity Virtual Secure Drive) の宣伝メールが来た。まあ、安全にバックアップをインターネットを使ってデータセンターに保存するような商品。JAVA クライアントでアクセスするみたい。日本語のファイルは大丈夫だろうか。ASP モデルだと $19.95 だとか。この会社自体は ASP 事業というより、ISP に対してプログラムを売りたいのかな。UML のツールなんて作ってる会社だし。まあ、この手のサービスは価格がそこそこで安心感のあるやり方をすれば、そこそこ成り立つだろう。rsync (*nix のコマンド) を使えばいいか。で、その場合、どこへというのがあるのだよな(笑)。ファイルの暗号化まではこれだとダメだから、いったん暗号化しないといけないか(サーバ上で暗号化されていないと)。で、複数の友人とかなどで互助会的にサーバを運用するとかすればそこそこ低コストで使えるかな。とりあえずデモを使ってみる。テキサスにあるデータセンターにつながる。転送する前にまずローカルで暗号化して圧縮してるのかな。1MB 分のテキストファイルだが結構時間がかかった。転送はさらに時間がかかる。うーん、最初はそういうことなのだろうな。で、次回からは差分だけを送るような形になって時間は短縮されると。まあ、こういうのは、よっぽど大事なデータだけだな。で、よっぽど大事なデータを人に預けるというのも信頼関係の話になるので、それはそれで心理的に抵抗感がある話なのだよな。まあ、35日間使えるらしい。35MB だとちょっと少ない(このくらいの量ならそこそこ商売として運用コスト的にも成り立つか)。GB単位で欲しい。料金を眺めてみると 1GB までなら、$24.95 (基本料金) + $14.95 = $ 39.9 か。うーん、微妙だけどちょっと高いかな。2000円台にはなってほしいところ。日本語ファイル名は文字化けするし。それに月1万円仮に払えば数十ギガバイトのHDD 月のサーバを単体で借りられるからやり放題だし。5万も出せばマシン1台買えちゃうから。CD-R に焼いたっていいし。そう考えると成り立ちそうでなかなか成り立たない商売なのだよな。○ たかが Eliza されど Eliza(2) (Python で人工無能)延び延びになっていた Eliza の中身をいよいよ見始める。Eliza と私との出会いは、かれこれ 10 年以上前だろうか。最初に見たのは BASIC で書かれたものだった。これを当時の国民機 NEC PC98 シリーズの互換機の EPSON で動かしたのが最初だ。LISP 版もその後見たかな。で、とにかく見てみると、Python で書かれたものは、はるかに分かりやすい。あ、正規表現使っているから簡単になったのか。ふーん。eliza をクラスとして定義している。つまり、まあ、Eliza というのはどういうものになるのだよという設計図が最初に書かれているわけだ。この設計図あるいは遺伝子とでもいったらいいのだろうか、これを元に実際に動かすときに Eliza の実体を作ってお話するわけ(我ながら滅茶苦茶ラフな解説である)。LISP 版であれば、この設計図自体を変更していくことができるので Eliza の進化が可能といえば可能だ。遺伝子にたとえたのは、この実体を作り出す設計図自体を自動的に書き換えていくプログラムを作れば、さらに自動的に進化していける。そして、突然変異が発生したり、実体がまともに動かずにすぐに死んでいったりなどすることを念頭においている。が、Python 版ではきっちりとした設計図なので、これに従ったものしか現れてこない。ゆえに、人工知能であれば LISP はやっぱり便利なのだなーと改めて感じる。だが、人工無能であるので、そんなことは心配する必要がないのだ。だいたい、高度なプログラムはそんなに簡単に作れるものではないし、逆に理念だけが勝ったもの作ってもしょうがないので、動くことの方が大切なのだ。と能書きばかり長い(笑)。さすがにここで終わってはなんなので、もう少し続ける。まず、クラスつまり設計図というか雛形が実体になるときには、__init__ という関数が呼ばれる。この中でデータを Eliza が読み込んで使いやすい形にしている。たとえば、次のように会話の元が書かれている。 [r’I need (.*)’, [ "Why do you need %1?", "Would it really help you to get %1?", "Are you sure you need %1?"]],正規表現を使って、「私はxxが欲しい」(I need) と来た場合には3つのパターンを用意する。つまり、「どうしてxxが欲しいの?」"Why do you need %1? と(省略)、で、実際には %1 の部分にマッチした文字を当てはめていくということになるわけだ。英語の場合、これがやりやすいのは、例えば、"I need a friend who ....." と友人(friend)を修飾するようなものが長々ときても、それをそのまま持ってきても、ちゃんと文が成り立つ可能性が高いことだ。日本語だったらどうだろう。「=私は疲れているので、おとなしい友人=が=欲しい」と日本語であった場合には、「ほんとうに、=あなたは疲れているのでおとなしい友人=が=欲しいのですか」。あれ、一応できるないことはないね(笑)。まあいいや。とにかく、Eliza の場合、入力に対する応えがうまく出来ていて、誘導しやすいようになっているのが特徴。あとは、英語の特徴で、けっこうラフなやり方をしても、うまくいってしまうのだ。まあ、日本語の場合でも動詞を軸に駆動にすればできないことはないのだなー。なのに名詞駆動の人工無能が多いのはなぜ・・・。「欲しいのです」、「欲しいのだよ」、「欲しいんです」。語尾に変化をもたせるとすぐに破綻してしまうのだよな。つまり、マッチさせるのが難しい。形態素解析を使おうとおもったのは、こういう語尾の変化を吸収させてしまうためなのであった。あとは、「欲しいなんてことはない」。こういうちょっとねじくれたものも対応できないことはないから。たとえば、否定形が後ろに来ていたら、対象外にするとか。そんなわけで、ほんとうは、詳細に見ていくと日本語だと英語に比べて言語の特性上、うまくマッチしないパターンがあるということを示せるのだろうが面倒なのでやめておく。とにかく、この会話のネタを仕込むことが最初に行われるわけだ。正規表現を高速で行えるようにコンパイルして(コンピュータが理解しやすい形式に変換して、応対用のデータを覚えこむ。最初に学習してしまうわけだ。で、あとは、設計図の中でどんなことをするか、行動様式を決めてやる。この行動様式には、変換(translate) と応答(respond)がある。非常に単純なのだ。つまり、何かを聞いたら、それに対して何らかの変換を加えてやって、応答文を返す。ただそれだけ。変換(transform) では、入力された文をまずスペースで分割する。日本語なら形態素解析を行って単語ごとに分かちがきしてやるが、英語の場合スペースで切るだけだから1行で済んでしまうのだ。で、最初に覚えこんだ正規表現パターンとは別に用意してある単語の置き換え用の辞書を参照しする。つまり正規表現とは別に単語辞書が用意されているのだ。ここでは、I am ... の I を You に置き換えたり、am を are に置き換え、また、you’ve を you have に置き換えるために使う。つまり、I と You の変換のための小さな辞書から、キーの部分だけを抜き出してやる。つまり I, am, you’ve というリストができる。そうしたら、入力された文の頭から置き換えリストを参照して、置き換える必要がある単語は置き換えてやる。で、それが終わったら、もう一度、ばらばらにした単語をつなぎなおして一つの文字列にして返す。応答(response) では、初期化のときにリストを作ったパッチパターンと回答集を参照して、入力文からこのマッチパターンに合うものを拾い出す。で、それに対応する回答集の中からランダムに例文を引っ張りだす。%1 のように穴埋めしなければいけない部分が例文の中にあれば、そこに適切な要素を埋め込む。で、疑問文のクエスチョンマークなど調整して、文字列を返して終わり。実際のプログラムでは、これを繰り返し呼び出して会話を行うわけだ。なんで、その程度にも関わらずもっともらしい動きになるか。それは、登録してある例文のウマさと、英語自体の特性によるものだろう。日本語ではとてもこれと等価のプログラムを同じような行数で書くことはできないのだ。だから、たかが Eliza されど Eliza なのだ。これの元となったプログラムは、1966年に作られたものであることに注意! 要するにアメリカではその時代にすでに人工無能の走りが出ていたわけで、現状ではもっと高度なものになっているということだ。なんて書くと、次は Alice でも見なきゃいけないのかな。その前に、やっぱり、プログラムの方をすすめないとな。今日の教訓。動詞駆動になるように注意せよ。日本語の語尾の扱いに注意せよ。それは日本語の文生成でもあるわけだが、ゆえに面倒なところもあるので、どこで切り上げるかも考えておこう。あぁ、そういえば、「はい」と「いいえ」扱いについても、早めに入れないといけないな。日本語と英語とでは、やっぱり英語の方が楽なのだよなー。とにかく、今日はここまで。
2003.01.24
コメント(0)
TsumWiki という Wiki の一種が公開されたようなので、そのソースを眺めてみる。Zope の ZServer を使って、データは Berkeley DB に保存するというもの。コメントをつけながら見ているが結構参考になる。人工無能もこれに組み込んじゃうかな・・・。もちろん、会話は全部 DB に記録されるのだ。しばらくの間はデスクトップを中心にしていこうかと思っているのだが、ウェブからもそのうち人工無能にアクセスできるようにしたいと思っている。で、そうしたときに、どういう形態で動かしたらいいかなども、ちっと考えてみるのだ。Python のウェブサーバといえば、Zope という手もあるのだが、やっぱり Zope はパブリッシング中心と考えた方がよくて、インタラクティブな用途に使うには適していない。TsumWiki も Zope の一部の ZServer というオブジェクト指向のサーバを使っているが、基本的に Python のオブジェクトを永続的にシームレスに使えるのが便利なので使っているのだろう。でも、ページのパブリッシュについては Zope の部品は使っていない。Zope っていうのは、けっこうそうやって部品としても使えるものなのだな。Standalone ZODB といって Zope とは切り離された状態で使うことができるオブジェクト指向のデータベースもあるし(もともと Zope のデータベース)、Zope3 という次世代のサーバでは、もっと部品化が進むらしい。そしたら、また考えればいいのだ。TsumWiki は、個人のサイトで使っているものを好意的に GPL で公開されたものなのだが、これだと比較的簡単に改造もできるし、これ以上、公開がなかったとしてもいじれそうな感じなのでしばらくこれを使ってみるかという気になっている。まあ、これをいじり倒せば自分でも新しいのが作れるようになっているだろうし。まあ、これだとウェブページ上でのちゃっとという感じになるかな。ただそういうものじゃなくて、もっとサーバと個人が蜜に他者を介在させないような形で連携させるには、もっとちがったものが必要かもしれない。Twistedというサーバは面白そうな感じだ。こういうものの方がサービスレベルで動かすようなものには適しているかもしれない。Python ってけっこう面白い動きがあるのだよな。いまいちマイナーだけど。PEAK (Python Enterprise Application Kitも方向は人工無能とは関係ないけどおもしろそうだし。まあ、探してみるといくらでも楽しそうなものがある。日本でなんでもっと Python が流行んないのか不思議でしょうがない。簡単なところでは、Spyceという ASP や JSP みたいな感じで Python が使えるものもあるし。まあ、セキュリティを気にせずにバンバン作ったものをウェブから使えるようにしたければ、このぐらい簡単なものの方がいいかもしれないけど、ウェブサーバ自体が統合されていた方が楽でいいかな。あとソースがすごく見づらいからやっぱり Spyce はダメだな。IPythonを使えば、対話的なシェルとして、自然言語でいろいろコマンドまで動かしてしまうような用途にはよさそうな感じだ。ふーん、それにしても IPython マニュアル見てもいろいろ便利に使えそうだな。MEMS Exchange の Quixoteなんてものもあるのか。Spyce なんかより、かなり高度な感じだな。こっちの方が Spyce よりソースも見やすくていい。XML-RPC のサービスなんかもやりやすいようだ。CherryPyは名前がかわいい。中身はけっこうちゃんとした感じでよさそう。このぐらいが一番使い勝手はいいのかな。Snakeletなんていうのもあるのか。これは教育用か。小さめだから読んでみようかな。PYRO (PYthon Remote Objects.) というのは、パッと見た目で惹かれるものがあるかな。SOAP vs CRBAのあたりもそのうちチェックしよう。ここから Webwareというのにリンクが張られている。日本人でも PyPageなんていうものを作っている人がいるんだな。BeOS でも動くとか書かれているところがマニアだなぁ。しかし、ほんといろいろあるな。うーん、やっぱりとりあえずTwisted あたりからかなー。まあ、そんなこんだで今日は終わり。
2003.01.23
コメント(0)
小岩井ヨーグルトが気に入って、また買ってきてしまった。しばらくヨーグルトはこれかな。○ たかが Eliza されど Eliza(1) (Python で人工無能)Eliza の話をするといいつつ、先延ばしにしてきたが、というかあまりに人工無能の根本的なところなので、逆についついないがしろにしてきたわけだが、2回に分けて Eliza について扱うことにする。Eliza は、Joe Weizenbaum という MIT の先生が 1966年に作った人工無能の祖先ともいえる存在。とても有名なのだが、日本でこれを動かしているサイトはほとんどないだろう。というのも、英語しか話せないからだ。あたりまえといえばあたりまえ。Eliza はすごく単純に見えるので、これにハマった女性がいるという話が信じられない人もいるかもしれない。もし、そうだとしたら、それは、あなたに想像力がないか、それとも英語力がないかのどちらかだろう。Eliza は英語力と根気さえあれば、延々と自分で独り言を繰り返したり、日記を書いたりするのと同じ感じで話し続けることができるはずだ。私にはできん(笑)で、とりあえず、Python 版を探してみると、Joe Strout氏の therapist.pyが見つかったが、もう少し探してみると、Jez UK Ltd - eliza.py - ELIZA in Pythonが見つかった。中身はほとんど同じで、前者を若干書き直してモジュールとし、セットアップファイルをつけたものだった。ということで後者を明日は見てみることにする。とりあえず、ダウンロードしたファイルを解凍して、解凍したファイルがあるディレクトリに DOS プロンプトで移動して、python setup.py install とすればインストールできるだろうが、面倒なので、その場で eliza.py をダブルクリックすれば Eliza が起動する。黒い画面が見にくければ、IDLE にいったん eliza.py を読み込ませて Ctrl-F5 で動かしてもいい。このモジュール版の何がいいかといえば、上にあるようにセットアップしておけば、次のようにして、簡単に Eliza を他のプログラムから呼び出せるようになるところ。今作っているものも、そのうち、こういう形で使えるようにしよう。import elizatherapist = eliza.eliza()while(some_condition) # どこから入力を得る reply = eliza.respond(input) # どこかに返答を送るインストールが面倒だけど試したいなら、Java 版の Elizaなどがオンラインで試すことができるのでいってみるといい。ちょっと変わったものがいいなら、Ask Jesusとかでもいいだろう。パロディ版ね。"Please go on, my Child." なんて言うのだ。基本のプログラムはいっしょみたい。このサイトKing James Bible Search なんてあるから、そのうち、聖書の中から何か返してくれるようになるかもしれない。なお、オリジナルの Eliza については、Weizenbaum, Joseph (1966), ELIZA - A computer program for the study of natural language communication between man and machine, Communications of the ACM 9:36-45. や、ELIZA--A Computer Program For the Study of Natural Language Communication Between Man and Machine、あるいは、J. Weizenbaum, ELIZA - A Computer Program For the Study of Natural Language Communication Between Man And Machine Communications of the ACM, Vol 9, No 1, January 1966 (pdf) を見るといいだろう。
2003.01.21
コメント(0)
『虚栄のかがり火』(THE BONFIRE OF THE VANITIES)を見た。面白かった。トム・ハンクスやブルース・ウィリスってなんかいいのだ。映画自体、エンターテイメント作品として適度に楽しめたが、サイテー映画に送られるとかいうゴールデン・ラズベリー賞(Golden Raspberry Award)にノミネートされた作品のようだ。一流の俳優を使って一流の監督がこんな安っぽいもの作ってという感じなのかな。それはそれで面白いと思うんだけどな。名作とはいえないのは確かだけど。○ あなたと私の言い換え版 (Python で人工無能)1月13日のプログラムをまだ出していなかったので、傀儡師研究室のダウンロードページで参照できるようにしておいた。このバージョンでは、「あなた」と「私」を入れ替えて、前と同じにランダムな言葉をつけて返すものだが、カタカナで入力を返すのはやめた。で、次のような感じの会話?ができるようになった。>>> あなたの名前は? 傀儡師傀儡師 > 私は元気だ。あなたは元気だ ということですね。平凡 ですね。傀儡師> お前はバカだ。私はバカだ ということですね。平凡 ですね。傀儡師> あなたはどうしてバカなのか。私はどうしてバカなのか ということですね。純粋 ですね。傀儡師> そちは何者じゃ。私は何者じゃ ということですね。平和 ですね。傀儡師> 私は貴方の目が好きだ。あなたは私の目が好きだ ということですね。悲壮 ですね。このレベルだと、まだ、わざわざ形態素解析を通すまでもないという話もあるが、「私立高校に行く。」と入力しても、文字列の単純置換ではないので「あなた立高校」というようなバカな変換が起きないのが、すでにメリットとして感じられる。「私たち」「あなたたち」などは、次のように解析されるので、「私たち」は「あなたたち」に、「あなたたち」は「わたしたち」にそれぞれうまいこと変換される。あなたたちあなた 名詞,代名詞,一般,*,*,*,あなた,アナタ,アナタたち 名詞,接尾,一般,*,*,*,たち,タチ,タチEOS私たち私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシたち 名詞,接尾,一般,*,*,*,たち,タチ,タチEOSなお、かなりまだ手抜きをしているので、入力文の末尾は句読点で終わらせておく必要がある。文をつなげるために、単純に最後の半角2文字分を削除しているので、句読点を入れないで文を入力すると最後の文字が消えてしまう。また、品詞のチェックをしていない。しばらくの間、このままぐちゃぐちゃといじって、落ち着いたところで、形態素解析もライブラリを使うようにして、クラスを使ったオブジェクト指向的なものも取り入れていく予定。でも、予定は未定は相変わらずなのだ。
2003.01.20
コメント(0)
今日はエドガー・アラン・ポー、森鴎外、ロバート・プラント、宇多田ヒカルなどの誕生日だったのだな(以上、敬称略)。知識を深める 雑学研究のページを時々見に行くのだが(右側にリンクもあり)、ときどきボーっと眺めて考え事をすると楽しいのだ。あぁ、そういえば醍醐天皇(885/01/18生れ)、どこか気になる存在。菅原道真関連で気になるのかな。それとも、藤原氏関連で気になるのかな。うーん、なんで印象に残ったか忘れたので、よけいにひっかかりを感じる人なのだな。うーん、なんでだろう。やっぱり、梅原猛のなんだっけ、題名忘れた(最近、ほんとに物忘れがひどい)、菅原道真の話を扱った本から受けた印象が強いんだろうか。『隠された十字架』あたりかな。『隠された十字架』といえば聖徳太子、聖徳太子といえば、山岸涼子の「日出処の天子」。もう、ずいぶん昔に読んだけど斬新で面白かった。斬新な人間像を見せてくれるものは面白い。やっぱりここまでくると、藤原不比等が気になり始める。二つの御落胤伝説 -出口王仁三郎と藤原不比等- なんていうのは、面白い。藤原不比等について、やっぱり地道に調べてみようかな。素人が歴史を調べていくときに、どんなアプリケーションがあると便利なんだろう。「Python で人工無能」と平行して「Python で歴史探索」というのを始めてみよう(笑)○ 何が必要なのだろう (Python で歴史探索)藤原不比等を調べるにあたって、あちこちのウェブサイトを探索してみる。うーん、探索したら記録を取れると便利だな。URL とページ名と、簡単なメモ、カテゴリ、参考になる度合い(レイティング)とかを残せるようにしたらいいだろうか。検索は Google で行うことにするんで、Google API でも使ってみようかな。・ Google API を使って、藤原不比等で検索。URL の一覧を保存。・ 検索結果を表示して、クリックしたらそのページが開かれる。・ メモ入力、カテゴリ、レーティングなどを行い保存・ 保存された URL からページを取得して保存。・ 保存されたページを形態素解析し、インデックスを作成・ 保存されたページを検索できるようにする。・ 保存されたページ内にあるリンクのチェック・ ゴミリンクのチェック・削除とかこのあたりからだろうか。あとは、形態素解析をしても、いろいろ解析に失敗するだろうから、どういう単語を登録したらよいか検証したりするツールがあると便利なのかもしれない。・ 電子辞書の検索・ 書籍/論文等のリファレンスの作成・ ターミノロジーの作成・ 人物辞典的なリンク集の作成・ 家計図グラフの作成・ 人物相関図の作成フーム、考えてみるとけっこう大掛かりなものになっていくな。また、こっちも、ちょっとずつ、スクラッチから構築していくことにしよう。ん、これが人工無能とつながる日は?100年ぐらい先かもしれない。「醍醐天皇の生まれた日は?」→「西暦885年1月18日です」。「藤原不比等の父親は?」→「いちおう藤原鎌足ということになっています。が、天智天皇の御落胤という説があります。これに関するページとしては[link]があります」なんてやってくれたら便利かな。藤原不比等・生年月日で検索して、ピコっと「西暦885年1月18日」関連URL..... ときれいに出てくるのもありなのだけど、言語活動を軽視しているのだよな。自分用の言語で語られた方が頭の中が整理されるのだ。だって、一覧表10分間見て、その後、それについて語ってくれと言われたときと、一覧表に載っているようなことを語り口調で説明された文章を読んだあと、どちらが頭に残るかといえば文章の方でしょ。一覧表というのは眺めて、頭の中の整理をするのには役立つかもしれないけれど、新規知識習得には向いていないのだ。いったん、覚えたことでも忘れてしまったことなどは、新規知識習得に近いのだから、やっぱり語られた方が頭の中にすんなり入る。単純なものでも、流れを作ってやった方がいいのだ。さて、5年ぐらいかけたら、そこそこのものができるだろうか(笑)。だいたい、ここまで作る時間、調査にあてたら、けっこういろいろ調べられるよな。本末転倒ってやつだ。とにかく本末転倒企画として、しばらく試してみることにしよう。
2003.01.19
コメント(0)
『クッキー・フォーチュン』(Cookie’s Fortune)を見た。うーん、これ面白いではないか。借りたときにはよく分からないで借りたのだが、ほんとに何回も見たくなるような変で面白くていい映画。これは映画を見たって気になる。なお、上の URL のリンクだが、リンク切れになってしまうが、これわざと。URLの coookie/index_top.html coookie の「 o 」を一つ削るのだ。楽天はへんなことしてるから、悪いことしてると勘違いされちゃうのだ。URL中のクッキーに過剰反応しちゃうらしい)○ 肯定文と疑問文の変形コンセプト3 (Python で人工無能)やっぱり、毎日書いてないと、前に何を書いたか忘れてしまうな・・・。トリ頭の私であった。とにかく、もうちょっと考えておこう。会話がうまく進むかどうかは、受けの巧妙さにかかっているところがある。人と話しているときでも、ちゃんと相手が聞いてくれているかどうか、どうやって判断しているのだろう。対面している場合には、80%以上ボディーランゲージなのかもしれない。電話で話している場合には、なんと言うかよりも声のトーンや合いの手を入れるタイミングなのかもしれない。しかし、人工無能では、相手の顔色を見たり、声色から相手の感情を知ることもできないし、こちらの感情を伝えることもできない。すべてが文字情報のみによるのだ。だから、それだけでも、対面して会話する場合や電話に比べて情報量が少なくなり、人間くささが消えてしまう。言葉の中に感情をどう込めているように感じさせるか。一つは、返す言葉の中に相手の話した言葉を繰り返すこと。相手の言葉を繰り返すことによって、あなたの言っていることを聞いていますよ、という姿勢を示すことができる。尋ね返すにしても、やり方がいろいろあるだろう。「私はシャイだ」変換1->「あなたは、シャイだ」変換2->「あなたは、シャイですか?」ここまでだと、やっぱり、バカっぽすぎる。変換3->「えっ、あなたがシャイだって?」変換4->「シャイ?」これなら、何らかの反応を返せそうだ。「彼は間抜けだ」変換5->「彼は間抜けですか?」変換6->「彼が間抜けだって?」変換7->「彼は、どのように間抜けですか?」変換8->「彼は、どのくらい間抜けですか?」変換7,8 なんかは Eliza っぽい。How とか What とかいった要素を聞き返すようなことができれば面白い話しの展開になる。たとえば、「とても間抜けだ」のように「とても」が入ってきたときだけ、このような変換をするとかいったことが考えられる。あるいは、尋ね返すのではなく。同意文を返してやることもできるだろう。「私はシャイだ」変換10->「はいはい、シャイですね」変換11->「シャイね~」いや、これでは揶揄的な響きになってしまう。変換12→「そうですね。あなたはシャイかもしれないですね」応え方は面白い。「シャイ?」1単語で返してしまうのも単語によっては、以外によい返し方かもしれないし、変換12「確かに、彼は間抜けですね。でも、なぜなんでしょう」とちょっと長めに引っ張ったとしても、なかなか賢そうに見えるし、自分の話していることを聞いてくれるような感じがする。でも、あくまでセラピストという感じだ。そう、Eliza というのは、そんな感じで反応するパターンがあるので、賢くみえるのだ。ほんとに短いプログラムなのに。「私は~だと思う」という "I think" に対して、"do you thin" として、これだけでは単純すぎるから、"Why do you think" とかしてやったり、"tell me more" のように「聞いてるよ、でももう少し先を続けてみて」という感じの反応を織り交ぜていくという巧妙さが単純さの中に含まれている。それにしても、聞き上手というのは、どんな人なんだろう?聞き上手について考えてみることは、人工無能に人っぽさを持たせるために重要なことだ。相手がもっと話すようにしかけていくのだ。「私ってきれいよね」変換13->「あなたはきれいですよ」意外に、単純肯定ルールも単語によっては、いいのかもしれない。変換14->「あはたは、とてもきれいです」勝手に「とても」と一言入れてやるだけで、なんだかかわいく思えてきたりして。変換15->「きれいじゃないなんてことは、ありえないです」ひらがなばかりで読みにくいが、おべんちゃらの領域に達している。結局、相手の言葉を肯定したり、疑問文にしたりするバリエーションを多く作っていくだけで、それなりに会話として成り立つようだ。ただ、展開をどうするかというところが次に問題になってくるのだろう。つまり、受けただけで終わっているのだ。流れを見てみよう。1「私ってシャイなんだ」2「シャイね~」3(ここで人がなんて答える?)「うるさい!」「シャイだって」「バカ」・・・・。と意外に会話のどん詰まりに導いてしまうような返答というのもあるものだ。4「私ってきれいよね」5「きれいだよ」6「私ってかわいい」7「かわいいよ」8「私ってキュート?」9「とってもキュート」鸚鵡返しにするだけでは、さすがに興ざめだろう。これが、4「私ってきれいよね」5「空の星より、きれいだよ」(今どききかない会話だが)6「私ってかわいい」7「子豚ちゃんのようにかわいいよ」(バキ!)8「私ってキュート?」9「キュート、キューティー、ハニーフラッシュ」(まさに人工無能的)まあ、多少おもしろみもでてくるか。最近、CATVで「キューティーハニー」を見ることがあるが(新目のやつ。昔見たのとかなりイメージが違う)、「セーラームーン」とかと近い文脈になっているなと思った。セーラームーンではピュアな心の持ち主の銀水晶だったかなだかが、ありかが分からないため、次々いろんな人が狙われるけれど、キューティーハニーの場合は、それが最初から分かっていて、空中元素固定装置を持つキューティーハニーがパンサークロー狙われると。で、いざというときには変身して相手をやっつける。そうやって考えると、セーラームーンていうのはキューティーハニーのバリエーションなのかって感じがする。変身ものの元祖ってなんだろう。超人ハルクとかなのかな。ドラキュラ。ジギルとハイド。三年寝太郎とかも、一種の変身物なのかな。わらしべ長者。浦島太郎、鶴の恩返し。本題にもどり、Eliza を見るといいつつ見てなかったから、いい加減見なきゃ。
2003.01.18
コメント(0)
Knowledge Power Web が創刊された。メールマガジンの購読。こういうのを見たり、マイクロソフトの動きを見ていたりすると、以前は外部の業者がやっていたことを直接、企業が末端に対して無料で提供する/一種の洗脳を行う動きが強まっているように感じる。要するに製品が高度化すればするほど、それを理解してもらわなければならず、まったくの外部の人間では扱いきれなくなってきているということ。単に広告宣伝活動とだけは捉えられなくなってきているような感じがする。マイクロソフトのコンサルタントが徐々に顔を表に出し始めているような感じもするが、やはり、製品が高度化したためにそれを自らやらねばならなくなっている。IBM などもオンラインでビデオを流す(Webcast)など、アメリカではやっている。フリーなソフトが広まれば広まるほど、有料の製品を扱っているところは、自社の製品の有用性を明確にしなければならず、また、有料であることの一つの根拠として顧客への情報提供を行うという面もある。そうすると書籍なども、徐々にメーカがライターに対してオンラインコンテンツを依頼する機会も増えていくだろう。わざわざ出版社などを使う必要性がなくなってくるのだ。できるだけ多くの人を自社製品に対して目を向けさせるための広告/洗脳材料としてのコンテンツになっていくのだから。そして、出版社のように、その本が面白い/面白くない、売れる/売れないという次元ではなく、そのコンテンツを読んだ読者が製品を買ってくれる/くれない、既存の顧客を満足させられる/させられないという、ちょっと次元の異なったところに入っていく。似ているようでまったくことなる世界だと思う。そういえば、Python のメーリングリストに 形態素解析器 MeCab の win32 DLL に対して、Sam Rushing の calldllを使ってアクセスする Python module を公開との投稿があった。(win32mecab.py)。この Sam Rushing というのは、Zope の http サーバとして使われている Medusaを作った人だな。DynWin, a dynamic GUI class library for Python and Win32のページに Python 2.2.1 用の calldll があるな。AVL module とか、npstruct (バイナリデータのパージング)なども、なんか役に立つことがあるかな。時間ができたら試してみることにしよう。速度的にどうなんだろう。○肯定文と疑問文の変形コンセプト2 (Python で人工無能)昨日、アバウトに肯定文について書いてみた。日本語の場合、厳密にやろうとすると文を扱うのが英語より面倒だ。「今日は元気だ」「今日は元気だった」「明日も元気だろう」。短いものをちょっと見ただけだと、なんとかなるかなという感じもするが、「今日は元気なのだと思ったろうがそうではなくて元気じゃなかったと思うような気がしないでもないかなぁと思いましたか?」。後ろにヅラヅラといくらでもつなげてしまう。また、時制(現在、過去、未来・・・)をちゃんと扱おうとしても難しくなってしまう。ということで、どこで適当に切り分けてしまうかが肝心なのだろう。チャットの場合、そういう文を書く人も少ないだろうから、一番、後ろのところを見てそこだけで判断してしまうことにしよう。途中は基本的に吹っ飛ばしてしまうのだ。「今日は元気なのだと思ったろうがそうではなくて元気じゃなかったと思うような気がしないでもないかなぁと思いましたか?」の場合だったら、[思いましたか?」だけ扱うのだ。あとは、「と思う」、「と言う」などちょっと特殊な扱いができそうなものは別扱いとする。名詞や形容動詞語幹の場合は、まあ、適当にやってもなんとかなりそうな感じがするが、動詞の場合はどうだろう。まじめにやると面倒でしょうがない。動詞のラ行五段活用とか中学生のころを思い出す。未然・連用・終止・連体と。命令なんかは特別な反応を返すと面白いかもしれない。走った走った走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タEOS走ろう走ろ 動詞,自立,*,*,五段・ラ行,未然ウ接続,走る,ハシロ,ハシロう 助動詞,*,*,*,不変化型,基本形,う,ウ,ウEOS走ります走り 動詞,自立,*,*,五段・ラ行,連用形,走る,ハシリ,ハシリます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マスEOS走りますね走り 動詞,自立,*,*,五段・ラ行,連用形,走る,ハシリ,ハシリます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マスね 助詞,終助詞,*,*,*,*,ね,ネ,ネEOS走ったのですね走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タの 名詞,非自立,一般,*,*,*,の,ノ,ノです 助動詞,*,*,*,特殊・デス,基本形,です,デス,デスね 助詞,終助詞,*,*,*,*,ね,ネ,ネEOS走っちゃうの走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッちゃう 動詞,非自立,*,*,五段・ワ行促音便,基本形,ちゃう,チャウ,チャウの 名詞,非自立,一般,*,*,*,の,ノ,ノEOS走っちゃった走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッちゃっ 動詞,非自立,*,*,五段・ワ行促音便,連用タ接続,ちゃう,チャッ,チャッた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タEOS走っちゃうよ走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッちゃう 動詞,非自立,*,*,五段・ワ行促音便,基本形,ちゃう,チャウ,チャウよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨEOS走ってしまうよ走っ 動詞,自立,*,*,五段・ラ行,連用タ接続,走る,ハシッ,ハシッて 助詞,接続助詞,*,*,*,*,て,テ,テしまう 動詞,非自立,*,*,五段・ワ行促音便,基本形,しまう,シマウ,シマウよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨEOSEOS終助詞とかは、とりあえず、問答無用で削除。助動詞に囲まれた「の」も問答無用で削除。動詞の直後の「ちゃう」も削除。「ちゃう」「てしまう」の変換とかもすると賢く見えるかもしれないがこのあたりまずアバウトに進んでしまうことにしよう。ここらへんは、むしろ人工無能が文を生成するときにどうしようというところで考えた方がよさそう。おぼろげながらどうしたらよいか見えてきたような気がする。要するにいい加減にとりあえずやればいいのだ(笑)。
2003.01.16
コメント(0)
間違えて昨日の日記に上書きしてしまったので復旧(^^;;昨日の分が New になっているのは登録しなおしたから。『フランティック』(FRANTIC)を見た。ハリソン・フォード演じる大学教授が、空港で奥さんのスーツケースが他人のものと入れ替わってしまったことから事件に巻き込まれるという話で、まあ、軒並みな作品だった。ロマン・ポランスキー監督ということで、作りとしてはうまいんだろうけどストーリー自体があまりに陳腐という感じがした。○肯定文と疑問文の変形コンセプト1 (Python で人工無能)「私は元気です」と入力されたら、「あなたは元気です」と変換するところまではできた。じゃあ次にというと、これを念を押す形の「あなたは元気なのですね」とか、疑問形の「あなたは元気ですか?」にしたり、あるいは、「あなたは元気と言ったではないですか」と詰問調の文に変換できればいいなと思う。まず、いつものように MeCab を使ってみる。私は元気です。私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシは 助詞,係助詞,*,*,*,*,は,ハ,ワ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキです 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス。 記号,句点,*,*,*,*,。,。,。EOS名詞-形容動詞語幹 + 助動詞-*-特殊・デス/ダ + 記号-句点の形式であれば、とりあえず、「ですか?」としてしまってよいだろうか。ちょっとバリエーションを作ってみよう。元気だ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダEOS元気だよ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨEOS元気なのだ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナの 名詞,非自立,一般,*,*,*,の,ノ,ノだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダEOS元気だってば元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダって 助詞,格助詞,連語,*,*,*,って,ッテ,ッテば 助詞,接続助詞,*,*,*,*,ば,バ,バ元気だよーん元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダよー 助詞,終助詞,*,*,*,*,よー,ヨー,ヨーん 助動詞,*,*,*,不変化型,基本形,ん,ン,ンEOS元気だよん元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨん 助動詞,*,*,*,不変化型,基本形,ん,ン,ンEOS元気なのだよ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナの 名詞,非自立,一般,*,*,*,の,ノ,ノだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダよ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨEOSまず第1のルールとして、名詞,形容動詞語幹 + 助動詞-特殊・デス/ダ,基本形であれば、その後ろに続く助詞、助動詞は削除してしまうということにしてみよう。全部「元気」にしてしまうわけだ。ただし「なのだよ」のような場合、「の」という名詞-非自立,一般が直後に来た場合にはルールを適用しないという例外を設けておく。「の」は曲者なので後で別ルールでまとめて考えることにする。で、これで不都合が起こるか、ちょっと考えてみる。あまりに単純なルールでは不都合が起きるのは当然。だけども、仮定(思い込み)→否定事象の抽出を連続していくことによって世界観を正しいものに徐々にしていけばいいのだ。とにかく、こと分け/もの分けを徐々に進化させていくのは、幼児がだんたんと知識を分化させていくのと同じようなことなので人工無能としては、徐々に賢くなっていく方法を試行錯誤的に追及していくわけだ。人間の思考も最初に直感があって、否定事象が一定の量に達するまでは、その直感を合理化しようとする。合理化ができなくなると、その直感を廃棄せざるを得なくなり、新たな直感により新たな基本ルールを作る。ところが、そのルールを破棄しようとすること自体が他の重要かつ根本的な価値観自体の体系に関わる場合は、そこに固着が起きたり、反動が生まれる。精神の病などもそうしたものに結びつきがあるのだろう。で、能書きは横に置いておき、元気だろうか元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだろ 助動詞,*,*,*,特殊・ダ,未然形,だ,ダロ,ダロう 助動詞,*,*,*,不変化型,基本形,う,ウ,ウか 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カEOS元気ですか元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキです 助動詞,*,*,*,特殊・デス,基本形,です,デス,デスか 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カEOS元気ではない。元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキで 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デは 助詞,係助詞,*,*,*,*,は,ハ,ワない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ。 記号,句点,*,*,*,*,。,。,。EOS元気じゃない元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキじゃ 助詞,副助詞,*,*,*,*,じゃ,ジャ,ジャない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイEOS名詞,形容動詞語幹 + 助動詞-特殊・デス/ダ,基本形であれば、その後ろに続く助詞、助動詞は削除してしまうことにすると、まずいことが起きるのがわかる。「元気ですか」の場合「か」という助詞-副助詞/並立助詞/終助詞が付いているが、このような場合は、ルールを適用しない必要がある。それ以外の場合は、どうやら大丈夫そうだということにしておこう。で、とりあえずどういうことかというと、ルール:名詞,形容動詞語幹 + 助動詞-特殊・デス/ダ,基本形であれば、その後ろに続く助詞、助動詞は削除してしまう そして 肯定形として扱う。例外1:名詞「の」が接続した場合は、処理しない。例外2:助詞「か」が接続した場合は、処理しない。形容動詞語幹ではなく、名詞だったらどうだろう。まあ、同じような感じで扱っていいだろう。詩人だ詩人 名詞,一般,*,*,*,*,詩人,シジン,シジンだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダEOS詩人ではない詩人 名詞,一般,*,*,*,*,詩人,シジン,シジンで 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デは 助詞,係助詞,*,*,*,*,は,ハ,ワない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイEOS俳人か俳人 名詞,一般,*,*,*,*,俳人,ハイジン,ハイジンか 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カEOS廃人だ廃人 名詞,一般,*,*,*,*,廃人,ハイジン,ハイジンだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダEOS廃人なのか廃人 名詞,一般,*,*,*,*,廃人,ハイジン,ハイジンな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナの 名詞,非自立,一般,*,*,*,の,ノ,ノか 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カEOS廃人なのだ廃人 名詞,一般,*,*,*,*,廃人,ハイジン,ハイジンな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナの 名詞,非自立,一般,*,*,*,の,ノ,ノだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダEOS廃人だった廃人 名詞,一般,*,*,*,*,廃人,ハイジン,ハイジンだっ 助動詞,*,*,*,特殊・ダ,連用タ接続,だ,ダッ,ダッた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タEOS長くなってきたので、とりあえずここまで。ちなみに、次のは解析結果がちょっとなんだな。とりあえず、無視。元気じゃん元 接頭詞,名詞接続,*,*,*,*,元,モト,モト気 名詞,一般,*,*,*,*,気,キ,キじゃん 助動詞,*,*,*,不変化型,基本形,じゃん,ジャン,ジャンEOS元気ですの元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキで 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デす 形容詞,自立,*,*,形容詞・アウオ段,ガル接続,すい,ス,スの 助詞,連体化,*,*,*,*,の,ノ,ノEOS
2003.01.15
コメント(0)
○あなたと私を入れ替える (Python で人工無能)昨日の日記で、人称の書き換え用のリストを作って、それにしたがって書き換えをしようかという話を書いた。例によって IDLE を起動したら、プロンプトで人称用のディクショナリを作ってやる。そうすると、「私」の同義語は、hitodic[’私’] で取れるし、「あなた」の同義語も取れる。 >>> hitodic = { ’私’:[’わたし’,’私’,’わたくし’,’あたし’,’アタシ’,’僕’,’我’,’俺’,’僕’,’あたし’,’アタシ’,’あたい’,’手前’,’朕’,’わらわ’,’オイラ’,’ワテ’,’ワシ’], ’あなた’:[’お前’, ’君’, ’あんた’, ’そち’, ]}>>> print hitodic[’私’][’わたし’, ’私’, ’わたくし’, ’あたし’, ’アタシ’, ’僕’, ’我’, ’俺’, ’僕’, ’あたし’, ’アタシ’, ’あたい’, ’手前’, ’朕’] >>> print hitodic[’あなた’][’お前’, ’君’, ’あんた’, ’そち’, ’わらわ’, ’オイラ’, ’ワテ’, ’ワシ’]そうしたら、で、次に、ロボット的鸚鵡返しの術 (Python で人工無能) で6日に作ったファイルを IDLE の [File]-[Open] で開いてみる。これを元に改造していくことにするのだ。で、開いたらすぐに、[File]-[Save As] で別のファイル名にして保存しておこう。前のは前ので残しておくのだ。ファイルを読み込んだら、上の hitodic = (以下省略) の1行を >>> をつけずに(プロンプトだから)、ファイルの先頭の方に追加する。そうしたら、もう一度ファイルを保存してから、[Edit]-[Run script] か コントロールキー + F5 キーを押して実行させてみる。そうしたら、リターンを空うちして、バイバイしてしまう。これでプロンプトに戻る。次に 「私」や「あなた」を書き換えるための関数を用意してみる。やっぱり、今回も対話的に試しながらやってみる。>>> klist = keitaiso_kaiseki("私は元気です。")>>> klist[{’品詞細分類1’: ’代名詞’, ’原形’: ’私’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’一般’, ’表層形’: ’私’, ’読み’: ’ワタシ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’ワタシ’, ’活用形’: ’*’}, {’品詞細分類1’: ’係助詞’, ’原形’: ’は’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’は’, ’読み’: ’ハ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’ワ’, ’活用形’: ’*’}, {’品詞細分類1’: ’形容動詞語幹’, ’原形’: ’元気’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’元気’, ’読み’: ’ゲンキ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’ゲンキ’, ’活用形’: ’*’}, {’品詞細分類1’: ’*’, ’原形’: ’です’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’です’, ’読み’: ’デス’, ’活用型’: ’基本形’, ’品詞’: ’助動詞’, ’発音’: ’デス’, ’活用形’: ’特殊・デス’}, {’品詞細分類1’: ’句点’, ’原形’: ’。’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’。’, ’読み’: ’。’, ’活用型’: ’*’, ’品詞’: ’記号’, ’発音’: ’。’, ’活用形’: ’*’}]# ちゃんと、そのうち読みやすく、結果を出せるようにしよう(^^;;で、書き換えのマッチングをするのにどれを使うとよいかを考えてみる。表層形、品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用形、活用型、原形、読み、発音がとりあえず使えるわけだが、ここでは「原形」を使うことにしよう。あー、それにしても、「ワタシは元気だ。」を解析すると次のようになってしまう・・・。やっぱり、このあたり学術研究用の辞書の弱さだな。そのうち辞書への登録も扱うことにしよう。「ワタ」「シ」「は」「元気」「だ」と。「ワタシ」が辞書にないのね。で、考えてみると人工無能の場合、学術的正しさは必要ないので、そのうちカタカナの後ろに未知語のカタカナが来ていたら安易につないでしまう処理をどこかに入れるかな。まあ、このあたりは、もっと癖をつかんでからやることにする。ワタシは元気だ。ワタ 名詞,一般,*,*,*,*,ワタ,ワタ,ワタシ m語,*,*,*,*,*,*,*,*は 助詞,係助詞,*,*,*,*,は,ハ,ワ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOSそうしたら、>>>for k in klist: print k[’原形’]私は元気です。と、原形が取り出せることを復習する(ちなみに、ワタシでやると、* が出てきてしまうのだ。未知語の場合 * になるのだな。原形を使って文字を書き換えるときに使うとハマるということか。まあいい)。で、このループの中で書き換えをやってやればいいのだが、人称書き換えようのディクショナリは標準形がキーになっていて、いろいろなパターンの「俺」などが値として入っているので、ほんとは処理上都合が悪くて、{{’俺’:’私’, ’僕’:’私’ ...}} と冗長な構成になっていた方が、一発でディクショナリから「俺」に対応する標準形の「私」をとってこられて便利なのだな。「私」でリストを取って、その中から書き換え対象のものをとってくるようなやり方をすると、ループの中でさらにループをまわすようなことをしなければならなくなる。うーん、めんどくさいので場当たり的なことをしよう。で、テンポラリにディクショナリを作って、>>> tempdic = {} # 空の辞書を作る>>> for k in hitodic: # 辞書の「私」と「あなた」のそれぞれから values = hitodic[k] # 値を取り出して(俺、僕...) for v in values: tempdic[v] = k # 値をキーにして、キーを値にする>>> tempdic{’ワシ’: ’私’, ’お前’: ’あなた’, ’そち’: ’あなた’, ’あんた’: ’あなた’, ’わたくし’: ’私’, ’朕’: ’私’, ’あたい’: ’私’, ’私’: ’私’, ’俺’: ’私’, ’手前’: ’私’, ’君’: ’あなた’, ’ワテ’: ’私’, ’わらわ’: ’私’, ’わたし’: ’私’, ’オイラ’: ’私’, ’アタシ’: ’私’, ’あたし’: ’私’, ’我’: ’私’, ’僕’: ’私’}これで、{{’俺’:’私’, ’僕’:’私’ ...}} の形式に書き換えられたので、tempdic[’俺’] から標準形の「私」がループをまわさなくても取れるようになった。そうしたら、>>> hitodic = tempdicとして、hitodic に上書きしてしまい、hitodic でアクセスできるようにしておくことにする。しかし、まあ泥縄式と化しているな(^^;; あとで捨てるところなので、とりあえず動けばいいや。>>>hitodic[’あんた’]’あなた’となる。うーん、どうせなら、「俺」と入れたら「あなた」が返ってくるようにしてしまうかと思ったがやめておく。で、やりたかったのは、「私は元気だ」と入れたら、「あなたは元気だ」としたかったのだな。で、とりあえず、こんな風にしてみよう。上で、形態素解析の原形を取り出して表示したときに使ったものをちょっと変えてみる。表示する前に書き換えてしまえばいいので、まずはアバウトに、形態素の各要素のうち原形を取り出して、それをキーにして人称用辞書(hitodic) から対応する標準形を引っ張り出す。そして、もしそれが「私」であれば「あなた」に表層形を書き換えて、「私」であれば「あなたに」表記を書き換えてしまう。for k in klist: # 原形を取り出す genkei = k[’原形’] # 人称辞書から原形をキーにして標準形を取り出す hyoujun = hitodic[genkei] # 標準形が 「私」なら「あなた」に、 #「あなた」なら「私」に置き換える。 if hyoujun == ’私’: k[’表層形’] = ’あなた’ elif hyoujun == ’あなた’: k[’表層形’] = ’私’が、まあ、これはエラーになってしまう。当然のことなのだ。つまり、「私」と「あなた」以外には、標準形を取り出すことができないので、それ以外のものについては、hitodic を引いたときに失敗してしまうのだ。Traceback (most recent call last): File "", line 5, in ? hyoujun = hitodic[genkei]KeyError: は>>> KeyError: はというところに注目なのだ。ちゃんとエラーがでたときには、5行目で(line 5) 「は」はキーエラーですよと教えてくれている。そこで、こうしてみればよく分かるだろう。>>> hitodic[’は’]Traceback (most recent call last): File "", line 1, in ? hitodic[’は’]KeyError: は登録してあるものしか、取り出せないなんて不便とえいば不便なのだ。しょうがないので、まず、ディクショナリを引いてみて、失敗したらやめておこうといういい加減な方法をとってみよう。>>> for k in klist: # 原形を取り出す genkei = k[’原形’] # 人称辞書から原形をキーにして標準形を取り出す # 試してだめならからの"" を入れてやる try: hyoujun = hitodic[genkei] except: # エラーで標準形がとれなかったので空にする hyoujun = ’’ # 標準形が 「私」なら「あなた」に、 #「あなた」なら「私」に置き換える。 if hyoujun == ’私’: k[’表層形’] = ’あなた’ elif hyoujun == ’あたな’: k[’表層形’] = ’私’>>> for k in klist: print k[’表層形’]あなたは元気です。これでめでたく、「私は元気だ。」を「あなたは元気だ。」に書き換えることができた。同じようにすれば「お前は元気だ。」と入れれば、「私は元気だ。」となる。今日はここまで。ちなみに途中で色をつけるのが面倒になってしまったので途中から色がない(^^;; 色をつけるためのスクリプトでも作んないとだめかな・・・。今回もやっぱり、カットアンドペーストじゃ動かせなくて、全角と半角を直さないと動かんし。この辺は、そのうちなんとかしよう。インデントがおかしくなってしまったりするのが一番痛いのだな。python ではインデントが意味を持つから、これが狂うとエラーになっちゃうのだ。グスン。全角半角をちゃんと直して、そのまま動かなかったら、インデントが狂っているせいなので、それを直してください。そんな…
2003.01.13
コメント(0)
扇風機みたいに首を振るやつへんなハロゲンヒーターを通販で買った。エアコンよりすぐにあったまるのがいい。マイナスイオンが出るとかいうが、出ても出てなくても分からん。そういう怪しいものが時々欲しくなるので困る(^^;;tripod に 傀儡師研究室 を作ってみた。プログラムはここでやると面倒なのでまとまったものは研究室の方においてダウロードできるようにしようかなと思って。ただし、中身はまだない。こちらがメインなので(ポップアップ広告がうざいから)、たぶんあっちらに何か置いたらここに書き込むので今のところ見る必要なし。あっちの日記は、何かものをおいたときだけ書き込む。○ 人称書き換えの準備 (Python で人工無能)あなたとわたしから始めると(2003/01/08 の日記) で、あなたとわたしの書き換えをやってみようということを書いた。でちょっとまたソースを書く前に、簡単な擬似コード(実際には動かないが、プログラムの概念を自然言語なので擬似的に書いたもの)で表すと、次のようになる。for 一つの形態素解析情報 in 形態素解析結果のリスト: if 形態素解析情報[’原形’] == ’私’: 「私」を「あなた」に書き換える elif 形態素解析情報[’原形’] == ’あなた’: 「あなた」を「私」に書き換える else: なにもしないという感じになるだろう。もっとも数が増えてくるとうざったいことになるのだが、当面はこういう方式にしておく。で、問題になるのが、「私」や「あなた」の表現が複数存在することだ。私、わたし、我、俺、僕、あたし、アタシ、あたい、手前、朕など、貴方、あなた、お前、テメエ、あ・な・た、などをあげたが、他にも、お前、君、あんた、そち、貴官、わらわ、オイラ、僕ちゃん、ワテ、ワシ・・・、あげればキリがない。ようするに、1つの対象に収束する単語であっても、複数の言い方が生じるわけで、類義語(シソーラス、thesaurus)の情報をもたせなければならないということだ。また「わたし」「あなた」の関係は中立的だけれども、あなたとわたしの関係自体、あるいは自らの存在の出自が「私」あるいは「あなた」の表現によって語られることになる。なんか、そういうものをまとめて辞書からとってこられるといいのだが・・・。MeCab の解析結果をちょっと見てみよう。お前は誰だ。お前 名詞,代名詞,一般,*,*,*,お前,オマエ,オマエは 助詞,係助詞,*,*,*,*,は,ハ,ワ誰 名詞,代名詞,一般,*,*,*,誰,ダレ,ダレだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOS私は誰だ。私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシは 助詞,係助詞,*,*,*,*,は,ハ,ワ誰 名詞,代名詞,一般,*,*,*,誰,ダレ,ダレだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOSあたしは誰。あたし 名詞,普通名詞,*,*,あたし,あたしは 助詞,副助詞,*,*,は,は誰 名詞,普通名詞,*,*,誰,た。 特殊,句点,*,*,。,。EOS一応、名詞-代名詞という枠組みがあるものの、人称代名詞という分類もないし、ましてや、一人称、二人称なんて分類もあるはずがない。しょうがないので、やっぱりこれは、シソーラス辞書として持たせる必要があるな。それにしても「私」は名詞-代名詞で、「あたし」は名詞-普通名詞であるところがなんともいえないなぁ。「は」も助詞-係助詞が、助詞-副助詞になったりしてるな。あ、そっか、「だ」が最後にないからか。あたしは誰だ。あたし 名詞,代名詞,一般,*,*,*,あたし,アタシ,アタシは 助詞,係助詞,*,*,*,*,は,ハ,ワ誰 名詞,代名詞,一般,*,*,*,誰,ダレ,ダレだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOSふーむ。けっこう微妙なのだな。ちなみに、JUMAN 辞書を使ったら、「私」の読みが「あたい」になっているな(^^;;。「誰」も普通名詞になっていて、やはりこのあたりも違うのだな。「だ」も助動詞ととるか、判定詞ととるかで違っている。ん、JUMAN辞書で「アタシは誰」とやったら、文字化けしてしまったな。未知語が化けてるのかな。dicrc も shift_jis にしてみたらなぜか化けなくなった。「`語」とかなるけど。まあいいや。私は誰だ。私 名詞,普通名詞,*,*,私,あたいは 助詞,副助詞,*,*,は,は誰 名詞,普通名詞,*,*,誰,ただ 判定詞,*,判定詞,基本形,だ, だ。 特殊,句点,*,*,。,。EOSで、本当は言い換えのときにトーン(調子)をとっておくといいのだが(たとえば、あんた、であればくだけた表現とかなんとか)、まあ、そういうものは吹っ飛ばしてしまって標準形とその他という形で括った人称表現辞書を {見出し:[表現のリスト]} のように作っておこう。hitodic = {’私’:[’わたし’,’私’,’わたくし’,’あたし’,’アタシ’,’僕’,’我’、’俺’、’僕’、’あたし’、’アタシ’、’あたい’、’手前’、’朕’], ’あなた’:[’お前’, ’君’, ’あんた’, ’そち’, ’わらわ’, ’オイラ’, ’ワテ’,’ワシ’]}ただし、「僕ちゃん」みたいのは「僕」+「ちゃん」で解析されてしまう(というか、これはそれでしょうがないが)、妾(わらわ)なんかは、普通名詞で解析されるから、ちょっと本来同じ枠組みでできないのだが、まあ、とりあえず、このあたりはおいおいやっていけばいいか。とにかく、’私’の辞書のリストにある単語がきたら、それは「私」なので、人工無能の中に入るとそれが「あなた」に置き換わる。「あなた」は人口無能自体のことを指すので、出力されるときには「私」に置き換わる。まあ、それだけでも最悪いいだろう。英語だと I と You の置き換えだけだから楽なのだけど (変化形はあるものの)、日本語はよけいなところで苦労するな。で、とにかく、次はこのリストを使って人称の変換をする。
2003.01.12
コメント(0)
たまたま目に付いたのだが、日本語プログラミングとして最近、日本語プログラム言語「ひまわり」 や TTS (Technology Terminal Script)なんていうのがある。日本語プログラミングというと Forth 系の Mind が懐かしいところだが (ってまだ存在するのね。失礼しました。Scripts Lab. が今扱っている)。Mind-Clubもある。既存の日本語プログラム言語へのリンクを見ると他にもいくつかあるようだ。日本語指向のプログラミング (JV-Talk)なんてものもあるわけか。Java で作られているらしい。それから、日本語プログラミング言語「言霊」というのもあるのか。で、Mind のページに戻ると MindSearchなんていうピンポイント検索コンポーネントも売っている。『昨年の12月から今年の2月まで』とかいった指定や、「国名」を指示したら「日本」「アメリカ」「フランス」が抽出できるとか、けっこう優れものね。言語工学研究所シソーラス辞書対応インターフェースもあるし。文を基準として検索するとかも面白い。「○○と△△を10語以内に含む」とか「○○と△△を3文以内に含む」とかいった検索もできる。「重さ」で検索すれば、「1トン」「20g」「1匁」がヒットするとか。これ、ほんとうはうまくやると、けっこう面白いんだろうな。どうせ買うことはできないけど、評価版があるのでダウンロードしてみる。あと、検索一番ベストヒットのリンクが切れてる。ダメじゃん。検索一番ベストヒットWeb&Docだな。単品 各5,800円(税別)、Web&Doc 9,800円(税別)か。まあ、このくらいなら買えるな(笑)。体験版をダウンロードしようとしたらリンク切れ。ダメじゃん。InfoCompactorというのがあるな。InfoCompactor 3本pack(yahoo, goo, infoseek対応) 6,800円。バラだと3000円。これも評価版があるな。だいたい感覚的に、この手のものは 1万円以下 という感じ。他にも、 Mind で検索してみると、Mind で 人工無能 愛美君というのが開発されていたのだな。最初は Mind で作って、TRON で今動いているとか。マスタースレイブ方式の遠隔操作で動く、アンドロイド・ユニット『真弓ちゃん』などもあるな(爆笑)。http://hal.yoko.ne.jp/h_gam001.htmlMind だと次のように簡単にプログラムができてしまうところは確かにメリットだな。 "03-1111-2222"に 接続し "C:\DATA\TEST.TXT"を ファイル送信するちょっと Mind がいじりたくなる。PureMindPRO5.21 コンパイラセットという DOS版がある。範子(Hanko)さんのMind講座を見れば勉強できるか。Mind Version 7 for UNIXは GPL で配布されている。Mind がけっきょく普及しないで、「ひまわり」だとか 「TTS」だとかの方が今受けているように見えるのは、GUI 関連のところなのかな。Mind だと Tcl/Tk の世界だから。ひまわりや TTS は日本語版の HSP という感じだろうか。ひまわり vs TTS に比較がある。手順は あみだくじを作成する 線の数を設定する ウィンドウを設定する 移動距離を設定する あみだくじを描く終わり手順は あみだくじを印刷する 返事=質問(「印刷しますか?」,はいといいえ) もし 返事=はい なら ウィンドウを印刷終わりTTS Fan! より引用また、ポップアップ広告などみると、便利じゃないかって思える。じゃあ、この手の日本語プログラミング的なやり方を応用すると、自然言語処理のマクロ処理を日本語で書くなんていうのも考えられるか。形態素解析結果を参照し、 主語が「わたし」であれば、「あなた」に置換する。 主語が「あなた」であれば、「わたし」に置換する。 主語が「父」であれば、「ファザコン」変数を1増やす。 主語が「母」であれば、「マザコン」変数を1増やす。 (// 省略 //)「ファザコン」変数が3以上であれば、 ファザコン変換処理を行う「マザコン」変数が2以上であれば、 マザコン変換処理を行う (// 省略 //)文に、(挨拶)が含まれる場合、各変数を参照し、 丁寧な挨拶を生成する処理を行うか、 ラフな挨拶を生成する処理を行うか、 普通の挨拶を生成する処理を行う。文に、(罵倒)が含まれる場合、キャラクター変数を参照し、 「怒りっぽい」場合は、怒りの表現処理を行い、 「謙虚である」場合は、回避の表現処理を行い、 「淫乱である」場合は、色仕掛けの表現処理を行う。以上の変換を行った後、 変換結果を出力する。とかいいつつも、結局、下手に日本語でやろうとすると、よけいなところで労力を割かなければいけなそうだし。基本的には通常のプログラミングを行う方がはるかに効率がよさそうなだ。まあ、それは最初から分かっていても、日本語プログラミングっていうのは魅力は感じるときがあるのだ。
2003.01.11
コメント(0)
全文検索エンジン Namazu で有名な 高林哲氏のサイトをちょっと眺めたらおもしろい文章がたくさんあった。作品をよく見せるためのお手軽なテクニック集 とか、いやな法則 とか、ふつうの人(コンピュータを専門に扱っていない人)も読める。やっぱ優秀な人は違う。で、Namazu はどうでもいいのだが(なんだそれは)、電子辞書オープンラボ に興味を持った。人工無能用の会話のネタをどこから取ってくるかというところを考えてみたときに、大きくは3つ考えられる。1) 検索エンジンを使うこと2) RSS (RDF Rich Site Summary) を使うこと3) 電子辞書を使うこともちろん、ユーザ入力を使うことも考えられるが、ウェブサイト上に無能がおいてあるならまだしも、個人のデスクトップ上では困るのだ。自分で入力したものが出てくるだけではつまらない。それこそ、ディスクの中にあるドキュメントを Namazu でインデックスしておいて検索というのもあるかもしれないが、それでも、まだつまらない。ということで、やはり外からも情報が欲しくなる。RSS を使った場合、それを再保存して利用すると、それはそれで問題かもしれないし、検索エンジンは Google などは Google API を使わなくてはならないし(Google API はデベロッパー登録すれば使えるが1日1000回とかの検索に限られるし、いつ有料になるかもわからない)、その他の検索エンジンにしても、まあ、どこまでどうかというのは明確ではない。で、電子辞書であれば、購入したものであれば、そこを検索したものを自分で見たってなんら問題はないだろうし、フリーの辞書を使えばなお問題がない。ということで、電子辞書をなんらかのリソースにすることにしようと思う。抽出してどうこうすると問題だろうが、毎回検索する分には問題ないだろうし。うーん、どの辞書が使いやすいかなー。もちろん昨日の何か関連のスクリプト通信プロトコル(SSTP)を使って Iruku(FastSTTP) のような仕組みで外部と何かやりとりすることも可能なんだろうが、いかんせんマニアックな感じなのでとりあえず避けておく(といっている自分がある意味マニアックな世界に入っているんだけど方向性が違うの)。そういえばペルソナウェアの本体自体は無料になったのね。有料のキャラクターもあるみたいだけど。なるほど、有料キャラクターで稼ぐ方向になったのか。なんだかんだでペルソナウェアを使う人は有料のキャラクターを買うんだろうか。ベースは無料にして、さすがに偽春菜->何か->伺かの人たちが勢力を伸ばしていったから、こうなったのかな。まあ、この手のものは正直感覚がよく分からない(^^;;そういえば、Eliza に近づけることにしたんだった。Eliza のソース見直さなきゃ。
2003.01.10
コメント(0)
デスクトップマスコットの類も面白いものがある(趣味的にはちょっと違うんだけど・・・)。この分野では ペルソナウェア が有名だけれど、ある意味もっと有名なのが それ以外の何か。「伺か(うかがか)」あたりなのだろう。さくらナビとかでも情報があるようだが、はっきりいってよく分からないが、まあいい。何かで何ができるかとかを見てみるのだ。この周辺にはいろいろありそうだ。とりあえず DeskTop Mascot の贈り物のAIc-MAE 『真絵』が面白そう。「真絵」(AIc-MAE)の解説を見ると、IPA 品詞体系(THiMCO97) 形式で辞書(シソーラス)を持たせているようだ。JUMANや茶筌を使っているわけではないな。ソースが公開されていないのでよく分からないが基本的に高度な文字列置換といった感じだろうか。テンプレート(コーパス)の中から答えの文が選ばれて、そこに埋め込みするときに適切な品詞の単語が埋め込まれるようにしているという感じか(名詞のスロットには名詞が入るとか、動詞のスロットには動詞が入るとか)。(ちなみに最新版はリンクが切れていた)。○ JUMAN 辞書を使ってみる (Python で人工無能)MeCab で IPA の辞書だけでなく、JUMAN の辞書が使えるようになったということで試してみる。mkmecabdic で辞書を MeCab 用に作ると、さすがに時間がかかった。まあ、ほっとけばいいので感謝して使ってみることにする。ん、形態素解析の結果が文字化けしてしまっている。しまった。csv ファイルを SJIS に変換してからやてみる。今度はいいようだ。で、ちょっと試してみる。JUMANの辞書を使った解析結果 今日は元気だ。 今日は 感動詞,*,*,*,今日は,こんちは 元気だ 形容詞,*,ナ形容詞,基本形,元気だ,げんきだ 。 特殊,句点,*,*,。,。 EOS 私は元気だ。 私 名詞,普通名詞,*,*,私,あたい は 助詞,副助詞,*,*,は,は 元気だ 形容詞,*,ナ形容詞,基本形,元気だ,げんきだ 。 特殊,句点,*,*,。,。 EOS 彼はのんきだ。 彼 名詞,普通名詞,*,*,彼,あれ は 助詞,副助詞,*,*,は,は のんきだ 形容詞,*,ナ形容詞,基本形,のんきだ,のんきだ 。 特殊,句点,*,*,。,。 EOS JUMAN の辞書だと、「きょうは」のつもりで「今日は」としていても「こんにちは」になってしまうのが困る (JUMAN 本体で実行しても同じ)。あと、「元気だ」が形容詞なのもちょっといやだ。解析結果の品詞について納得いくかどうかは別にして、単純置換型の人工無能だと、JUMAN の方がやりやすい感じはする。「元気だ」「のんきだ」のレベルで挿げ替えが単純にできるから。ただし、自分で語尾を変形をしようとすると、ちょっとめんどくさいか。「のんきだ」を「彼ってのんきじゃん」としようと思えば、「のんきだ」を一回分解しないとならない。トータルコストで MeCab のデフォルト辞書(IPA の辞書)を使っている方が楽かな。Mecab 標準の辞書を使った場合 今日は元気だ。 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 。 記号,句点,*,*,*,*,。,。,。 EOS 私は元気だ。 私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 。 記号,句点,*,*,*,*,。,。,。 EOS 彼はのんきだ。 彼 名詞,代名詞,一般,*,*,*,彼,カレ,カレ は 助詞,係助詞,*,*,*,*,は,ハ,ワ のんき 名詞,形容動詞語幹,*,*,*,*,のんき,ノンキ,ノンキ だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 。 記号,句点,*,*,*,*,。,。,。 EOSMeCab の標準だと「元気」が形容動詞語幹になってくれているから、後ろにくる助動詞を変えるだけですむし、気分的に形容動詞になっている方がうれしい。やっぱり、(のんきだ(のんき、だ))と多階層になっていた方がうれしいかもしれない。うーん、JUMAN の辞書と IPA 辞書を使ったものとで、とりあえず多階層化してしまうという手もあるか。単に置き換えをするときと、変形をともなうような場合で使い分けてやるとか。まあ、形態素解析を2回かければコストはかかるけれど、そういうコストならどうでもいい。どっちにしろ、複数回形態素解析にかける予定だし(何をする(笑))。口語はどうなんだろう。JUMAN 辞書を使った場合 彼は元気じゃん。 彼 名詞,普通名詞,*,*,彼,あれ は 助詞,副助詞,*,*,は,は 元気じゃ 形容詞,*,ナ形容詞,ダ列タ系連用ジャ形,元気だ,げんきじゃ ん 助動詞,*,助動詞ぬ型,音便基本形,ぬ,ん 。 特殊,句点,*,*,。,。 EOSMeCab 標準の辞書を使った場合 彼は元気じゃん。 彼 名詞,代名詞,一般,*,*,*,彼,カレ,カレ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 元 接頭詞,名詞接続,*,*,*,*,元,モト,モト 気 名詞,一般,*,*,*,*,気,キ,キ じゃん 助動詞,*,*,*,不変化型,基本形,じゃん,ジャン,ジャン 。 記号,句点,*,*,*,*,。,。,。 EOSMeCab 標準の IPA 辞書の方がへんな結果を出す場合もあるのだな。まあ、こういうのは特性としてとらえて、少しサンプルをいろいろ通して癖をつかまないといけないな。 JUMAN 彼の頭をたたいちゃった。 彼 名詞,普通名詞,*,*,彼,あれ の 助詞,接続助詞,*,*,の,の 頭 名詞,普通名詞,*,*,頭,あたま を 助詞,格助詞,*,*,を,を たたいちゃ 動詞,*,子音動詞カ行,タ系連用チャ形,たたく,たたいちゃ った 接尾辞,動詞性接尾辞,子音動詞ワ行,タ形,う,った 。 特殊,句点,*,*,。,。 EOS IPA 彼の頭をたたいちゃった。 彼 名詞,代名詞,一般,*,*,*,彼,カレ,カレ の 助詞,連体化,*,*,*,*,の,ノ,ノ 頭 名詞,一般,*,*,*,*,頭,アタマ,アタマ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ たたい 動詞,自立,*,*,五段・カ行イ音便,連用タ接続,たたく,タタイ,タタイ ちゃっ 動詞,非自立,*,*,五段・ワ行促音便,連用タ接続,ちゃう,チャッ,チャッ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 。 記号,句点,*,*,*,*,。,。,。 EOSふーむ。やっぱり微妙に違うのだな。「彼の頭をたたいちゃったのですか」「彼の頭をたたいちゃっていいなー」だったら、どちらでもいいけど、「彼の頭をたたいたのですか」に言い換えようとすると、やっぱり IPA 辞書の方がやりやすい。文の生成をきちんとしたければ、はやり IPA 辞書の方が有利になってくるようだ。あとは、次のような変換ルールも作らんといけないのは、どちらの辞書を使っても同じだな。数字の表現は、いったん漢数字にしておかないと読みがちゃんと取れないから。1995年。1 名詞,数,*,*,*,*,1,イチ,イチ9 名詞,数,*,*,*,*,9,キュウ,キュー9 名詞,数,*,*,*,*,9,キュウ,キュー5 名詞,数,*,*,*,*,5,ゴ,ゴ年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン。 記号,句点,*,*,*,*,。,。,。EOS千九百九十五年。千 名詞,数,*,*,*,*,千,セン,セン九 名詞,数,*,*,*,*,九,キュウ,キュー百 名詞,数,*,*,*,*,百,ヒャク,ヒャク九 名詞,数,*,*,*,*,九,キュウ,キュー十 名詞,数,*,*,*,*,十,ジュウ,ジュー五 名詞,数,*,*,*,*,五,ゴ,ゴ年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン。 記号,句点,*,*,*,*,。,。,。EOSレベルをいくつか切って言い換え表現をするようにすればいいか。まあ、考えていてもしょうがないので、まず Eliza のレベルに近づけることしよう。
2003.01.09
コメント(0)
あなたとわたしから始めると (Python で人工無能)人工無能は対話型のアプリケーションだ。対話の中心は二者。「わたし」と「あなた」。わたしを人工無能とすると、あなたは人工無能を使う人。わたしは、すべての入力をわたしの情報とする。そして何らかのリアクションを返す。リアクションに対して、さらにあなたがリアクションをとれば、それが新たな情報となって次のわたしのリアクションにつながる。Eliza なんかの場合だと、英語を対象としているから主語が明確。あなたが何か自分の思っていることを入力するときは、I で始まるし、人工無能に対して語りかけたければ You ではじまる。主語のあとには、動詞または助動詞が来るし(まあ副詞が来ることもあるとかもおいておく)。比較的英語の場合は構文が明確にとりやすい。第三者に対する言及か対話者間の言及かを区別しやすいわけだ。肯定文を疑問文に書き換えるのも楽にできるし。日本語の場合は、主語が省略されることが多い。「今日は元気だ。」なんて、主語の「私は」が隠れてしまっているものね。チャットの場合は特に省略が多くなる。「あなたは今日は元気なのですね」とあなたを補ってやりたくなるところだ。ただ、冷静に考えると、英語で、"The sky is blue." 「空が青い(空は青い)」がどの程度客観性があるかというと、また、疑問がある。I see the sky is blue. なのか、I think the sky is blue. なのか、I believe the sky is blue. なのか・・・。You say you believe the sky is blue. 青いといったり灰色といったりするなら、確信度が変わってきて発言が変わっていくとか。やっぱり過去の発言は保存しておいて何らかの形で使いたい。人工無能は、ある意味知識表現をすべて中心人格の「エゴ」に還元してしまうようなものだと面白い。まあ、これは長くなるのでおいといて。「わたし」の表現として、私、わたし、我、俺、僕、あたし、アタシ、あたい、手前、朕、・・・、そして人工無能の名前。あなたの表現として、貴方、あなた、お前、テメエ、あ・な・た・・・。まあ、いろんな表現が考えられるわけだが、それぞれトーンが違っている。主語を補完しつつ、トーンを微妙に変えていくことができると面白いだろう。でも「猫は病気だ」の場合は、どうだろう。「あたなたは、猫が病気だと思っているのですね」と返したら、おもしろいかもしれない。このあたりどうするかなー。とりあえず、人称表現については一通りリストに持っておいて、これに加えて、Eliza のように家族の表現も用意して(父、母など)、それ以外はとりあえず知らんということにしよう。Eliza はコンピュータって言葉が嫌いだけど、これは軟化茶化したことを考えたい。あ、そういえば 言い換えシステム KURA もおもしろいな。人工無能の1つの本質が、言い換えをどれだけうまくできるかってことだから。この周辺の論文でも眺めていれば、アイデアがいろいろ浮かんできそう。奈良先端科学技術大学院大松本研究室っていうのはすごいな。学生見れば、企業の研究職の人などがいるので当然といえば当然か。まあ、今後は、こうした形の大学院大学の重要性はますます高くなるだろう。ふと思ったが、大学・大学院の研究室のレベルのメーリングリストなんかが、どんどん公開されて、FreeML みたいな形で簡単に検索できて購読できるようになるとよいのだろうな。そうすると、個々の研究室が浮かび上がって、どこでどんな研究がされているのかが一般の目に触れやすくなる。そうすれば興味を持つ学生も増えるだろうし、企業との結びつきももっとできやすくなるし、認知度も高まって予算がとりやすくなり、また、大学/研究室のブランド構築にも役立つわけだし。高齢化社会・生涯教育ということを考えてみても、いったん企業に入った人が大学にまた戻るという機会もこれから増えていくのだし(大学は生き残りのためにそうしたところにも力を注ぐわけだし)、FreeML の大学特化版みたいのがあるといいかもしれない。で、著作権なんかもちゃんと気を払ってあげて、そのへんも明確な形で行えるようにする。メールマガジンなんかも作って、おもしろくて購読者が多いようなものだったら出版につなげていくとか。今、日本の大学の出版事業はあまり盛んに見えないけれど、電子出版も含めて大学出版局が頑張ると面白いのだな。どこかの傾きかけている出版社に複数の大学が共同出資して、大学出版局の実務を行わせればいい。一般の大手出版社が書籍をつまらなくしているところがあるのだから、新しい出版のブランドを複数の大学が共同で作り上げていけばいいのだ。少数の部数でも適切なコストで出せるようにやっぱり電子出版を中心にした方がいいな。紙で出力されたものが欲しければ、プリンティングサービスも提供して。
2003.01.08
コメント(0)
UniDic ってなんだちょっと今日はプログラムはお休みだけれど、形態素解析器 MeCab (和布蕪) の作者、工藤氏のMeCabのメーリングリスト(目次の次に参加方法が書かれている) を見ていたら、UniDic に関しては 話し言葉研究に適した電子化辞書の設計 (PDF) を見るとよいと分かった。この論文は非常に分かりやすく書かれていて文系の人でも読むことができる。「自然言語処理ってなんだろう」って思う人も読んでみると面白いだろうし、言葉としての日本語に興味がある人もたまには、こういう論文を読んでみると楽しいかもしれない。たとえば、「一本、二本、三本」を口に出して読んでみよう。あれ、「本」は「ポン」と読んだり「ホン」と読んだり「ボン」と読んだりするけど、コンピュータにこれを読ませる(音声合成)するときにはどうするんだー、辞書はどうなってるんだとか疑問に思ったら読んでみると面白いかも(疑問に思わない人は、まさか、1兆本まですべての読み方が辞書に入っているとかバカなことがあるわけないでしょ、と考えてみるべし。じゃあどうする)。「哲学」なら「テツガク」だけど「哲学科」だと「テツガッカ」と読むでしょ。辞書には何でもかんでも全部登録されるのかな? それとも何かルールが見つかれば、全部登録する必要がないのかな?さあ、どうするんだ。ちょっと、カタイからさらっとは読めないかもしれないが、ゆっくり読めば面白いことが沢山かかれている。この論文の UniDic の基本概念のところに次のようにある。- 人文系の言語研究に違和感なく使える- 斉一な単位設定- 学校文法に準じた品詞体系の採用- 音声研究に使える- 実情に即した発音情報の記述- アクセント型情報の記述- 音韻交代・アクセント変化に関わる制約の記述方向性として、学校文法に準じた品詞体系の採用っていうのはいいかもしれない。つまり、人工無能に適用する場合、これまでの知識を基にした直感的なルールが作りやすいということ。結局、こういうものを作っていくときに一番大切なのは、辞書をどう作るか、話すルールをどうつくるかというところなので、これがやりやすい方がよいわけだ。UniDic が使えるようになったら、UniDic を使うことにしよう(と、転換が早い(笑))。どうせ遊びなので深くは考えないの。で、この論文を流し読みしていて、多層単位認定の例を見て、あーこれ欲しいと思ってしまった。神戸女子大学と「神戸」「女子」「大学」で切ってくれてさらに「神戸」と「女子大学」でも切ってくれて、まとめて「神戸女子大学」でも切ってくれると何がいいか。それは、「神戸女子大学に素敵な女性がいるよ」と入力されたら「え、奈良女子大学に素敵な女性がいるの?」ととぼけた反応もやりやすいからだ。そして、何処かしらから画像を取ってきて表示するとか。問題は人の画像をとってくるところ。Google API を使ってイメージ検索すればいいのね。で、奈良女子大学だと思いっきり風景がでてきてしまうので、適当な名前で AND 検索かけてやればいいのさ。冗談はさておき、普通は、「神戸女子大学」でまとめてくれた方が扱いやすいけれども、特殊「女子大学生」ルールというのを作り、「女子大学」を含む場合は前半の語を変更してやるなどと小技をきかせることもできる可能性があるので、多階層の解析はうれしいなということ。「積極的だ」というのも、「積極」「的」「だ」と分けたパターンと、「積極的」「だ」とまとめたパターンの両方で簡単にアクセスできれば、いろんな書き換えルールを作りやすくなる。要するに UniDic を使った多階層単位認定を形態素解析器がやってくれれば、人工無能側の手間が省けていろいろやりやすくなるということで、うーん、これの方が都合がいいなーと思ったわけ。あとは、そのうち音声合成のプログラムがフリーで入手できたら、しゃべらせてみるとまた面白いだろうな。「シーマン」みたいにむかつくこと言わせる。SEAMAILは買おうと思っていて結局まだ買ってない。新バージョンってでないのかな。 504iシリーズ用iアプリ待受画面「シーマン」登場なんて出ていたのか。携帯シーマンなんてあるのか。でも携帯電源切っているときが多いしな。PS2用のシーマンは発売延期か。
2003.01.07
コメント(0)
新年早々、日本語の形態素解析器 MeCab (和布蕪) がバージョンアップされていた(2002/01/03)。新しいバージョンでは、Darts: Double-ARray Trie Systemというやつに対応してるらしい。おや Windows のバイナリも すでに新しいのが公開されている。ちなみに、MeCab の祖先は、CaSen (茶筌)。ChaSen の祖先は、JUMAN。もともと MeCab を作っている工藤氏は京都大学の言語メディア研(旧長尾研)で JUMAN の開発していた人なのだな。だから、JUMAN も ChaSen もその短所と長所をよく理解してさらに独自路線で MeCab を作ったということかな。祖先をたどると面白い。で、JUMAN 3.0 と 茶筌 との関係について 眺めてみると、京都大学長尾研究室の JUMAN からどういう経緯で、奈良先端大松本研究室の ChaSen が派生したかが分かるようだ。それから、JUMAN の品詞体系は益岡体系で、ChaSen はIPA 体系ならしい。で、このあたりの話は、MeCab のメーリングリストで知ったのだが、MeCab のページからメーリングリストの記述が消えているな・・・。まあいいや。で、MeCab は品詞体系に依存しない汎用形態素解析器を目指しているらしく、増岡品詞体系(JUMANがこれ) の辞書も使えるようにと開発しているようだ。MeCab や ChaSen は IPA品詞体系 というやつのようだ。ChaSen は unidic というのを将来使うようになるみたいだ。まあ、そのへんはほっておいて、人工無能でできるだけ簡単な処理を使用としたら、益岡品詞体系の方が IPA品詞体系より直感的にやりやすそうな感じがする。益岡品詞体系 や IPA品詞体系は、Google へ直行。でも、とりあえずいいや(^^;;○ ロボット的鸚鵡返しの術 (Python で人工無能)MeCab のメーリングリストで「単純なカナ漢字変換プログラムを作ってみましたって」流れてきたので、これにヒントを得て、ちょっとロボット的おみくじ付き鸚鵡返しの術を使ってみることにした。やり取りは、こんな具合になる。ちょっと人工無能っぽくなってきたのだ。単なる鸚鵡返しとおみくじ的ランダム返答を組み合わせるだけでも、MeCab のおかげで、やけに賢く見えるではないか(笑)。あなたの名前は? 傀儡師傀儡師 > 今日は寂しいよ。「キョー ワ サビシイ ヨ 。」 なんて、間抜け だね。傀儡師 > 今日は元気だよ。「キョー ワ ゲンキ ダ ヨ 。」 なんて、幸せ だね。傀儡師 > 今日は笑える。「キョー ワ ワラエル 。」 なんて、純粋 だね。で、今回のプログラムリストは、次のような感じ。ちょっと長くなってきてしまった。でも、今までのを日記を全部読み返すと、理解できるはずなんで、今回は説明省略。何せ、色をつけるのが面倒なので疲れた(^^;; #!/usr/bin/env python import sysimport whrandomdef raw_input(prompt=’’): """プロンプトを表示して、入力を得て、末尾の1文字(改行)を削除して返す。 @prompt 入力を促すためのプロンプト文字列 """ sys.stdout.write(prompt) return sys.stdin.readline()[:-1] def keitaiso_kaiseki(s): """MeCab で形態素解析した結果を返す。 解析結果は、形態素ごとにディクショナリ形式で格納したリスト。 @s 解析する文字列 """ from popen2 import popen2 fi, fo = popen2(’"c:¥¥program files¥¥mecab¥¥bin¥¥mecab"’) fo.write(s) fo.close() klist = fi.read() fi.close() sentence = [] for gyou in klist.split(’¥n’): keitaiso = gyou.split(’¥t’) dic = {} if len(keitaiso) == 2: dic[’表層形’]= keitaiso[0] n = keitaiso[1].split(’,’) dic[’品詞’]=n[0] dic[’品詞細分類1’]=n[1] dic[’品詞細分類2’]=n[2] dic[’品詞細分類3’]=n[3] dic[’活用形’]=n[4] dic[’活用型’]=n[5] dic[’原形’]=n[6] dic[’読み’]=n[7] dic[’発音’]=n[8] sentence.append(dic) return sentence def get_hatsuon(klist): """形態素解析結果から「発音」を取得し文字列として返す。 getHatsuon を klist の各要素に適用し、 「発音」を取得して、1つの文字列に結合して返す。 @klist 形態素解析結果リスト """ # 各形態素の情報から「発音」を取り出してリストにする hatsuon_list = map(getHatsuon, klist) # 発音リストの要素をスペースを間にいれてつなげる return " ".join(hatsuon_list) def getHatsuon(kinfo): """形態素解析情報から「発音」を取り出して返す。 @kinfo 形態素解析の結果 """ return kinfo[’発音’] def get_random_answer(rlist): "リストの中からランダムに一つ選択して返す。" return whrandom.choice(rlist) # メインのプログラムとして読み込まれたときには以下を実行 if __name__ == ’__main__’: # ランダム回答用のリスト # この中から、ランダムに後で人工無能が選択して答える。 # おみくじと同じ。 random_list =[’平和’, ’幸せ’, ’平凡’, ’悲壮’, ’不幸’, ’純粋’, ’間抜け’] # 名前を入力させてプロンプトにする。 name = raw_input(’あなたの名前は? ’) prompt = name + ’ > ’ # 繰り返しに入る while 1: answer=raw_input(prompt) # リターンだけなら終了 if not answer: break else: # 入力を形態素解析する klist = keitaiso_kaiseki(answer) # ロボット返答用の発音を取得する robot_answer = get_hatsuon(klist) # おみくじ的返答をランダムに発生させる。 random_anser = get_random_answer(random_list) print "¥n「%s」 なんて、%s だね。¥n" % (robot_answer, random_anser) # 終わりだよん print "バイバイ"
2003.01.06
コメント(0)
去年のアクセスログを眺めた。全部はとってはいないのだけど、時々保存していたのだ。で、co.jp と ac.jp を見ていると、うーん、やっぱりこの分野はまだ限られた範囲の人しか興味をもっていないのかなーという感じだった。つまり、ドメイン名を見るだけで、あぁ、あそこかと分かってしまうようなものが多い。CMS にしても、自然言語処理もいまいちマイナーなのね。Googleで「人工無能 Python」で検索すれば、このページがトップに出てくるけど、そういう探し方をする人はいないみたいだ(笑)。だいたいできあがってもいないものがトップに来るのもヘンだな。「人工無能 Python Eliza」までいったら、ほとんど全滅だものなー。日本以外のサイトだと「artificial intelligence Python Eliza」なら、287件、「artificial intelligence Python」にいたっては、67100件だよ。「人工知能 Python」だとわずか 197件。「人工知能」が61,900件。「artificial intelligence」が1,540,000件。日本だと人工知能の検索に比べて人工知能 + Python が0.3%。全ウェブだと 4.35%。「人工知能 Java」が 5,400件。「人工知能 Perl」1,250件、「人工知能 lisp」が1,710件、「人工知能 prolog」が1,490件。「人工知能 scheme」425件。「人工知能 smalltalk」419件。そうすると、人工知能関連では、Java → Lisp → Prolog → scheme → smalltalk → Python ということか。なんていう検索はある意味当てにならないのだな。「人工知能 COBOL」だと 640件なのだ(爆笑. COBOL は主として事務処理系で使われてきた言語)。コンピュータの歴史みたいな話のページに両方出てくる可能性が高いからこういうことになるんだろう。とはいえ、Java がこの分野でかなり重要な位置を占めるようになってきたことだけは間違いないだろう。日本語のページを対象に言語ごとに検索してみると、Java は 86,200件、Lisp 49,700件、Python 60,100件、Scheme 29,900件、Prolog 19,000件、SmallTalk 24,300件、COBOL 43,300件、Fortran 42,600件。さて、ここで Perl 389,000、Ruby 289,000件だ。やっぱりそれぞれ宝石の名前とかぶるから桁違いになる。Python は蛇のパイソンともダブるけどやっぱりああいうものを趣味とする人は少ないだろうし、モンティーパイソンの Python も熱狂的な人はいるだろうけど、やはり限られている。直接関係ないページを省くようなアルゴリズムで件数を計算できるとおもしろいのだがな。まあ、プログラミング固有の単語を入れてやれば、もう少しちゃんと分かるだろう。「def python」で検索すれば、まあ、よほどのことがない限りそのページはプログラミング言語としての python だろうし、「java buffer」で検索すれば、よほどのことがないかぎり Java コーヒーにはならないだろうし。ということで検索結果のページ自体の内容を簡単にフィルターしていけば、ほんとは、もう少しまともな結果が得られるだろうがまあいいや。あと、ジェネラルな記述を消去していくとかね。あ、やっぱりもう少しだけ。「人工無能 Java」が 2,430件。「人工無能 Perl」が 1,720件。なんにせよ、Java の普及度はかなり高くなっているみたいだ。[人工知能」61900件、「人工無能」14,400件。「人口無能」2,990件。うーむ、人口無能はやっぱり人工知能にはかなわないのだなー。こうやって、継続的にときどき、検索件数を記録しておいて、たまに推移を見ると面白いことが分かるだろう。ちなみに Zope だと日本語サイトで 53,100件、Python が 60,100件。全ウェブで、Zope が 11,200,000、Python が 4,840,000件。Java が 31,900,000件。JDK 92,600件、JRE 255,000件。ふーん、Monty Python と、蛇の Python、ギリシャ神話の Python、魚の Zope が果たしている役割は、けっこう大きいということだろうか。Monty Python を排除しようとして Monty があったら排斥しようとしても、それこそ Python を作った Guido van Rossum 氏のページまで省かれてしまうだろうし、Zope の開発プロセスは fishbowl プロセスとか言われているから、なかなか排除するのが難しいのだな。そうすると、やっぱりリンクもある程度追わないと、重要なページを削除してしまうことになる。さてさて、とにかく今年もマイナーの楽しみをじっくり味わうことにしよう。○ 形態素解析(MeCab)の呼び出しを関数に (Python で人工無能)前回、関数の作り方をちょっとやったので、今回は MeCab を呼び出しているところを関数化してしまうことにする。で、さっそく次のようにしてみる。def keitaiso_kaiseki(s): from popen2 import popen2 fi, fo = popen2(’"c:¥¥program files¥¥mecab¥¥bin¥¥mecab"’) fo.write(s) fo.close() klist = fi.read() fi.close() sentence = [] for gyou in klist.split(’¥n’): keitaiso = gyou.split(’¥t’) dic = {} if len(keitaiso) == 2: dic[’表層形’]= keitaiso[0] n = keitaiso[1].split(’,’) dic[’品詞’]=n[0] dic[’品詞細分類1’]=n[1] dic[’品詞細分類2’]=n[2] dic[’品詞細分類3’]=n[3] dic[’活用形’]=n[4] dic[’活用型’]=n[5] dic[’原形’]=n[6] dic[’読み’]=n[7] dic[’発音’]=n[8] sentence.append(dic) return sentenceで、これが保存されているファイルを読み込んだら、次のようにしてみる。作成した keitaiso_kaiseki 関数に解析させたい文字列を渡してやって、変数 result に結果を保存する。>>> result = keitaiso_kaiseki("今日はあなたに会えてよかった。")そうしたら、今度は、解析結果から一部を1行ずつ(形態素の1つ1つを取り出しながら、ディクショナリ形式で保存されている情報を引っ張り出して表示してやる。>>> for k in result: print k[’原形’], k[’品詞’], k[’活用形’], k[’活用型’]今日 名詞 * *は 助詞 * *あなた 名詞 * *に 助詞 * *会える 動詞 一段 連用形て 助詞 * *よい 形容詞 形容詞・アウオ段 連用タ接続た 助動詞 特殊・タ 基本形。 記号 * *実際の結果(result)の中身は、こんな感じになっている。>>> print result[{’品詞細分類1’: ’副詞可能’, ’原形’: ’今日’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’今日’, ’読み’: ’キョウ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’キョー’, ’活用形’: ’*’}, {’品詞細分類1’: ’係助詞’, ’原形’: ’は’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’は’, ’読み’: ’ハ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’ワ’, ’活用形’: ’*’}, {’品詞細分類1’: ’代名詞’, ’原形’: ’あなた’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’一般’, ’表層形’: ’あなた’, ’読み’: ’アナタ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’アナタ’, ’活用形’: ’*’}, {’品詞細分類1’: ’格助詞’, ’原形’: ’に’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’一般’, ’表層形’: ’に’, ’読み’: ’ニ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’ニ’, ’活用形’: ’*’}, {’品詞細分類1’: ’自立’, ’原形’: ’会える’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’会え’, ’読み’: ’アエ’, ’活用型’: ’連用形’, ’品詞’: ’動詞’, ’発音’: ’アエ’, ’活用形’: ’一段’}, {’品詞細分類1’: ’接続助詞’, ’原形’: ’て’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’て’, ’読み’: ’テ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’テ’, ’活用形’: ’*’}, {’品詞細分類1’: ’非自立’, ’原形’: ’よい’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’よかっ’, ’読み’: ’ヨカッ’, ’活用型’: ’連用タ接続’, ’品詞’: ’形容詞’, ’発音’: ’ヨカッ’, ’活用形’: ’形容詞・アウオ段’}, {’品詞細分類1’: ’*’, ’原形’: ’た’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’た’, ’読み’: ’タ’, ’活用型’: ’基本形’, ’品詞’: ’助動詞’, ’発音’: ’タ’, ’活用形’: ’特殊・タ’}, {’品詞細分類1’: ’句点’, ’原形’: ’。’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’。’, ’読み’: ’。’, ’活用型’: ’*’, ’品詞’: ’記号’, ’発音’: ’。’, ’活用形’: ’*’}]とりあえず、これで MeCab を使った形態素解析を Python からできるようになった。ちなみに、上記のリストは、楽天にアップロードするために全角半角が入り混じっているのでそのままだと動かない(全角の記号はすべて半角に直してやる必要があるし、スペースも全角で入っているので注意)。まあ、本当はオブジェクト指向的に作り直してやった方がよいし、そもそもエラー処理ぐらい入れんかいという話もある。ちゃんと抽象化してインターフェイスもきっちり分けて、MeCab と Chasen と Juman を簡単に切り替えられるようにとかした方がいいだろうし。なんていうのは、考えないことにする。とりあえず動きゃいいんだよ。そもそも、MeCab.exe のパスだって埋め込んでるレベルなんだから、Windows でしか動かんじゃない(笑)。で、次は、いよいよ、ここで得られた情報を使って何かしてみよう。かと思いきや、やっぱり形態素レベルで分かち書きされているだけより文節にちゃんと分かれていた方が使いやすいので CaboCha/南瓜 を使って係り受け解析までやってからの方がいいな・・・。と誘惑に駆られる。たが、モデル作成に毎日新聞のデータを使っているので研究目的以外での利用は原則として認められないということだ。遊びに使うとあとで怖いので、CaboCha の方は手をつけないことにする。ブツブツブツ(以下、省略)。
2003.01.04
コメント(0)
ああ、今日で今年も終わりだ。今までこのページを見にきてくれた方々に感謝。ちゃんと読んでくれた人もいるだろうし、ちょっと見てなんだこりゃとすぐ別のページにいった通りすがりの人も多いというかほとんどだろうけど、皆さん感謝。飽きっぽい私ではあるが、意外にもこの日記は細々ながら続いている。また、細々でもアクセスカウンタがのびていくと、誰か読んでくれている人がいるんだなと思って書く気になるのだから。1人でも2人でも、どこかに共感してくれたりした人がもしいたら、それで満足。今まで、このぐらい沢山の量の文書を匿名で人前にさらしたことがなかったので、書いていると新鮮な気持ちになって、自分の書く文章を見つめなおすきっかけにもなった。ここに書く文章っていっきに書いて見直しもせず、更新してしまうので、勢いで書くとけっこうヘンな言い回しするなとか、後で気が付いたりするけど、まあ、それはそれでいいかと思って書き付けている。正直、今いったい何のために書き続けてるんだかよく分からないのだが、沢山書いておけば、あとーになって見返してみると何か自分の再発見もあるだろうなとか思う。人目にさらすことによって、自分だけしか見ない日記とはちょっとまた違う自分が出てくるのだな。『リプレイスメント』を見た。まあ、こういうB級映画は素直に楽しめばよいなと。娯楽作品としてよくできてる。DVDで見ると監督の解説が聞けるので楽しい。監督の解説を聞いた後にもう一度見る。そうすると1枚で3度は最低でも見られる。まあ、とにかくアメリカンフットボールは、あのガツンのプロテクターがぶつかる音がいいのだ。CATVで宇宙戦艦ヤマトシリーズをまとめてやっていたのだが、なんだか自爆テロ的な場面多いなー、とふと思った。みなさん、よいお年を。○関数を使ってまとめなおす (Python で人工無能)Python で人工無能では、まず、入力を鸚鵡返しにする小さなプログラムを作り、「おみくじ」を引けるようにした。そして、入力した文字列を MeCab で形態素解析を行うところまでをこれまでやってきた。ここで、関数を使って、プログラムをまとめなおしてみることにする。その前に、Python のプログラムファイルの先頭に次の行を入れることにする。#!/usr/bin/env pythonUnix などでは、ファイルに実行可能なフラグをつけておけば(chmod +x)、ここに #!/bin/sh と入れてシェルスクリプトを指定したり、#!/usr/local/bin/perl として Perl を指定したりすることによって、指定されたプログラムを使って、記述内容を実行できる。たとえば、python test.py としなくても、コマンドプロンプトから test.py を入力してリターンを打てば、プログラムが実行できる。Windows の場合は、拡張子 .py と Python の実行プログラムである python.exe が関連付けられているので、特にこのようなものを入れなくても、test.py だけで実行できてしまう。でも、形式を整えておくために入れておく。そして、終わりには、次のように入れておく。前に、import を使って他のファイルを読み込むことをしたが、そうした場合には、プログラムを読み込んだとたんに実行されてしまうとこまる。次のようにして、if 文の後ろに読み込んだときに実行したいプログラムを入れておくと、プログラムとして起動したときだけ実行され、import で読み込んだときには main() が実行されないので、便利なのだ。if __name__ == ’__main__’: my_function1() my_function2() my_function3()python の実行環境は、名前空間を持っていて、import os とすれば、os ライブラリの中に入っている関数は、os という名前空間の中に読み込まれる。os ライブラリの中に open という関数があれば、os.open でこの関数を扱うことができる。door というライブラリを import door として、その中に open という関数があれば、door.open となる。つまり、ライブラリごとに名前空間を持つので同じな前の関数があっても名前がぶつかるということがないのである。端的に分かりやすい名前であるほど重複する可能性があるので、こうしたライブラリごとに名前空間が切られる仕組みは非常に楽なのだ。もしこの仕組みがなければ、すべての関数に異なる名前をつけなくてはならなくなり、非常に面倒なことになる。 osライブラリ doorライブラリ(例)+----+ +----+| open | | open | 名前がダブっても大丈夫| close | | close || .... | | ... |+----+ +----+で、__name__ というのは、この名前空間の名前がどこかを示す環境変数だと考えればよい。インタプリタで起動したところで次のように試してみる。>>> __name__’__main__’で、実行環境自体を現すのが __main__ だということが分かる。C のプログラムを書くと、int main(argc, argv) とかメインの関数を入れるのと同じことなのだ。python では、main という関数を定義してここに、メインのプログラムを書き込んでやるのと同じようなことだ。さて、そもそも何で関数なんだということになるが、これまでのように実行すべきことをズラズラと並べればそれでちゃんとプログラムは動かせるし、小さいプログラムなら別に困ることはないのだ。でも、機能単位で関数として切り出すことによって、その関数を別のプログラムで再利用することもできるし、また、見た目にも機能単位になっているので分かりやすくなるのだ。そして、関数単位でプログラムの動作をしっかりチェックしておけば、大きいプログラムであっても、分かる範囲から確実にチェックできるので、まともにプログラムを書くのであれば、普通は関数を自分で定義して使うことになる。これまではpython にあらかじめ組み込まれている関数だけを使っていたが、それと同じようなものを自分でも作れるということになる。関数の定義は簡単で、次のようにすればいい。def functionName(引数1, 引数2, ..): 処理 return 戻り値さっそく「おみくじ」という関数を作ってみる。おみくじは引数をとらない関数なので()の中には何もいれないでおく。>>> def omikuji(): import whrandom fuda = [’大吉’,’中吉’,’小吉’,’凶’,’大凶’] result = whrandom.choice(fuda) + ’です。¥n’ return result>>> o = omikuji()>>> o’大吉です。¥n’>>> print o大吉です。という感じになる。毎度中途半端だが今日はここまで。で、次回からは MeCab を呼び出しているところを関数化して、人工無能の雛形作りをはじめてみることにする。
2002.12.31
コメント(0)
ああ、もうホントに今年も終わってしまう。今年もいろいろやり残してしまった。『グッドナイトムーン』を見た。スーザン・サランドンも、ジュリア・ロバーツも素敵な女性だ。○もう少し便利に格納(Python で人工無能)とりあえず、形態素解析の結果の文字列を個々の要素に分解し、次のようなリストに入れてみた。でも、これだと、今日の読み’キョウ’を取り出すのに sentence[0][1][0]というようにしなければならず、ちょっと分かりにくいし使いにくい。>>> print sentence[[’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]], [’は’, [’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’]], [’元気’, [’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’]], [’だ’, [’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’]], [’。’, [’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]]]「1番目の形態素の読み」、「2番目の形態素の品詞」といった具合にもっと分かりやすく取り出すことはできないだろうか。それに入れ子形式になっているのもちょっと使いづらい。深い入れ子から取り出すよりかは、フラットになっているほうがいいだろうし。Perl とか AWK あるいは Lisp などでは連想配列(alist, association list)というデータ型を使うことだろう。普通にデータが並んだ配列の場合だと、1番目の値(a[0])、2番目の値(a[1])と数字で値を呼び出すのだが、連想配列では、数字の代わりに名前で呼び出すことができるのだ。a[’hyouki’], a[’yomi’] みたいに、名前で呼び出せれば便利だろう。Python には、ディクショナリという形式のデータ記述形式がある。ディクショナリって辞書のこと。まさにそのまんまなのだ。こういうことのために使ってくれといわんばかりの名前だな。で、実際には次のように索引として使う名前と値を「:」コロンでつないでやったものを波括弧{ と }で括ってやれば、名前で値を取り出せるようになる。波括弧の中に入れる個々のエントリは、カンマで区切っていく。取り出すときは、普通のリストを配列としてその要素を取り出すときと同じように、鍵括弧の中に取り出す要素の番号を入れてやる。じゃなくて、取り出す要素の名前を入れてやる。>>> dic = {’索引0’:’値0’, ’索引1’:’値1’, ’索引2’:’値2’}>>> dic[’索引0’]’値0’>>> dic[’索引2’]’値1’つまり、普通の配列だと何番目に入っているものと指定してやるけれど、辞書形式の場合は、番号で指定してやるのではなく、番号に名前をつけてやる感じになる。もっとも、実際にディクショナリ型に入れてしまうと dic[0]、dic[1] といった何番目の要素という添え字で値を取り出すことはできなくなる。つまり、名前だけでしか呼び出せなくなる。ディクショナリ形式の場合は、何番目ではなくて、名前で出し入れすることを優先させたので、実際に配列の何番目に値が入るかが分からなくなる。もっと簡単な例をあげてみよう。>>> family = {} # 空のディクショナリを作ってやる。>>> family[’父’] = ’幸太郎’>>> family[’母’] = ’幸子’>>> family[’長男’] = ’幸雄’>>> family[’次男’] = ’幸正’>>> family[’長女’] = ’幸野’>>> family[’祖母’] = ’ゆき’と家族辞書を用意してやる。>>> family[’長男’]’幸雄’>>> family[’祖母’]ゆきディクショナリがとても便利な形式であることが、これで分かっただろう。順番に処理してやるのではなく、どれかを引っ張り出して処理するときには、名前をつけてやった方が便利なのだ。ということで、形態素もこれと同じように名前をつけて格納してやればいいということになる。で、形態素解析の結果から 1行だけちょっとやってみよう。>>> k = [’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]これがどういう意味を持つか再確認すると、[表層形 [品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音]]ということなので、これにしたがって名前をつけて入れてみよう。>>> dic = {} # 空の辞書を用意して、>>> dic[’表層形’]=’今日’>>> dic[’品詞’]=’名詞’>>> dic[’品詞細分類1’]=’副詞可能’>>> dic[’品詞細分類2’]=’*’>>> dic[’品詞細分類3’]=’*’>>> dic[’活用形’]=’*’>>> dic[’活用型’]=’*’>>> dic[’原形’]=’今日’>>> dic[’読み’]=’キョウ’>>> dic[’発音’]=’キョー’と入れてやる。そうすると、>>> print dic[’発音’]’キョー’>>> print dic[’品詞細分類1’]’副詞可能’と簡単に要素を取り出すことができるようになった。じゃあ、次は、1文を解析した結果を順番に格納してやればいいわけだ。でも、各形態素は名前で呼び出すより、1番目2番目とそのまま配列に格納された順番で呼び出した方が便利そうなので、ここは通常の配列で取れるようにリスト形式にしてやろう。じゃあ、前に作ったものを元にして、またちょっと変更してみる。>>> klist’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’>>> sentence = []>>> for gyou in klist.split(’¥n’): keitaiso = gyou.split(’¥t’) dic = {} if len(keitaiso) == 2: dic[’表層形’] = keitaiso[0] # 解析結果の細目をカンマで区切って1つのリストに格納 n = keitaiso[1].split(’,’) # リストから取り出して、ディクショナリに入れなおす dic[’品詞’]=n[0] dic[’品詞細分類1’]=n[1] dic[’品詞細分類2’]=n[2] dic[’品詞細分類3’]=n[3] dic[’活用形’]=n[4] dic[’活用型’]=n[5] dic[’原形’]=n[6] dic[’読み’]=n[7] dic[’発音’]=n[8] sentence.append(dic) else: passさて結果を見てみよう。中をよく見ると、入れた順序と違って順番がバラバラになっているのが確認できるだろう。別にこれはどうでもいいのだ。出し入れが効率的に行えるような順番になっているからなのだが、名前でアクセスするのだから気にする必要はない。>>> print sentence>>> print sentence[{’品詞細分類1’: ’副詞可能’, ’原形’: ’今日’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’今日’, ’読み’: ’キョウ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’キョー’, ’活用形’: ’*’}, {’品詞細分類1’: ’係助詞’, ’原形’: ’は’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’は’, ’読み’: ’ハ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’ワ’, ’活用形’: ’*’}, {’品詞細分類1’: ’形容動詞語幹’, ’原形’: ’元気’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’元気’, ’読み’: ’ゲンキ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’ゲンキ’, ’活用形’: ’*’}, {’品詞細分類1’: ’*’, ’原形’: ’だ’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’だ’, ’読み’: ’ダ’, ’活用型’: ’基本形’, ’品詞’: ’助動詞’, ’発音’: ’ダ’, ’活用形’: ’特殊・ダ’}, {’品詞細分類1’: ’句点’, ’原形’: ’。’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’。’, ’読み’: ’。’, ’活用型’: ’*’, ’品詞’: ’記号’, ’発音’: ’。’, ’活用形’: ’*’}]で、取り出してみる。自由自在に解析結果がこれで取り出せるようになった。>>> sentence[2][’原形’]’元気’>>> sentence[2][’品詞’]’名詞’>>> sentence[3][’読み’]’ダ’>>> sentence[3][’品詞’]’助動詞’
2002.12.30
コメント(0)
あぁー、もうすぐ今年も終わってしまう。なんだか、この歳になってもちっとも進歩がなくて困る。来年こそは、来年こそはと思うのだが意志が弱くてダメだ。このところ、日記もサボってるしなー。来年こそは、心を入れ替えてまじめに働こう(って不真面目に働いているわけじゃないけど)。あ、そういえば『ロルカ』(DEATH IN GRANADA)、(20世紀スペインの詩人ガルシア・ロルカ殺害の真相とは?歴史に取材した骨太の政治ミステリー映画)を見た。地味だけどいい映画だった。実は、スペインが生んだ天才詩人/劇作家、フェデリコ・ガルシア・ロルカとう存在は知らなかったのだ(^^;;○ばらした文字をまとめる(Python で人工無能)さて、MeCab で形態素解析をした結果を文字列で取得して、それをばらすところまでやったのだが、間を空けすぎて忘れてしまったよ。 ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’と1つの文字列になっているから、ばらして、こんな風に表示するところまでやったのだったな。で、今度は、これを使いやすい形にまとめてやることにする。今日[’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]は[’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’]元気[’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’]だ[’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’]。[’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]でどうするか。やり方はいろいろあるだろうが、まず単純なリストを作るようなことをしてみようかと思う。本当ならば形態素のクラスでも作って適当なメソッドを作って・・・としたいところだが、まだやめておく。で、表示するときは、次のように表示したので、表示する代わりにリストに入れていってしまおう。>>> for gyou in klist: keitaiso = gyou.split(’¥t’) # タブで区切って if len(keitaiso) == 2: print keitaiso[0] # 1つ目の要素を印字 print keitaiso[1].split(’,’) # 2つ目の要素はカンマで # 区切って表示 else: # そうでなければ pass # パスしちゃう(なにもしない) ちょっと書き換えてみると、>>> for gyou in klist:となる。そうすると、次のようになる。つまり、リストがネスト(入れ子)になっているような感じだ。大枠=文が、中枠=形態素のリストから成り立っていて、さらに小枠の中に形態素解析の解析結果の詳細が入っているという形になる。文はいくつかの形態素によって成り立っていて、形態素には、品詞などの形態素解析の結果が入る。[(文) [(形態素1-読み) [品詞1....]] [(形態素2-読み) [品詞2....]] [(形態素3-読み) [品詞3....]] [(形態素4-読み) [品詞4....]] [(形態素5-読み) [品詞5....]] ]klist = ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’まず、結果を入れるための大枠を用意しておく。つまり、空っぽのリストを作る。>>> sentence=[]そうしたら、今度は、そのリストの中に表示する代わりに、どんどん追加していけばいいということになる。追加するのは、append(追加) という関数を使う。この関数を使うと、あるリスト somelist.append(new_item) で new_item を追加できるというものなので、sentence.append(new_item) としてやればいい。ちょっと段階的にやってみよう。最初は、先頭の要素の表記だけをリストに追加してみる。for gyou in klist.split(’¥n’): # n で行ごとに分割 keitaiso = gyou.split(’¥t’) # タブで前半と後半を分割 if len(keitaiso) == 2: # 分割できたときには sentence.append(keitaiso[0]) #1番目をリストに足して print keitaiso[1].split(’,’) #2番目は表示のみ else: passそうすると、先頭の表記はリストに追加されるだけで表示されないので次のように出力される。[’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’][’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’][’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’][’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’][’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]>>> print sentence[’今日’, ’は’, ’元気’, ’だ’, ’。’]これで、表記の部分をバラバラにしたものをリストに取れるところまできた。ここで、いったん、sentence = [] として、空っぽのリストに戻しておく。>>> sentence = []>>> print sentence[]さて今度は、形態素解析結果の詳細も一緒にリストに入れてやることにする。で、keitaiso[1].split(’,’) の結果は、上のように品詞で始まるようなリストにすでになっているので、これを追加してやればいいのだが、ちょっとプロンプトから手で一行だけ予行演習をしてみよう。>>> hyouki = ’今日’>>> kaiseki = [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]これを [hyouki [kaiseki, ....] ] のような入れ子のリストにしてやりたいので、list という関数を使ってやる。>>> list((hyouki, kaiseki))[’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]]これで1行分できたので、あとはループの中で繰り返しやればいい。ということで、for gyou in klist.split(’¥n’): keitaiso = gyou.split(’¥t’) if len(keitaiso) == 2: gyou = list((keitaiso[0], keitaiso[1].split(’,’))) sentence.append(gyou) else: pass>>> print sentence[[’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]], [’は’, [’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’]], [’元気’, [’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’]], [’だ’, [’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’]], [’。’, [’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]]]でリストになった。じゃあ、ここから、取り出しをやってみよう。これは三次元の配列になっているのと同じことなので、次のように配列の添え字を指定してやると個々のパーツを取り出せるのだ。先頭要素は0を指定し、2番目の要素は1を指定し・・・とすれば、どの部分でも指定して取り出すことができる。で次のようになる。>>> sentence[0] # 1行目(0番目に入っている)を取り出す。[’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]]>>> sentence[0][1] # 1行目の第2要素を取り出す(添え字は0から始まる)[’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]>>> sentence[0][1][0] # 1行目第2要素の第1要素を取り出す。’名詞’分かりにくかったら次のをよく眺めてみよう。[(文) sentence[0][0] sentence[0][1] [ (形態素1-読み) [品詞1....]] 1行目 sentence[0] [ (形態素2-読み) [品詞2....]] 2行目 sentence[1] [ (形態素3-読み) [品詞3....]] 3行目 sentence[2] [ (形態素4-読み) [品詞4....]] 4行目 sentence[3] [ (形態素5-読み) [品詞5....]] 5行目 sentence[4] ][# 0 1 [ 0 1 2 3 4 5 6 7 8 [’今日’, [’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]]]で、もう一度。今度は、キョウを取り出してみる。>>> sentence[0][1][7]’キョウ’うーん、でも数字で指定するのって、今ひとつ取り出しにくいよな。名前で取り出したいよな、と思うだろう。で、また次回へ。
2002.12.29
コメント(0)
今日の日記は1日の初めに書いてしまおう(^^;;。このところ日記の後半で書いている「Python で人工無能」は、かなり手抜きなことをしている。でも、これが1年たつと、そこそこ高度な人工無能になっているはずなのだ。この日記のタイトル傀儡師の館は、傀儡(人形=人工無能)を操るのが念頭にあるから、そういう名前にしたのだ。たぶん、3年も続けば、今頭の中にある構想が実現するだろう(笑)少しずつ要領悪く試行錯誤的に進めることによって、何かが見つかればいいなと思っている。作る過程で試行錯誤をして延々書くためのネタを作るわけだ。ところで、今、「今日は元気だ。」という例にとってを使ってやっているが、これは面白いのだ。「私は元気だ。」も MeCab で解析してみれば面白さが分かる。もう一つ「太郎は元気だ。」というのもやってみよう。そうすると、どれも、名詞、助詞、名詞、助動詞、記号という解析結果になる。大枠の品詞の並びが同じでもずいぶん意味が違うものだ。「私は元気だ。」と「太郎は元気だ。」は意識的にはやや近い。太郎は名詞-固有名詞で、私は名詞-代名詞なので、ある主体(人)が元気な状態を示している。でも「今日は元気だ。」って、ちょっと違うでしょう。今日(名詞-副詞可能)は、となると、同じ「名詞は、形容動詞だ」という形になっているのに、ぜんぜん意味が違う。私や太郎(人)であれば、主語になれるので私や太郎が元気という状態にあるという意味にとるのが普通になる。それに対して、「今日は」となると、「今日」という主体が元気なわけではなくて、「今日」という時間において誰かが元気だということでしょう。この場合誰が元気なのだろう。文脈依存性が高い文だ。「彼は最近、元気がなかった。だが、今日は元気だ。」この場合は彼が元気なのだが、「私はこのところ体調が悪かった。でも、今日は元気だ。」であれば私のことなのだな。「いつも元気だ。」なんていうのもならべて考えてみよう。「いつも」は (副詞-助詞類接続)と解析されるし、「いつもは元気だ。」としても、「いつも(副詞-助詞類接続)+は(助詞) と解析される。「最初は元気だ。」は、最初(名詞-一般)+は(助詞)と解析される。「(うちの)猫は元気だ。」も、名詞-一般+助詞の形だ。さて、さらに脱線させて思いつくままに文を並べてみよう。今日は元気だ。明日も元気だ。今日は天気だ。最初は元気だ。いつも元気だ。いつもは元気だ。私は元気だ。太郎は元気だ。猫は元気だ。盆栽は元気だ。彼のとりえは元気だ。私は調子が悪い。コンピュータは調子が悪い。コンピュータが調子が悪い。コンピュータの調子が悪い。言葉は不思議だ。言葉も不思議だ。言葉が不思議だ。・・・○もう少し文字列を分解する(Python で人工無能)昨日までで、次のような文字列を、行(¥n)とタブ(’¥t’)で区切るところまでできた。つまり、次のような文字列を ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’こういう区切りにすることができた。 今日名詞,副詞可能,*,*,*,*,今日,キョウ,キョーは助詞,係助詞,*,*,*,*,は,ハ,ワ元気名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。記号,句点,*,*,*,*,。,。,。EOSで、今日は、名詞、助詞などの解析結果が入っているところを、カンマ区切りでもう一度区切ってみる。ちょっと、昨日とは形式を変えて次のようにしてみよう。 >>> for gyou in klist: keitaiso = gyou.split(’¥t’) # タブで区切って print keitaiso[0] # 1つ目の要素を印字 print keitaiso[1].split(’,’) # 2つ目の要素はカンマで 区切って表示 今日[’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]は[’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’]元気[’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’]だ[’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’]。[’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]EOSTraceback (most recent call last): File "", line 4, in ? print keitaiso[1].split(’,’)IndexError: list index out of rangeおや、エラーになってしまったぞ。Python のインタープリタ・対話形式だと、こうやって1行1行確認しながら実行できて、間違いがあると、何が違うのか、表示してくれるから楽なのだ。 で問題はというと、一番最後が EOS(End Of Sentence, 文/センテンスの終わり)を示す記号が入っていたのだ。って最初から分かっているんだけど(笑)、この部分だけちょっと形式が違うのだよな。 タブで区切ると、この行だけはタブがないから、タブで区切っても帰ってくるのは [’EOS’(,ここに要素がない)] になってしまっている。で、2番目の要素(要素[1]、要素を数えるときは0から始まるので2番目の要素は1でアクセスするのだな)をとることができないからエラーになってしまう。エラー行の最後で、インデックスエラー(IndexError:)、リストのインデックスが範囲外だよということになっているわけ。つまり、リストにアクセスするのに0個目、1個目と索引を使ってアクセスしたけれど、実際にある要素の範囲を超えて(out of range)アクセスしてしまったということなのだ。 EOS という文字列をタブで区切ろうとすると、そこがどうなっているかを、ちょっと確認してみよう。 >>> "EOS".split(’¥t’) [’EOS’] ## 要素が1つしかないことに注意だから、 >>> "EOS".split(’¥t’)[0] ’EOS’>>> "EOS".split(’¥t’)[1] Traceback (most recent call last): File "", line 1, in ? "EOS".split(’¥t’)[1]IndexError: list index out of rangeということで、リストの要素[0]にはアクセスできても、要素[1]にアクセスすることはできないということが分かった。じゃあ、ここでどうしたらよいか。この場合、リストの要素が1つか2つで処理が切り分けられるので、リストの要素の数を数えて1つなら処理をしない、2つなら処理をするというように書き換えてみよう。len(数えるもの)で要素の数を数えられる(len は、長さの length からきている)。 >>> for gyou in klist: keitaiso = gyou.split(’¥t’) # タブで区切って if len(keitaiso) == 2: # 要素の数が2つなら print keitaiso[0] # 1つ目の要素を印字 print keitaiso[1].split(’,’) # 2つ目の要素はカンマで # 区切って表示 else: # そうでなければ pass # パスしちゃう(なにもしない) リストの要素の数を数えて2つならば、処理をして、そうでなければ、パスしてしまう(そのまま通り過ぎる)。なお、else: pass はなくてもいいのだけど、あえて意味が分かりやすいようにいれておいてある。 とにかく今度は終わりまでちゃんと処理できる。 今日[’名詞’, ’副詞可能’, ’*’, ’*’, ’*’, ’*’, ’今日’, ’キョウ’, ’キョー’]は[’助詞’, ’係助詞’, ’*’, ’*’, ’*’, ’*’, ’は’, ’ハ’, ’ワ’]元気[’名詞’, ’形容動詞語幹’, ’*’, ’*’, ’*’, ’*’, ’元気’, ’ゲンキ’, ’ゲンキ’]だ[’助動詞’, ’*’, ’*’, ’*’, ’特殊・ダ’, ’基本形’, ’だ’, ’ダ’, ’ダ’]。[’記号’, ’句点’, ’*’, ’*’, ’*’, ’*’, ’。’, ’。’, ’。’]これで文字を区切っていくことができたが、このままだと、単に文字列を引きちぎって表示しただけなので、今度はもっと後で処理がしやすいように入れ物に入れてあげることにしよう。想像できると思うが、やっぱり手抜きをすることになる。ということで今日は終わり。
2002.12.22
コメント(0)
Today 2002-12-21 寒いなー。最近、寒くてなかなか外に出られない。今月の電気代が怖い。夏は夏で暑くて外に出られないとか言っているので、単なる出不精という話もあるのだが。そういえば、昨日テレビで、今年は電気の消費量が多いので、横須賀の休止中だった火力発電所も稼動を始めたとかやっていた。電気を消費すればするほど、地球が傷むとは分かっているのだけど・・・。 ○文字列を分解する(Python で人工無能) とりあえず、MeCab を Python から呼び出して形態素解析した結果を得られるところまで昨日でできたので(アバウトなやり方だけど)、今度は、解析結果をプログラムでもう少し使いやすい形に変換してやることにする。 で、昨日得られた結果は、次のような文字列だった(ちょっとだけスペースも入れて、表題も入れて見やすくしておこう)。 ========================================================== 品詞細分類1,品詞細分類2, 品詞細分類3,活用形,活用型,表層形 品詞 原形,読み, 発音==========================================================今日 名詞, 副詞可能,*,*,*,*, 今日,キョウ,キョーは 助詞, 係助詞,*,*,*,*, は, ハ, ワ元気 名詞, 形容動詞語幹,*,*,*,*, 元気,ゲンキ,ゲンキだ 助動詞, *,*,*,特殊・ダ,基本形, だ, ダ, ダ。 記号,句点,*,*,*,*,。,。,。EOS上みたいなものが、実際は、次のような文字列として得られている。 ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’ で、この形式については、出力フォーマット を見ると変えられるし、もう少し無能を賢くするために使える情報があるのだが考えるのが面倒なので(笑)、出てきたままで、とりあえず加工することにする。 フォーマットは、次のようになっている。 表層形¥t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音¥nまず、1行分取り出してみれば分かりやすい。1行を取り出すには、改行を示す「¥n」で区切ってやる。試しに次のようにしてみよう。 昨日の結果を使って、 >>> result = ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ¥n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’ 変数 result にまず対象の解析結果を入れておく(昨日のとおり、取り直してもいいが)。で、split は、その名の通り、スプリット(分割)するもので、result の文字列を、¥n を目印にして分割してくれる。 >>> klist = result.split(’¥n’) >>> print klist [’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー’, ’は¥t助詞,係助詞,*,*,*,*,は,ハ,ワ’, ’元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ’, ’だ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ’, ’。¥t記号,句点,*,*,*,*,。,。,。’, ’EOS’, ’’]うーん、よく見ると、[’1つ目の形態素’, ’2つ目の形態素’・・・]と分割してくれているのだが、パッと見た目でよく分からないかもしれないな。ということで、次のようにしてみる。 >>> klist[0] ’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー’>>> klist[1] ’は¥t助詞,係助詞,*,*,*,*,は,ハ,ワ’カッコの中に数字を入れると、リスト列の中からn番目の要素を取り出すことができる。注意すべきは、0から始まるということ。まあ、これはお決まりなのでそういうものだと思っていればいい。 さて、これを1行ずつ扱うにはどうしたらよいか。 「for 取り出したものに対する変数名 in 取り出しもと」の構文を使えばいい。この場合、klist には複数の要素が含まれているので、その中のものを使って(in klist)、変数k を使ってアクセスしますよということ。もう少し言い換えると変数 k に対して(for k)、klist の中の要素(in klist) を次々に適用しますよということになる。 >>> for i in [0, 1, 2, 3]: print i 0123変数 i に対して(for i) [0, 1, 2, 3] に含まれる要素(in [0, 1, 2, 3]) を次々に適用しますよと。これと同じようにしてみると、 >>> for gyou in klist: print gyou 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョーは 助詞,係助詞,*,*,*,*,は,ハ,ワ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOSあれ、もとに戻っちゃったみたいに見えるな(笑)。でも1つにつながった文字列を扱いやすいようにちゃんと分割しているので、気にしないように。で、さらに、1行の中をも少し区切ってみる。次は、タブ(¥t )で区切ってみよう。つまり、前のは、print を使って改行ごとに行を取り出して表示してしまったけれど、今度は表示しないで各行(gyou)に対してsplit(’¥t’) を使って行を分割してやる。 >>> for gyou in klist: for wakachi in gyou.split(’¥t’): print wakachi 分かち書きにした結果が各行の先頭にタブで区切られて入っているので、次のようになる。 今日名詞,副詞可能,*,*,*,*,今日,キョウ,キョーは助詞,係助詞,*,*,*,*,は,ハ,ワ元気名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。記号,句点,*,*,*,*,。,。,。EOSまだ、もう少し、区切ってやらないといけないな。長くなってしまったので、あとは明日にしよう。
2002.12.21
コメント(0)
しまった。気が付いたら、昨日一日、ずれたところに書き込んでしまっていた。今日の日記は昨日の日記なのだ。『千と千尋の神隠し』を繰り返し見た。やっぱり、この作品はよくできている。何度でも繰り返し見られる。繰り返し見ても飽きがこない。子供は気に入ったものを繰り返し見るもんだと思う。だから、飽きがこないというのは大切なことなのだ。私がときおり、実家に帰ったときに、母に言われるのがこんなことだ。「xxは、小さいころ『エルマーと16匹の竜』がお気に入りで、何度読んであげても、読み終わるともう一回、もう一回って、何度読んでも、もう一回って言って聞かなかった」と。子供は親にとっては残酷なぐらい、お話を繰り返してもらいたがるんだろう。最近の親は、DVD でも見せておけばいいのだから楽なものだ。『千と千尋の神隠し』の中では、これまでの宮崎作品の中で使われていたモチーフがふんだんに洗練された形で使われている。『未来少年コナン』で使われたものも、『風の谷のナウシカ』で使われたものも、『となりのトトロ』で使われたものも、『魔女の宅急便』で使われたものも、『もののけ姫』『紅の豚』『天空の城ラピュタ』『ルパン三世 カリオストロの城』・・・。今までの作品の中で使われたモチーフがすごく洗練されて使われているのが感じられる。これって、結局、宮崎監督だけでなくて、そこで作品を作るのに加わっている人たちの話でもあるのだけれど、何度も何度も使うことによって、描き方も、流れも、どんどん洗練されていくものがあるのだな。例えば、お腐り神のように思われた川の主なんかは、ドロドロの部分の描き方が、『風の谷のナウシカ』の巨神兵でも使っているのを洗練させていった感じだし、自転車のハンドルを引き抜く場面は、やっぱりナウシカのオウムに刺さった槍を引き抜こうとしている場面に重なる。お腐り神+竜(ハク)/隠された背景としての現実の自然とオウム/腐海の対比。ニカーッと笑う、あの特徴的な笑いは『未来少年コナン』のころから、いや、『アルプスの少女ハイジ』とかの時代からなのかな。足の先から頭の先までビーンとなって髪の毛が逆立ち、目が真ん丸くなるような顔も、やっぱり何度も何度も繰り返されて洗練されてきている。空の描き方も、海の波も、髪の毛の風になびくところも、動作に合わせて動く、服のシワや揺れも、人の表情も肌も。いろーんな要素が洗練されてきているのだな。何度も何度も繰り返されることによって、作っている人が、みんなプロフェッショナルになっているからこそという感じだろう。パターン化されているというより、洗練されているのだな。音楽のモチーフのように繰り返し繰り返し使うことによって洗練されて、より心地よく、その場に溶け込んだものにしていける技巧というものもあるものなのだと、つくづく思う。台詞とかもそうなのだな。「ありがとう」「ごめんさい」「いや」「ほしくない」とかいう言葉は、けっこう、大切にされている言葉だなと思う。「掟」と「掟破り」のモチーフとかも取り上げてみれば面白いだろう。繰り返されることによる洗練ってことが、重要に思えてくる。だんだんと単に消費されるのではない何ものかになっていく。ストーリー自体も、なるべく破綻をきたさないように気を払われている。物語の始まりは、「引っ越し」という、非日常からスタートさせる。これで、より自然な形で非日常の世界に入っていける。日常からスタートさせるのではなく、自然な形で非日常に入り込ませていくのだな。そして、山道とトンネル、草原を通して、さらに非現実の中に入り込ませていく。イニシエーションの儀式をしっかり積み重ねていくのだな。ストーリーの終わりも再び、草原、トンネル、山道へと非現実の世界から非日常の世界へと戻していく。実は、ストーリが終わった後に千尋が戻るところは、日常ではなく、非日常なのだな。つまり、引っ越しをして、新しい生活を始めるということになるのだから。このあたりも実は巧妙なところだと思う。ファンタジーの世界に引きずり込み、活力を与え、そして現実に戻っていくための生きる力を与えるような作品なのだな。で、とにかく思ったのは、非常に詳細に渡って神経が行き届いている作品だなということ。他の作品と比較しながら、あるいは単体でも、細かく語ろうと思えば、いくらでも語れるような要素がある。やっぱり、宮崎作品はよくできてるわ、と思う。とにかく、何度も見てしまったけれども、それでも買ってもいいかなと思えるものだ。それにしても、よくもまあ、これだけ子供の視点を大切にした作品を作れるものだと感心してしまう。でも、洗練されればされるほど、失われていくダイナミズムもあるかなぁと思う。あらっぽさと勢いの中でないとなかなか描かれないものもある。○MeCab を使う (Python で人工無能)今日は前ふりが長かったなー。まあいい。で昨日、MeCab をインストールしたので Python から使ってみることにする。あぁ、でも Windows のバイナリ版を落としてきても、Python から簡単に直接呼び出せないな・・・。ということで、ちょっと簡単な方法で MeCab を呼び出してみることにする。さて、どうするか。こんな風にしてみよう。>>> from popen2 import popen2>>> fi, fo = popen2(’"c:¥¥program files¥¥mecab¥¥bin¥¥mecab"’)>>> fo.write("今日は元気だ。")>>> fo.close()>>> result = fi.read()>>> fi.close()最初の行は、「import popen2」とだけしてもよいのだが、その場合は、モジュール名.関数名(popen2.popen2) と関数呼び出しをしなければいけないので面倒かつ長くなるので、次の行で popen2 だけで呼び出せるようにしたい。そこで from popen2 import popen2 としている。本当は、なぜモジュール名.関数名みたいに普通はするのに、この形式だとそうしなくて済むようになるかは、名前空間の話としてしないけないのだが、面倒なのでとりあえずやめておく。とにかく、こうすれば、popen2.popen2 としなくても popen2 だけでよい。で、入力用の出入り口になる変数(fi) と 出力用の出入り口になる変数(fo) を用意してあげて、Mecab のコマンドを呼び出してあげる。そうすると、コマンドプロンプトで実行したのと同じ状態に裏側でなるわけだ。そうしたらコマンドプロンプトで入力するのと同じように、ALT-半角/全角キーを押して、「今日は元気だ」というのを書き込みコマンドを使って(fo.write)、裏側で動いているコマンドプロンプトに送り込んでやる。fo という出入り口に書き込む(fo.write) が終わったら、この出入り口はもう要らないので閉じてやる(fo.close())。さて、これで結果が取り出せるようになる。fo.close() で閉じるのを忘れると、次の行でいったきりになってしまうので注意。で、result 結果を入れるための変数に、出力を取り出すための出入り口(fi) から読み込みを行う(fi.read())。そうしたら、この出入り口も閉じてやる(fi.close())さあ、これで形態素解析の結果が result に入ったので確認してみよう。>>> print result今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョーは 助詞,係助詞,*,*,*,*,は,ハ,ワ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキだ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ。 記号,句点,*,*,*,*,。,。,。EOSできているようだ。ちなみに、print を使わないと次のようになる。>>> result’今日¥t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー¥nは¥t助詞,係助詞,*,*,*,*,は,ハ,ワ¥n元気¥t名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ¥nだ¥t助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ\n。¥t記号,句点,*,*,*,*,。,。,。¥nEOS¥n’¥t はタブ、¥n は、前にも書いたように改行。さて、結果がとれたところで今日はおしまい。
2002.12.20
コメント(0)
MeCab (和布蕪) をダウンロードする (Python で人工無能)『千と千尋の神隠し』をとうとう見た。うーん、確かに絵はきれいでアニメーションとしてよくできているし(Adobe のサイト)、それなりに面白かったのだけど、宮崎駿監督のものとしては『風の谷のナウシカ』とか『もののけ姫』とかの系列の方が好きかな。でき問題ではなくて好みの問題として。でも、『千と千尋の神隠し』がすごくヒットしたのも分からんでもないとは思った(まったく否定する気はないのは言っておこう。でないと怖いものな。で、2回目はフランス語で見てみた。あぁ、これ意外にフランス語にして見ると、先入観が取っ払われて見られるので面白いかもしれない。それと、日本語で見ていると言葉がちゃんと聞こえてきてしまうのだけど、フランス語にすると言葉が音になって、むしろ視覚の面に集中できる。そうすると、絵がなぜか日本語で見ているときよりも生き生きと見えてきたりして不思議な感じがした。外国人になったみたいな気分で見ると、日本人にとっては普通の色がなんだか面白い色合いにも見えてくるのだ。ほんとにアニメーション(animate 生命を吹き込む)。DVD を持っている人は、だまされたと思って、フランス語で字幕にでもして見てみるといい。いつもながら、ホントにだまされるだけかもしれない(笑)。○MeCab (和布蕪) をダウンロードする (Python で人工無能)なぜか一気にこんなところに行ってしまうのであった。MeCab (和布蕪)とはを詳しくは読んでもらうにして、MeCab は形態素解析を行ってくれるプログラム。日本語の場合、英語やフランス語、ドイツ語などのように単語ごとにスペースが入っていないので、処理をするのが難しいので、単語単位にバラバラにするために、これを使うことにする。あと、品詞をつけてくれたり、動詞の原型をとったりするのにも便利なのだな。これまでの人工無能の場合、正規表現を使って言葉の活用を「笑う、笑います、笑えば、笑うとき、笑いましょう、笑わない」を適当に吸収するのが常套手段だったわけだけど(極端な話「笑」だけでマッチングしたりする。そうすると「笑う」の活用形に対してルールを作りたいのに「笑点」もマッチしてしまったりするので都合が悪い)、形態素解析の結果を使えば、もっと別の展開も考えられるというものなのだ。なお、正規表現に関しては、正規表現最新リンク2002で適当なものを見るべし。とゆうわけで、MeCab 本体をここからダウンロード(MeCabe0.7.exe) する。インストールは、exe ファイルをダブルクリックして、あとは説明にしたがってクリックしていけば簡単にインストールできる(例によって *NIX 方面の方は適当にやりやること)。インストールできたら、[スタート]-[すべてのプログラム]-[アクセサリ]-[コマンドプロンプト]で黒いコマンドラインの画面を表示する。そのままクリックだけでインストールすると、c:¥program files¥mecab にインストールされるので、「cd ¥program files¥mecabbin」とやって、mecab.exe があるところに移動して、「mecab -O wakati」と入力してリターン。そうしたら、「今日はとても天気がよいです。」とでも入力すると「今日 は とても 天気 が いい です 。」と単語をスペースでバラバラに区切ってくれる。ここでいったん、CTRL-C (コントロールキーを押しながら C を押す)で強制終了する。(ちなみに、コマンドプロンプトでの漢字入力は、Alt+半角/全角キー。このモードを抜けるときはさらに同じキーを入力する)。次に、何もオプションをつけずに「mecab」リターンとしてから、「今日はとても元気がいいですね。」と入力してリターン。すると、今日はとても元気がいいですね。今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョーは 助詞,係助詞,*,*,*,*,は,ハ,ワとても 副詞,助詞類接続,*,*,*,*,とても,トテモ,トテモ元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキが 助詞,格助詞,一般,*,*,*,が,ガ,ガいい 形容詞,自立,*,*,不変化型,基本形,いい,イイ,イイです 助動詞,*,*,*,特殊・デス,基本形,です,デス,デスね 助詞,終助詞,*,*,*,*,ね,ネ,ネ。 記号,句点,*,*,*,*,。,。,。EOSこんなふうに、単語を区切ってくれるだけでなく、品詞や変化形、読みなどをちゃんと返してくれるのだ。さて、これを使って今度どうするかというところが問題なわけだな。
2002.12.19
コメント(0)
全268件 (268件中 201-250件目)