全26件 (26件中 1-26件目)
1
あぁ、今日で2月も終わりか。あいかわらずさえないな。時間ばかりどんどんたってしまう。生産性最悪最低が続くな・・・。○ 記憶と再生その10 (Pythonで人工無能)だらだらと 10 日目に突入してしまった。次回からは題名変えよう。昨日は Gadfly を動かしてみたが、実際にデータはどこへ行ったのだろうか。ということで、ファイルを開いてみる。C:\GadflyDB のディレクトリにデータを保存することにしたので、そこにどんなファイルができているかを見てみる。そうすると、データベース名に gfd という拡張子がついたファイル TestDic.gfd と、テーブル名に grl という拡張子がついたファイル TEST.grl ができているのを確認できた。うむ、Gadfly の場合、指定したディレクトリにベタにデータベースのファイルが格納されることになるので、データベースごとにディレクトリを作ってやる必要があるのだな。Zope から Gadfly を使う場合も同じなので予想はしていたが。ということで、これは今後気をつけることにしよう。で、ファイルをテキストエディタで開いてみると、バイナリ形式のファイルになっているようだ。TestDic.gfd には、CreateTable とか、ColumnDef とか、VARCHAR などといった文字が見えるので、このファイルに定義の類が入っていることが想像できる。TEST.grl の方も見てみると、やっぱりバイナリ形式のファイルになっていて、0001, test1, 0002, test2 といった文字が見つかることから、データはテーブルごとに、テーブル名のファイルに格納されると想像できる。もっとも Gadfly のソースコードでちゃんと確認すればいいのだけど、とりあえず面倒なので、まあそうなっているのだろうですませる。オープンソースのいいところは、ソースが見たいときはみればいいし、見たいと思わないときは見なくていいということだ(笑)。だいたい、よっぽど何か知りたいとか、改造したいとか思ったときぐらいしか実はソースは見ない。だから進歩ないんだよな(^^;;とりあえず、昨日保存したデータを Gadfly を使ってプログラム上から確認してみることにする。# Gadfly を使えるようにモジュールをインポートする。import gadfly## もう一度、同じディレクトリを指定。DBDIR = "C:\\GadflyDB"# Gadfly への接続用にオブジェクトを作成し、# connection という変数に代入する。# 作成の時は、ここは gadfly.gadfly() としておいて# その後、connection.startup("testdic", DBDataDir)# と初期化してあげていたが、初期化が必要なのは1回だけ。# 次回の接続からは次のように、gadfly のオブジェクトを# 作成するときに、指定してやる。# というか、ここでまた初期化してしまうとデータが消えて# しまうので、よくよく注意すること。# ここは fool proof になるように、既存のデータベースが# あるときに初期化しようとしたらエラーを出すとか改造しようかな・・・connection = gadfly.gadfly("testdic", DBDIR)# カーソルオブジェクトを作成し、# cursor という変数に代入する。cursor = connection.cursor()# test テーブルにあるデータをすべて選択する(select)cursor.execute("select * from TEST")# cursor が示しているポイントから、# データをすべて取り出して(fetchall)、# 変数 x に代入してすべての取り出した行に対して操作を行う。for x in cursor.fetchall(): # つまり、その行(x) を表示する。 print xという感じで、接続の仕方が違うだけで、あとは昨日と同じ。で、基本的な使い方がわかったので、いよいよ明日以降で、IPADIC を読み込んでみることにする。さて、Gadfly はどの程度のパフォーマンスを見せてくれるのだろうか、楽しみ。PostgreSQL や MySQL とか使ってもいいのだけど、データベースのプロセス雨後かしっぱなしになるので、けっこうじゃまくさいのね。Gadfly だったら必要なときに必要なプログラムを起動したときだけ使うことができるから、まっとうに動くんであれば、Gadfly を使っちゃいたいわけ。インストールも簡単だし。あと、ちょっと興味ある機能もあるのだけど、それはそのうちに。うむ、そういえば、日本語の問題はどうかなとかあるな。一応、昨日ちょこっと動かした範囲では大丈夫だったけど。Zope では EUC の環境しか試したことないので、SJIS でちゃんと動くかどうか、実はよくわかっていない(^^;; 最悪、EUC-JP で動かして・・・、入出力で文字変換入れるから、無用に遅くなって嫌なのだけど。
2003.02.28
コメント(0)
2003年4月7日、鉄腕アトムの誕生日にはどれくらい、それにちなんだ催しが開かれるのだろう。いろんな会社がこれにあわせてロボットの展示や発表をするんだろうか。前にも書いたかもしれないが、やっぱりロボット産業は、日本の21世紀を担う産業になるだろうな。でもって、ロボットがたくさんの人の職を奪うことも事実。数百万円で買えるロボットであれば、人間を雇うよりよいよね、という職業がたくさんあるから。実際のところ人型でないロボットというのは、いたるところにあるわけだし。自動販売機みたいなものから、自動券売機、自動改札機、駐車場のゲートなんか、昔は人がやっていたようなものが、どんどんロボットに置き換わっている。工場だってそうだし。おもしろいのは、自動化されているようで自動化されず人がやっていることもたくさんあることかな。オートメーション化されて作られていると思えるようなものが、実は人間がやっていたりとか。今のところ、同じことをするのであれば、人間の方がはるかに柔軟性に富み、また、コスト的に安いというものがたくさんあるが、ロボットが高機能で柔軟になり、価格が下がったときには、いろんな仕事が人間からロボットにまた置き換わっていくだろう。そうすると、だんだんと単純労働ができなくなってしまう。これは、単純労働に向いている人にとってはつらいことだ。そうすると、職業をもっと多様化していかなければならないわけだけど、まだ、十分な多様化した職業がない。だいたい職自体が足りないのだから・・・。スーパーのレジなんかは、200年たたないうちに、人間からロボットに変わるんじゃないだろうか(というか、一種のセルフで済むようになる)。そうすると、ますます広い意味での娯楽産業を発展させていかないとならないだろう。大学なんかも、一種の娯楽産業に位置づけてもいいだろう。知的生産レベルの娯楽から、無為の娯楽まで、幅広い娯楽が必要とされるし、また貧富の差がよけいに広がっていくから、なんとか金持ちが喜んで浪費する仕組みも作らないといけない(笑)。金持ちから搾取せよと。税金ではなく楽しく使って頂けるようにね。○ 記憶と再生その9 (Pythonで人工無能)一昨日、Python の簡易 RDBMS である Gadfly をインストールしたが、一つ忘れていたことがある。gadfly-1.0.0\kjbuckets に Windows 用のバイナリが入っていた。ということで 2.2 の下にある kjbuckets.pyd を C:\python22jp\lib\site-packages に放り込む。これで kjbukets が C で書かれたものを使うようになるので高速化される。ちなみに、pyd の拡張子がついたものは、python 用にコンパイルされた C や C++ などで書かれてコンパイルされた拡張モジュール。端的に言えば、DLL 。で、とりあえず、準備ができたので、ちょっと使い始めてみることにする。ちなみに ここに日本語訳があった。一般には実用性がないと言われる Gadfly だが、最新のバージョンは、新しく書き直されたもので、限られた用途で使用する分には実用に耐えるようなものになっているのではないかと思う(これから試してみないとわからないけどね)。a simple in-memory SQL implementation like Gadfly may be useful for serious work. と書かれている。このトーンが昔に比べて変わっているのだ。昔は、どちらかといえば、実験的な実装だから本格的に使うには別の RDBMS を使ってねというトーンがもっと強かったような気がする。Gadfly のメインモジュールは、Python DB-SIG で議論された Greg Stein の Python Database API に、まだ、全部をちゃんと実装しているわけではないが忠実に従おうとしている。データベースへのアクセスは1プロセスのみが行える方式で、複数のクライアントが同時にアクセスするような利用方法はできないが、一応、Gadfly サーバプロセスを動かしておいて、これと通信する形であれば、データベースにアクセスするのは1つのプロセスだけということになるので、複数のプロセスからアクセスさせることも可能になるようだ。とはいえ、負荷が高いような場合はつらいみたいだけど。で、python を起動したら、次のようにしてみる。# とりあえず、 DB を C:\\GadflyDB というディレクトリに# 保存することにする。もし、このディレクトリが存在しない# 場合には、ディレクトリを作成し、作成できない場合は# 終了することにする。DBDataDir = "C:\\GadflyDB"import osif not os.path.isdir(DBDataDir): try: os.mkdir(DBDataDir) except: print "ディレクトリが作成できません。" os.exit# Gadfly を使えるようにモジュールをインポートする。import gadfly# Gadfly への接続用にオブジェクトを作成し、# connection という変数に代入する。connection = gadfly.gadfly()# DBDIR (C:\GadflyDB)にある# TestDic というデータベースの使用を開始する。# もし、存在しない場合は、勝手に新規に作成される。connection.startup("testdic", DBDataDir)# カーソルオブジェクトを作成し、# cursor という変数に代入する。cursor = connection.cursor()# test という名前の table を作成(create)する。# フィールドは、id (整数型の id と、可変長文字列(varchar) の namecursor.execute("create table TEST (id integer, name varchar)")# test テーブルにデータを挿入(insert)する# 挿入するフィールドは、id と name で、値はそれぞれ 1 と ’テスト’print "(1, ’test1’) と (2, ’test2’) を挿入します。"cursor.execute("insert into TEST (id, name) values (1, ’test1’)")cursor.execute("insert into TEST (id, name) values (2, ’test2’)")# test テーブルにあるデータをすべて選択する(select)cursor.execute("select * from TEST")# cursor が示しているポイントから、# データをすべて取り出して(fetchall)、# 変数 x に代入してすべての取り出した行に対して操作を行う。print "\n挿入後に取り出したデータ"for x in cursor.fetchall(): # つまり、その行(x) を表示する。 print x# この接続で実行された操作をコミットする。# 操作結果を実際に DB に反映するには commit しなければならない。#print "\nトランザクションをコミットします。"connection.commit()# 今度は、id が 1 のレコード(つまり、今挿入した行) を更新する。# 変更後の name には ’変更済み’ という値を設定する。print "\n id が 1 の行を ’changed’ に変更します。"cursor.execute("update TEST set name=’changed’ where id = 1")# test テーブルにあるデータをすべて選択するcursor.execute("select * from TEST")# cursor が示しているポイントから、# データをすべて取り出して(fetchall)、# 変数 x に代入してすべての取り出した行に対して操作を行う。print "\n変更後に取り出したデータ"for x in cursor.fetchall(): print x# カーソルの内容を表示するprint "\nカーソルの内容"print cursor.pp()# トランザクションがちゃんとサポートしているところが# ポイントなのだ。いったんテーブルに操作を加えたあと# でもコミット(捜査結果を反映させる)前であれば、# 前のコミットまでさかのぼって、テーブル内容を元に# 戻すことができる。すばらしい。本格的なのだ。connection.rollback()print "\nトランザクションを中断して、前にコミットした時点に戻ります。"# test テーブルにあるデータをすべて選択するcursor.execute("select * from TEST")# カーソルの内容を表示するprint "\nカーソルの内容"print cursor.pp()connection.close()print "\nデータベースを閉じます"どうやら一応、使えるみたいな感じだな。出力結果は次のようになる。(1, ’test1’) と (2, ’test2’) を挿入します。挿入後に取り出したデータ(’0001’, ’test1’)(’0002’, ’test2’)トランザクションをコミットします。 id が 1 の行を ’changed’ に変更します。変更後に取り出したデータ(’0001’, ’test1’)(’0002’, ’test2’)カーソルの内容ID | NAME ============0001 | test10002 | test2トランザクションを中断して、前にコミットした時点に戻ります。カーソルの内容ID | NAME ============0001 | test10002 | test2データベースを閉じます
2003.02.27
コメント(0)
ちょっといいことと、ちょっと悪いことがあった日だった。詳細省略。○ 記憶と再生その8 (Pythonで人工無能)かなりしつこいこのシリーズなのだ。今日は、"GadflyB5: SQL Relational Database in Python":http://gadfly.sourceforge.net/ を見てみる。Gadfly は Python 用の SQL Relational Database の一つで、アプリケーションサーバ Zope についてくるので Zope ユーザにはおなじみのもの。でも、これは何も Zope で使わなければいけないというものでもなくて、単体でもちゃんと動くので試してみるのだ。MySQL とか PostgreSQL とか高速でよいフリーの RDBMS があるのに(これらも Python から使える)、あえて Gadfly を使うのはなぜかと言えば、あんまり意味はない。以前、ちょっと試しに使ってみたことはあるが、まともな用途の RDBMS として使うのには向いていないと一般に言われているので、Gadfly をあえて覚える必要もあるまいと思って、ちょこっと動かしてやめてしまったから。でも、これを機会にちょっとどの程度使いものになるのか見てみようかなという単純な理由。"とりあえずまずここからダウンロード Gadfly 1.0.0.tar.gz":https://sourceforge.net/project/showfiles.php?group_id=662 する。うっ、いやな予感。まあいいや。とにかくダウンロードしたら、ファイルを解凍し、解凍したディレクトリに DOS プロンプト上で移動する(work にファイルを解凍したとする)。C:\> CD \workC:\work\gadfly-1.0.0>python run_testsnot running kjbuckets C module test..................................................................----------------------------------------------------------------------Ran 66 tests in 22.552sOKkjbuckets C module が RedHat 用のバイナリしかついていないようなので、動かないのでパスするが、それ以外に 66 のテストが行われて 22.552 秒で終了。で、test ディレクトリの中にあるソースを見れば、どういう風に使うかという例にもなってしまうが、これはとりあえず脇においておく。テストが OK のようなので、実際にインストールしてみる。C:\work\gadfly-1.0.0>python setup.py installとすると、c:\python22jp\Lib\site-packages\gadfly にモジュールがインストールされる。今日はここまで。
2003.02.25
コメント(0)
このところ、日記に濃い内容を書きすぎて疲れた(笑)。次は ZODB を使ってあれこれしようと思っていたが、あまりに疲れるので、ちょっと休憩して、別のところを進めることにした。で、次は何をというと、形態素解析用の辞書を鍛えたり観察するのに便利なように、MeCab の辞書(dic.csv)を RDBMS にぶち込んでしまおうかと思う。ぜんぜん軽くなってない。まあいいや (^^;; 人名だけ取り出して表示したりだとかしたいのね。IPADIC って「カールスモーキー石井」だとか、「ラサール石井」だとか「ビートたけし」や「グレート義太夫」もあるし。でも「ビートきよし」はないと(笑)。でも「グラン浜田」とか載ってないし、「獣神サンダーライガー」なんて載ってないのだ。「ジャイアント馬場」や「アントニオ猪木」でさえない。プロレスラーには冷たいのね。こうゆう中途半端になるやつって(人を指しているのではなく、時代によって入れ替わりが激しい芸能人など)を登録するかどうかってのは難しいところがあるかもしれない。経済 ケイザイ 経済 名詞-一般学 ガク 学 名詞-接尾-一般みたいな学問は、「xx」「学」と一般になるのかと思いきや、「哲学」「地学」みたいなものは、一語になる。こういうのはまさに処理の都合という登録なのだろうな。xxx 理論はに関しても「相対性理論」は一語になる。有名じゃない理論は「xx」「理論」となるわけだし。でも、特殊/相対性理論と一般/相対性理論は一語にはなっていない。ふーむ。特殊/相対性/理論、一般/相対性/理論となっていた方が、登録されていないものとのバランスがとれるんだけどな。ということで、grep なんかで探してもいいのだが、あえて python から、このへんをマイニングできるようにしてみようかなと。
2003.02.23
コメント(0)
『WebDAV入門』(ISBN4-88309-220-8) を読んだ。けっこう誰でも読めるような感じの読み物風になっていて、それでいてよくわからないノリがある。入門向けにはちょうどよいかもしれない。ジャストシステムは出版部を持っているのだな。○ 記憶と再生その7 (Pythonで人工無能)まだまだしつこく続く。このシリーズ。うーん。だって奥が深いんだものね。といいつつ最初から、ここが到達点という ZODB にやっときた。昨日 pickle を使ったときに、読み込みと書き込みが独立した感じになっていて、やっぱり保存と読み込みを意識しなければいけないような感じで、ちょっとスマートじゃないなという感じだった。実は。それに、これっていちいちメモリ上に全部読み込んじゃってるんじゃないの?ってことはデータが大きくなれば、それを全部読み込んじゃ、はき出してと繰り返しになったら、とんでもないし、開きっぱなしでどんどん書き込んで、途中で保存する前に落ちてしまったら、ぜんぶ結果が消えてしまって、やっぱりスマートじゃない。# 書き込み時>>> p = pickle.Pickler(open(’pickledata’, ’w’))>>> p.dump(dic)# 読み込み時>>> u = pickle.Unpickler(open(’pickledata’, ’r’))>>> dic = u.load()てなことで、やっぱり ZODB にチャレンジということになる。まず基本として、Zope Corporation の Jim Fulton 氏の Introduction to the Zope Object Database と A.M. Kuchling氏の ZODB & ZEO Introduction を起点として ZODB について見ていくことにした。まずはざーっと流し読み。終わり。ZODB のアーキテクチャは、次のようなレイヤを持つようだ。でもって、上位のレイヤはマルチスレッドだけれども、トランザクションをしっかり管理していて、実際に DB にアクセスできるのは1つのスレッドだけになるように作られている。オブジェクトはスレッドごとに持ち、トランザクションでコミットする時点でコンフリクトが発生していれば ConflictError を返すような感じ。でもって、非常に頻繁に書き込みが行われるようなアプリケーションでは、ちょっと弱いところがあるみたい。つうか、RDBMS でアプリケーションを作ったとしても、コンフリクトは発生するわけだし、まあ、トランザクションが長ければ長いほど、コンフリクトが発生しがちになるし、しょうがないな。+--------------------+| App +-----------|| +-----|Transaction|+--|-+ +-----------+| DB | Connection |+--------------------+| Storage Interface |+--------------------+んと、このへんは、やっぱりRDBMS の方がトランザクションがしっかりしていて、ロールバックもしっかりしているし、ReadOnly のアクセスや DirtyRead の類をきっちり意図的にできるから RDBMS の方が問題がなさそうに思えるだけで、本質的には変わらない共通の問題はあるような気がする。Zope なんかで変なことが起こるとしたら、トランザクションを通常気にせずにアプリケーションを作っている人たちが作ったものが原因じゃないかと思う。ああいうものでなく、きっちりすべて自分でトランザクションを意識して制御できるようなアプリケーションであれば、それほど信頼性が低いというような感じではない。RDBMS は、いわゆる表の形になるものについては効率的に扱うことができるが、そうではない場合は面倒になる。で、ZODB は Zope Object Database っていうぐらいだからオブジェクトを格納するのに適しているはずだな。で、まあとりあえず、Sourceforge のZODB and ZEO に行って、ZODB3 をダウンロードしようと思ったが、Windows の環境でやろうと思うので、コンパイルするのが面倒だし Download ZODB3-3.2a1.win32-py2.2.exe (676550 bytes)をダウンロードすることにした。インストールはダブルクリックでちょいちょいでインストール完了。C:> pythonPython 2.2.2(SJIS enhanced) (#37, Oct 15 2002, 15:30:03) [MSC 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import ZODBimport ZODB で読み込むと、カラカラからと、読み込んで(2,3数秒かかった)。で、上記ページのサンプルを動かしてみようと思ったが、ZODB が変わったせいか動かせない・・・。うーむ、やられた。ということで今日はここまで。
2003.02.22
コメント(0)
三菱電機、言葉の関連性を学習する概念抽出型文書知識サーバーを開発 (japaninternet.com) の記事を読む。このところ、この手の自然言語処理を使った製品があれこれ出てくるようになってきた。自然言語処理の製品のピークはたぶん2007年~2010年あたりになると思うので、ボチボチとそこそこのものが出てきているのかもしれない。何を根拠に 2007年~2010年かといわれると、まあ、あんまり根拠はないが、開発サイクルを考えるとそういうもんでしょと思うわけ。1990年代にかなり実用の基礎となりそうな研究が出ているので、それが商品サイクルに乗ってくるのに10年程度かかると。で、とりあえず上記の記事を読んでいて「レンディションフリー文書解析技術」というところに目がとまった。本題じゃないところね。要するに文字認識の話なんだろうが、この分野はかなりのレベルに達しているのかな。類義語辞書を自動作成っていうのもおもしろい。「ピッチ」と「PHS」と「ケータイ」と「低料金」が関連語になるのか。ふーん。で、結局どうすんだろうな。膨大な情報を。分類できればそれはそれで役に立つんだろうが、そこからいかに役立つ情報を引っ張り出すか。その方が感心があるな。Google の場合、リンクの関連から重要性を判断するということになるが、たとえば自治体などで資料の重要性をどう判断するか。んー、重要文書って書いてあるやつ。丸秘って書いてあるやつ。そういうのがいわゆるページランクの高いものに相当すると。で周辺の文書があるし、書類があると。お役所用の Google って感じね。いや、お役所だけでなく、会社の書類とかも同じことだろう。あと、プレスリリースの位置づけとか考慮して。うむ、そうやって考えてみると、Google のように巨大なインターネットを相手にしたものから、今度は企業レベルに検索技術が落ちていくということだな。で、その後は個人のレベルと。個人のレベルもそうやって考えてみると見えてくるわな。3~5年でかなり実用的なものが作れるだろう。ふーむ。なるほどね。もっとも、個人の生活がそこに追従してくるのにはもっと時間がかかるだろうな。ちなみに、記事にはぜんぜんそんなところまで書いてなくて、製品の紹介だけ。『銀河英雄伝説』の DVD が届いたが、PS2 が意地悪して DVD を再生してくれないので見ることができない。CD-ROM で音楽は OK だし、ゲームもできるし、って確認するためにゲームしちゃったじゃん。よけいなことを・・・。○ 記憶と再生 その6(Python で人工無能)さて、けっこうくどくど続いているこの記憶と再生だが、まだ続くぞ。今日こそは pickle なのだ。そういえば、近所に食料雑貨が売っている店があって、ピクルスが何種類もおいてあるんだよな。小さいのから大きいのまで。あと、一般的なキュウリだけじゃなくて、ブロッコリーとかも入っているやつがある。なかなかうまいのだけど、やっぱりキュウリの酢漬けにしたやつが一番好きだ。と書いていると、また今日も力尽きて本題にたどり着けなくなるのでいかん。pickle には、Python で書かれた pickle と C で書かれた cPickle の2種類がある。で、単純に考えれば、Python で書かれた pickle より C で書かれた cPickle の方が早い。ただし、長所と短所が同居している。だからこそ、Python 版の方も残っている。ウェブアプリケーションサーバの Zope を作っている Jim Fulton が cPickle は書いたらしい。Zope の ZODB というオブジェクト指向のデータベースは、要するに cPickle の化けもんということになるんだろうな。むちゃな・・・。で、dbm のときに話を出したが、キーになれるのが dbm でも gdbm でも bsddb でも、文字列だけであると。文字列ということは、シリアライズ(直列化、あるいは真っ平らにフラットニング)しないといけないということなのだな。で、このシリアライズが pickle にする=ピクル化の基本になるようだ。で、シリアライズしたものを元に戻すのが非ピクル化と。酢漬けにした場合は、どう洗っても元に戻らないのだけど、Python オブジェクトの場合は、漬け物にしても、ちゃんとその後、元に戻せるので便利なわけだ。このpickle化する処理に使われるのが Pickle というオブジェクトと、Unpickler というオブジェクト。端的に言えば、漬け物作成器というところなのかな。ピクルスが作りたければ、オブジェクトを Pickler に入れてやれば、ぽんと出てくる。いったん漬け物にしてしまったオブジェクトも Unpickler にいれてやれば元にもどる。構文は、Pickler(file [, bin]) 。つまり、Pickler(f) とすれば、Pickler オブジェクトが一つ作成される。入れ物を指定して、漬け物器をつくるということだな。で、p = Pickler(f) で、漬け物器を変数に割り当てておけばよいと。bin を指定した場合にはバイナリファイルになる。テキストファイルよりバイナリファイルの方が効率はよいが、テキストファイルになっていれば、あとでファイルをエディタで開いて強引に修正することもできるし(笑)、とりあえず、テキストファイルにしておこう。で、注意は、file のところはファイル名ではなくて、ファイルオブジェクトじゃなきゃいけないので、あらかじめ f = open(’pickledata’, ’w’) としてファイルオブジェクトを開く必要がある。で、pickle 化したものを取り出すには、Unpickler を作成してやると。構文は、Unpickler(file) で、テキストかバイナリかは指定する必要がない。勝手にファイル形式から判断してくれる。使うときには u = Unpickler(f) とすれば漬け物からの取り出し器ができあがる。でやっぱり、f = open(’pickledata’, ’r’) でファイルを開いておく必要がある。とりあえず使ってみることにする。# まず pickle モジュールを読み込んで使えるようにする。>>> import pickle# ファイルを書き込み用にファイルオブジェクトを作る。f = open(’pickledata’, ’w’)# Pickler オブジェクトを生成する。# 作るときは、ピクル・ピクラーとおまじない>>> p = pickle.Pickler(f)# 試しに入れるためのデータを作るために、前に作ったクラスを# また使い回す(笑)>>> class testdic: 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(’僕’)# 両方とも「私」が返る# 作った test用辞書クラスのインスタンスを保存>>> p.dump(dic)# ファイルを閉じる>>> f.close()ふむ、簡単だ。ファイルをテキストエディタで開いてみる。そうすると、次のような感じでテキストファイルに判読可能な形で記憶されているのが確認できる。(i__main__testdicp0(dp1S’dic’p2(dp3S’僕’p4S’私’p5sS’俺’p6S’私’p7ssb.いったん、環境を閉じてオブジェクトが消えてしまった状態にしてから、もう一度 python を起動してから、今度は読み込んでみよう。# まず pickle モジュールを読み込んで使えるようにする。>>> import pickle# ファイルを読み込み用にファイルオブジェクトを作る。>>> f = open(’pickledata’, ’r’)# 読み込み用は、ピクル・アンピクラーのおまじない>>> u = pickle.Unpickler(f)# アンピクラーを使ってファイルから酢漬けのオブジェクトを取り出す>>> dic = u.load()File "c:python22jplibpickle.py", line 824, in find_class klass = getattr(mod, name)AttributeError: ’module’ object has no attribute ’testdic’うむうむ。ここで問題発生。クラスの定義自体は保存されていないから、取り出すことができないのだ。しょうがない、クラスの定義を再度してみよう。いや、データファイルを開いたときにわかっていたでしょうに(笑)。# いったんファイルを閉じておく>>> f.close()# クラスを定義>>> class testdic: def __init__(self): self.dic = {} def setValue(self, key, val): self.dic[key] = val def getValue(self, key): return self.dic[key]ファイルを開いて、#>>> f = open(’pickledata’, ’r’)# 読み込み用は、ピクル・アンピクラーのおまじない>>> u = pickle.Unpickler(f)# としておいてから、再度アンピクルに挑戦。>>> dic = u.load()# 今度は成功するので試してみる>>> dic.getValue(’俺’)’私’>>> dic.getValue(’僕’)’私’めでたし、めでたしなのであった。pickle の場合、クラスインスタンスを保存はできるけれど、クラス定義そのものは保存されない。これは、実は非常に便利といえば便利なことなのだ。クラス定義とインスタンスのデータが分離できるということだから。クラス定義を変更しても、データは影響を受けないわけ。属性を増やしたとしても、読み込むときにデータが読み込まれないだけだし、メソッドを追加したとしてもまったく問題はない。削除しちゃったときはそれはそれでまた打つ手があるということだし。で、非常に便利に使えそうだということがこれでわかった。だが、dump と load という点において、ほとんど同じようなことをこの数日してるわけで、進歩がないといえば進歩がないという話もあるという・・・。まあ、それはそれでよいのだ。pickle はもっと奥が深いが、とりあえずこの辺にしておこう。
2003.02.21
コメント(0)
○ 記憶と再生 その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)
全26件 (26件中 1-26件目)
1

![]()
