某日記

(中期)

平成17年3月14日(月曜日)

週末

金曜。一回休み。

ジャンク / ゆみみ」を読んで寝た。 表題作の名前の由来が未だによくわからない俺。

土曜。ドトールでマターリ。セビリアあたりに常駐。 アゾレス諸島まで行って戻ってきた。

二重奏 / 高上 優里子」を読んで寝た。

日曜。 西ヨーロッパにも飽きてきたのでロンドンに戻ったら、 「ジブラルタルに万景峰号が現われたから討伐を手伝え」と言われて萎え。 舞い戻って倒したら「とりあえずロンドンに戻ろう」と言われてさらに萎え。 頭にきたので無視してイタリア東岸のほうまで足を伸ばした。 が、ヘルシンキで受けたトリポリの古代ローマ遺跡発見クエストで大赤字。 おまけに海賊にフクロにされて交易品出血大サービス。踏んだり蹴ったりである。

伊賀ずきん(3) / たなか のか」を読んで寝た。 乙女チック忍者伊賀ずきん F の出生の秘密が。 由美かおるも真っ青な入浴シーンもあるよ。

君を殺して僕も死ぬ!

声の違和感とかエロゲオーディションとかはどうでもいい。 彼は本当に 14 歳なのか。つまり問題はその一点だけなのだ。

平成17年3月15日(火曜日)

昨日

引き続き地中海で引きこもり。 ハドリアヌスだったか誰だったかその辺の人の騎馬像をジェノバで発掘。 アフリカ北部とパルマ近辺、 そしてマラッカ海峡(マレーシア)に近づかなければ海賊の心配はない。

レッツバリボー / 小坂 理恵」を読んで寝た。

平成17年3月16日(水曜日)

昨日

ロンドンに戻ったら「実は不審船じゃなかった」と言われたので 事の真相を探りにアムステルダムへ。フラグを立てたら敵の船が現れたが、 逃げるのが精一杯のところでとてもじゃないが測量士の手には負えない。 故にイベントはペンディング。 海事系ジョブの人をつかまえてパーティを組めってことだろうな。

セキホクジャーナル(1) / 小坂 理絵」を読んで寝た。

何故

何故あなたはフリーソフトを作るの? 。 今、例の 1/3 うんぬんという話についてもうちょっと冷静な頭で考えてみると、 3 つのうちの 2 つはハックそのもののモチベーションというよりは、 ハックをを公開するモチベーションなんすよね。

じゃあハックそのものを行うモチベーションは何かと考えてみると、 私の場合 1/2 が暇つぶし、1/3 が好奇心、 1/6 が実用上の関心というあたりですかね。

ところで、わたしゃこのところ、 取り立ててフリーソフトウェアってものを書いてない。 理由? もちろん忙しいから。本業が忙しいのかって? 別にそうでもない。 本業に忙しくなかったら暇だろうって言う人があるかもしれないが、 それは実に浅はかな考えというもので、 世の中そんなに暇々している暇人というのは逆に珍しい。 人間というものは仕事が忙しいか、そうでなかったら暇つぶしに忙しいものだ。

興味あるすべての暇つぶし行為を余すことなく (こな)すことが困難なほどに暇つぶしに忙しいのは困ったもので、 体がいくつあっても足りやしない。 仕事なんてのは多くの場合は要領の問題なのであって、 要領しだいで体を増やすまでもないことがほとんどだが、 暇つぶしというのはそういうわけにはいかない。 そういう状態になると、 各暇つぶし行為の間に優先順位をつけねばならなくなるので、 自然と興味の薄い暇つぶしは後回しになる。 もっとも、暇つぶしというのは仕事と違って必ずしも万偏無く つぶし切らないといけないという性質のものではないから、 「後回し」というのは「一顧だにしない」と同義だったりするわけ。 そして幸か不幸か、私の場合、 そんな後回しなものを十把ひとからげに納めておく行李の中に、 現時点でフリーソフトウェアというものが入っている。

いずれにしろ、 元来ハックとかフリーソフトウェアというのはそういう性質のものなのだが、 変に真面目くさって「何故あなたはフリーソフトを作るの?」とか訊かれると、 なかなか「暇だから」とは答えにくい。 そこでいろいろともっともらしい理屈をつけているうちに、 何故かそのもっともらしい理由のほうが、 あたかも本当の理由であるかのようににすり変わってしまうという 現象が観測されたりするんじゃないのかしらん。

ゴルゴ

昨日某所で「例の話をゴルゴ 13 がネタにするのはいつだろう」 とかそんな話に。ご存じのかたはご存じだと思うが、 ゴルゴ 13 は割と政界財界の旬のネタを取り上げることが多い。

某月某日、大手テレビ局サクラテレビの筆頭株主である東京ラジオの株が、 一夜にしてベンチャー起業家の手に大量に渡った。 資本の逆転状態と株式取引の穴を逆手に取った奇襲だった。 日本の財界マスコミ界に激震が走った。

困ったのはサクラテレビの乃木久典社長だ。彼は事の解決をゴルゴに依頼する。 その起業家斯波利真を始末して欲しいという内容のものだ。

もちろん殺されたと分かっては真っ先に疑われるのはサクラテレビだ。 そこで、あくまでも事故のように見せかけることが必要になる。 ゴルゴは斯波の会社のある六本木の下見に行く。

下見が終わり、六本木の裏路地のバーに入るゴルゴ。 そのバーには酒をあびるように飲んでクダを巻く一人の女が。 その女は酔った勢いで隣のヤクザに絡んでしまう。 そしてヤクザに殴られそうになるところをゴルゴに助けられ、 そのままホテルに。 その女は、サクラテレビの番組で過去の自分の犯罪歴について うっかり口を滑らせてしまい、芸能界から干されたタレント御涅田タカ子だった。 タカ子は実は乃木の元愛人で、 干されるように仕向けたのも乃木であることを告白した。

タカ子と一夜を過ごした翌日、ゴルゴは行動を起こし、 斯波のビルの向かいに陣取る。ゴルゴはビルの前で 缶コーヒーのデモンストレーションをやっていることに目をつけていた。 斯波が回転ドアから歩いて出てくるところを見はからって デモ用に積まれた缶の一つを狙撃、それが斯波の足の下に滑りこむ。 斯波はバランスを崩し、後ろへ倒れる。 そして回転ドアが斯波の首を挟む。 回転ドアの安全装置はあらかじめゴルゴが細工していたため止まらない。 南無。

しかしその犯行の現場をタカ子に目撃されてしまう。 ゴルゴはタカ子を消すが、 その際タカ子は最後の願いとして乃木の殺害を依頼する。

邪魔者が消えてサクラテレビの社長室で高笑いをする乃木社長。 しかしそこに一発の銃弾が飛びこむ。

こんな感じで一つ(ぉ

ぐる

携帯電話とポータブルミュージックプレーヤーは競合しない

すべてのデバイスが終焉してしまうといったら、 やがては冷蔵庫でトースターを作ることになってしまう
そんなあなたに コレ!

携帯電話がミュージックプレイヤーに参入するのに障害はないが、 ミュージックプレイヤーが携帯電話に参入するのには大いなる障害が 立ちふさがっているという非対称性は、必ずしも無視できない気がする。

平成17年3月17日(木曜日)

昨日

イベントの方はうっちゃっておいて、ベルゲン近辺の調査。 戻るのが面倒くさかったので、 コペンハーゲンとリューベック数度往復でボロ儲け。 コペンハーゲンのあるシェラン島の西岸側ストア海峡は海賊がウヨウヨいるので、 シェラン島東岸にへばり付いてゆくとよい。 そうは言ってもバルト海、警戒スキル発動は怠れないし、気も抜けない。 20 万超えを目指してしばらくここに居ようかと思う。

征服魔呼ちゃん / みなづき ふたご」を読んで寝た。

ぐる

必要だから 。 まあ私みたいに必要だと思われないものほど 作りたくなる変な人間はあまりいないのかもしれぬ。 しかしながら、必要なものの 95% は既存のものの組み合わせで だいたい解決できてしまうので作るまでもないし、 残り 5% は諦めるという潔さを持ち合わせてしまうと、 必要に迫られて作ることもなくなってしまう罠。 そういう目的で何かを作るときは大抵、他人からお金を頂くケースになる。

漢字文献情報処理研究会 - 書籍と雑誌 。 この研究会の機関誌「漢字文献情報処理研究」のバックナンバー(3 号まで) が読める。

漢字同一視 。 「QX,QGREPの同一視検索機能用に作成した 新旧漢字・異体字・同義字・通字同一視指定ファイル」

平成17年3月18日(金曜日)

昨日

30 万ほど貯まったのでキャラベルに乗りかえ。 またスカンジナビアを発見するクエストを受けたところで沈没 (船ではなくて俺が)。 ヘルプ 。 おりを見てお願いするかもしれませんのでその時はよろしくです。 ちなみに AoiMoe@Euros でござる。

School Rumble(8) / 小林 尽」を読んで寝た。 最近中だるみ気味だったがこの巻は面白い。 でも、♯のほうはともかく♭のほうはイラネ。

ぐる

まあ 、 自分の立ち位置がちゃんと分かっていて建前を使っている分にはよいのでしょう。

少なくとも、どこぞでクソ真面目に論じられてるアレが、 「暇つぶしに忙しい」という文章と同じくらいに 滑稽であることに気づいている人は大丈夫(ぉ

N-gram の原理

暇だったので N-gram 法というものについて調べた。

N-gram をごく平板な日本語に直せば「N 文字」 みたいなニュアンスになる。この名のとおり、 N-gram というのは文字列を N 文字のサブストリングに分割したデータを指す。 たとえば、「私の名前は中野です」という言葉の 2-gram を求めると 「私の」「の名」「名前」「前は」「は中」「中野」「野で」「です」 というリストになる。

こういうデータにどんな意味があるかというと、 たとえばこの N-gram の各要素の登場回数の統計を取ることによって その文章の性質が分かったりする。文章の周波数成分を取り出すための フーリエ変換のようなものだと考えると良いかもしれない (イメージ的にはウォルシュ変換のほうがそれっぽいが)。 文法やセマンティックを一切無視するのでノイズも多いが、 一方で形態素分析のような誤認識は起こらない(データを見る人間の目が頼り)。

ところで、ある N についての N-gram は何通りあるのかを考えてみる。 これは単純に考えれば文字の種類数の N 乗の名前空間を構成する。 たとえば漢字カナ含めて 4000 種の文字が使われている日本語の文章が 生成しうる 10-gram は 4000 の 10 乗通りでこれは 10 の 35 乗を超える。 もっとも、長さ L 文字の文章から取り出しうる N-gram の数は高々 L-N+1 でしかないので、 工夫しだいでは L の整数倍のオーダーまでは小さくできる。

ある範囲の任意の N に対する N-gram を比較的効率良く取り出せるような データ構造を提案しているのが 「Makoto Nagao, Shinsuke Mori: A New Method of N-gram Statistics for Large Number of n and Automatic Extraction of Words and Phrases from Large Text Data of Japanese」という論文で (論文 PS ファイル)、 この方法では元の文章のバイト列を破壊することなく、 そのバイト列へのポインタのテーブルと、 ある種の差分情報のテーブルを用意することによって データサイズを小さくしている。

以下では「私は中野です。私は男です。」という文字列を例に取る。 まずこの文字列の文字数と同じ長さ 13 の配列 p を確保する。 配列 p の各要素は文字列の各文字を先頭から順番に指すように初期化する。 すると、見かけ上次のような配列が出来上がる:

p[0]  = "私は中野です。私は男です。"
p[1]  = "は中野です。私は男です。"
p[2]  = "中野です。私は男です。"
p[3]  = "野です。私は男です。"
p[4]  = "です。私は男です。"
p[5]  = "す。私は男です。"
p[6]  = "。私は男です。"
p[7]  = "私は男です。"
p[8]  = "は男です。"
p[9]  = "男です。"
p[10] = "です。"
p[11] = "す。"
p[12] = "。"
もちろん文字列の実体は同じものを参照しているとする。

次に、p の各要素をソートする。 文字列の本体をいじる必要はなくて単にポインタ操作だけで行うことができる。 たとえば JIS のコードポイントの単純な大小で 辞書的なソートをすると次のようになる:

 k   p[k]
-----------------------------------
 0:  "。"
 1:  "。私は男です。"
 2:  "す。"
 3:  "す。私は男です。"
 4:  "です。"
 5:  "です。私は男です。"
 6:  "は男です。"
 7:  "は中野です。私は男です。"
 8:  "私は男です。"
 9:  "私は中野です。私は男です。"
10:  "男です。"
11:  "中野です。私は男です。"
12:  "野です。私は男です。"
ちなみに、必要な N の最大値があらかじめ分かっているのならば、 ソートするときに先頭の N 文字を比較するだけでよい。

そして、やはり長さ 13 の別の配列 q を用意し、 すべての k について q[k] を p[k] と p[k+1] の最初の一致する文字数で 初期化する(q[12] は 0 --- いわゆる「番人」になる)。 これを p と並べて書くと次のようになる:

 k   p[k]                            q[k]    備考
-----------------------------------------------------------------
 0:  "。"                            1       "。" の 1 文字
 1:  "。私は男です。"                0
 2:  "す。"                          2       "す。" の 2 文字
 3:  "す。私は男です。"              0
 4:  "です。"                        3       "です。" の 3 文字
 5:  "です。私は男です。"            0
 6:  "は男です。"                    1       "は" の 1 文字
 7:  "は中野です。私は男です。"      0
 8:  "私は男です。"                  2       "私は" の 2 文字
 9:  "私は中野です。私は男です。"    0
10:  "男です。"                      0
11:  "中野です。私は男です。"        0
12:  "野です。私は男です。"          0
ここまでがファーストステージ。

このデータから実際に N-gram を取り出してみる。たとえば 2-gram を取り出すとする。これは次のとおり:


ちなみに必要なバイト数は (Wc + Wp + Wq) * L になる。 Wc は一文字のバイト数、Wp は p の各要素のバイト数、 Wq は q の各要素のバイト数、L は文書の文字数。 EUC-JP なら Wc は 2 、文書の長さが最大 4G 文字までなら Wp は 4、 1-gram から 255-gram までが必要なら Wq は 1 で、 結果 7*L バイトあればよい。

この方法のミソは、 最初にファーストステージのデータ構造を作っておけば 任意の N に対する N-gram についての統計情報や、 ある N-gram 要素が文書中で登場するすべての位置を簡単に 割り出せるということである。特に後者の性質は全文検索に向いている。

全文検索目的だったら q[k] は p[k] と p[k+1] ではなくて p[k-1] と p[k] にして、q の要素数は L+1 とし、q[0] と q[L] を番人にするという方法がいいかもしれない。 p の上で二分法を適用すると、 先頭を見つけるために逆方向に移動しないといけない可能性があるので。

平成17年3月19日(土曜日)

昨日

助けてもらってイベント進行。多謝。

ハチミツとクローバー(7) / 羽海野 チカ」を読んで寝た。

今日

引きこもり。

コペンハーゲンとリューベックを往復したらあっというまに貯金が 50 万に。 ロンドンの転職イベントとかこなした。

明日

夜から能登いってきます。 3/20 銀河で 3/21 大阪、サンダーバードで能登入り、 3/22 はくたか→新幹線というパターン。