更新日記
第一の次元は「データを見つけること」。第二の次元、「データの操作」。第三の次元、「理解」。第四の次元、「説明」。第五次元、「プランニング」。第六次元、「コミュニケーション」。まだある、第七次元、「統合」。
さて、これは、千夜千冊で偶々最初に見た本、ロジャー・C・シャンク著、長尾確、長尾加寿恵訳、「人はなぜ話すのか」知能と記憶のメカニズム、白揚社、1998年7月10日、第一版第二刷、373ページ、3200円、原題は"Tell me a story: A new look at real and artificial memory"、1990年の第8章「話と知性」にある。さらに次のステップがある。「好奇心」だ。機械は好奇心を持たない。好奇心を持つことは生きることだから・・・
少しずつ進めよう。メソッドと注を訳してみた。いずれ、自己組織化マップに関するページを作ってみたいが・・・・・
メソッド
--------
new AI::NeuralNet::SOM;
新しい空の自己組織化マップのオブジェクトを生成する。
$som->initialize($xdim, $ydim, $idim, $topology, $neighborhood, $init_type, $random_seed, \@data);
SOMオブジェクトを初期化する。マップの大きさ $xdim x $ydim をセットする。
入力データ・ベクトルは $idim と等しくなるようにセットする。 変数
$topology は ``rect'' か ``hexa'' のいずれか、$neighborhood は
``bubble'' か ``gaussian''のいずれかであることができる。SOMオブジェクト
の初期化型は ``linear'' か ``random'' のいずれかである。$random の種は負
でない整数である。\@data は初期化データを含む配列の参照である。
$som->train($train_length, $alpha, $radius, $alpha_type, \@data);
このメソッドは自己組織化マップを訓練する。 $train_length - いくらかの
訓練期間、$alpha - 学習度, $radius - 初期の訓練半径、訓練過程で1まで減少
する、$alpha_type は学習度減少関数の型をセットする。``linear'' か
``inverse_t'' であることができる。\@data は訓練データを含む配列の参照で
ある。
$som->qerror;
訓練マップの量子化エラーを返す。
($x, $y, $dist) = $som->winner(\@data);
マップされたデータ・ベクトル \@dataに関する ``勝った'' ニューロンを見
つけて、その座標 $x と $y と ニューロンと入力ベクトルの間のユークリッド
距離 $dist を返す。
$som->set_label($x, $y, $label);
座標 x と y を持つニューロンにラベルをセットする。
$som->clear_all_labels;
マップ上のすべてのラベルをクリアする。
$som->save(*FILE);
自己組織化マップをデスクリプタ *FILE で表されるファイルにセーブする。
これは *STDOUT であってもよい。参照ベクトルはASCII形式で保存される。登録
フォーマットは入力データ・ファイルで用いられるのと、データファイルの第一
行のオプション項目(トポロジ型、x、yの大きさと近傍型)が必須であることを除
いて、同じである。マップのファイルには、各々の登録についていくつかのラベ
ルを含むことができる。
一例: マップのファイル code.cod は、3 × 2 のマップ単位を持つ三次元ベ
クトルのマップを含む。
code.cod:
3 hexa 3 2 bubble
191.105 199.014 21.6269
215.389 156.693 63.8977
242.999 111.141 106.704
241.07 214.011 44.4638
231.183 140.824 67.8754
217.914 71.7228 90.2189
マップのx-座標(行数) n は 0 から 1(ここで n は マップの x 方向の長さ)、
y-座標(列数) m は 0 から 1(ここで m はマップの y 方向の長さ) の範囲にそ
れぞれあると考えることができる。マップの参照ベクトルは次の順序でマップの
ファイルに保存される。
1 The unit with coordinates (0; 0).
2 The unit with coordinates (1; 0).
...
n The unit with coordinates (n - 1; 0).
n + 1 The unit with coordinates (0; 1).
...
nm The last unit is the one with coordinates (n - 1; m - 1).
(0,0) - (1,0) - (2,0) - (3,0) (0,0) - (1,0) - (2,0) - (3,0)
| | | | \ / \ / \ / \
(0,1) - (1,1) - (2,1) - (3,1) (0,1) - (1,1) - (2,1) - (3,1)
| | | | / \ / \ / \ /
(0,2) - (1,2) - (2,2) - (3,2) (0,2) - (1,2) - (2,2) -(3,2)
Rectangular Hexagonal
上図には二つの可能な地勢学的構造中のユニットの位置が示される。マップ中
の二つのユニット間の距離は二次元マップの地勢学上のユークリッド距離として
計算される。
$som->load(*FILE);
デスクリプタ *FILE として表されるファイルから自己組織化マップをロード
する。
$som->umatrix;
存在するマップに関するU-matrix(unified distance matrix)を計算し、
U-matrixデータを含む配列への参照を返す。
U-matrixは近傍のマップ単位間の距離を表す一つの方法である。計算する仕事
はやや骨の折れる仕事だけれども、説明できる方法でマップを可視化するために
効果的に用いることができる。
U-matrixアルゴリズムは近傍のニューロン間の距離を計算し、使用するトポロ
ジ型に対応する格子(マトリックス)に蓄える。その格子から、(長方形の場合は
4、六角形の場合は6)各々のニューロン距離の値を選ぶことによって、可視像を
生成することができる。距離値は0と1の間の範囲の縮尺で決定付けられ、
U-matrixが可視化される時に色で表される。
例:
...
$umat = $som->umatrix;
for $j (0..$som->y_dim*2-2) {
for $i (0..$som->x_dim*2-2) {
print "$umat->[$j*($som->x_dim*2-1)+$i] ";
}
print "\n";
}
...
$som->x_dim;
マップのx方向の長さを返す。
$som->y_dim;
マップのy方向の長さを返す。
$som->i_dim;
入力ベクトルの大きさを返す。
$som->topology;
マップのトポロジを返す。
$som->neighborhood;
近傍関数の型を返す。
$som->map($x, $y, $z);
座標 $x と $y を持つニューロンのベクトルの $z 要素を返す。 0 < $z <= $som->i_dim
$som->label($x, $y);
座標 $x と $y を持つニューロンに対応するラベルを返す。
--------------------------------------------------------------------------------
注
欠落値を使う
マップを初期化し、訓練するためにデータ集合の欠落値を使用することができ
る。``X''の記号を欠落値を示すために使用することを勧めるが、この目的にど
んなアルファベット記号でも使うことができる。
この文書のいくつかの特定の部分はSOM_PAKのドキュメンテーションから取ら
れた。
http://www.cis.hut.fi/research/som-research/nnrc-programs.shtml
ヘルシンキ工科大学のニューラル・ネットワーク研究センターのページを調べると様々な文献が公開されている。素晴らしい時代になったものだ。インターネットのお陰で、昔なら大学の図書館でコピーするか、ないものは手紙を書いて送ってもらうように頼むしか手に入らない文献を容易に手に入れることができる。やる気さえあればいくらでも勉強できる。土日で200ページぐらいの文献をインクジェットプリンタで両面印刷しまくった。自然言語処理への自己組織化マップの応用については60ページ余りの総説をTimo Honkelaが書いている。これとSOMとLVQの取説を読めば大体のことはわかるだろう。VoischevのPerlモジュールの解説はSOMの取説の要約という感じ。感謝、感謝の日々・・・結局、KohonenのSelf-Organizing Mapsの本も購入することにした。第三版が出たばかりみたい・・・WEBSOMを調べてみると最近の動きがわかって大変おもしろいだろう。
Cマガ6月号の特集「人工知能を学ぼう!」にあった人工知能の定義は「人工知能とは、推論と学習機能をもった情報システム」である。回帰分析も一種の学習だとFAIの村田さんに教えてもらって、「なーるほど」と思ったのだが、データの入力が一種の学習になるというわけだ。データが変化すれば結果も変わる。そういう例えが妥当かどうかだが、おもしろい考え方ではある。そういう回帰分析にニューラル・ネットワークを応用することができる。
私の当面の関心事が分類の自動化にあるので、これまでいろいろと探してきたのだが、ようやくおもしろいものを見つけた。自己組織化マップ(Self-Organizing Map)というものだ。これを文書の分類に使うことができるらしい。自己組織化マップは1991年から1995年に、元ヘルシンキ工科大学のTeuvo Kohonenによって発表されたもので、SOMとLVQというパブリック・ドメインのソフトウェアにまとめられている。目端の利く人たちは既に文書解析のソフトウェアに応用してビジネスをしているらしいが、無論、フリーで配布されているソフトウェアもある。その一つがVoischev AlexanderによるPerlモジュールのAI::NeuralNet::SOMだ。CopyrightはVoischevにあるが、再配布・改変はPerlのライセンスと同様の条件下で自由である。ActivePerlのPPM3でインストールできる。インストールするとモジュールの解説はActivePerlのドキュメンテーションのHTMLに書き込まれて参照できるようになる。そのうち、Descriptionを訳出したので、参考までに載せておこう。久しぶりに長文を訳したので疲れた。年を取ったかな(^^;)
SOMの原理
自己組織化マップは、秩序化様式のデータ集合に近似するために、数付け参照
を置くベクトル量子化アルゴリズムあるいは高次元入力データ空間へのコードブッ
ク・ベクトルの結果を表現する。局所秩序関係が参照ベクトル間で定義される時、
後者の相対値は、近傍の値が「弾性表面」に沿って存在するかのように互いに依
存するようになる。自己組織化アルゴリズムの手法によって、この「表面」はデ
ータ点を通る参照ベクトルのある種の非線形回帰として定義されるようになる。
高次元データ空間R^nの、例えば二次元格子上へのマッピングはそれによってま
た定義される。そのようなマッピングは入力サンプルの距離的秩序関係を可視化
するために有効に用いることができる。実際には、マッピングは学習過程の漸近
状態として得られる。
この種のSOMの典型的な応用は、工程状態のような複雑な実験的ベクトルデー
タの解析である。そこではデータ要素はさらに高度な非線形様式で互いに関係付
けられる。
SOMは高次元入力データの確率密度関数の二次元表示への「非線形投影」と言っ
てもよい。R^nのxを入力データベクトルとしよう。それは、どの距離でもすべて
のmiと比較される。実際の応用では、通常、最小のユークリッド距離 ||x - mi||
が最適マッチングノードとして定義されるようになる。下付き文字cで意味され、
||x - mc|| = min{||x-mi||}; あるいは
c = arg min{||x - mi||}; (1)
かくして、xはパラメータ値miに関するノードc上にマップされる。
学習中、ある距離まで配列中で地形学上近接しているノードは同一の入力から
学習して互いに活性化する。数学的証明なしで、我々はmiの有用な値が次の学習
過程の収束境界として見出すことができることを述べる。この過程では、初期値
mi(0)は任意であることができる。例えば、ランダム、
mi(t + 1)=mi(t) + hci(t)[x(t) - mi(t)]; (2)
ここで、tは整数の不連続な時間座標、そしてhci(t)はいわゆる近傍殻(kernel)
である。それは格子点上で定義される関数である。通常、hci(t) = h(||rc -
ri||; t)、ここでR^2のrcとR^2のriはノードcとiの半径ベクトルであり、それぞ
れ配列にある。||rc - ri||が増加すると、hciは0に近づく。hciの平均的な幅と
形式はデータ点に合わせるために「弾性表面」の「硬さ」を定義する。特にxが
非常に高次元ならば、p(x)の正確な形式を描くことは通常望ましくないことに注
意しよう。xが意味のある量のサンプル値を持つ信号空間の次元と範囲が自動的
に見つけられることがより重要である。
このパッケージはhci(t)の定義に二つのオプションを含む。より簡単なほうは
ノードcの周りの配列点の近傍集合を参照する。このインデックス集合はNc(我々
は時間の関数としてNc = Nc(t)を定義できることに留意しよう)と示されるよう
にしよう。これによってNcにiがあるならhci = alpha(t)であり、Ncにiがないな
ら hci = 0である。ここで、alpha(t)はある単調に減少する時間の関数である
(0 < alpha(t) < 1)。この種の殻は「泡」というニックネームが付けられている。
なぜなら、横に結合されたニューラル・ネットワーク中の活動度の「泡」と関係
付けられるからである[Kohonen 1989]。もう一つの広く適用される近傍殻はガウ
ス関数の項で書くことができる。
hci = alpha(t) * exp(-(||rc - ri||^2)/(2 rad^2(t))); (3)
ここで、alpha(t)はもう一つのスカラー値「学習度」である。そしてパラメータ
rad(t)は殻の幅を定義する。後者は上記のNcの半径に対応する。alpha(t)と
rad(t)の両方はある単調に減少する関数であり、それらの正確な形はクリティカ
ルではない。それらはかくして線形に選択される。このパッケージではさらに
alpha(t) = A/(B + t)の型の関数を使うことが可能である。A、Bは定数である。
逆時間関数は理論的に、少なくとも大概は、いわゆる推計学的な近似理論によっ
て正当化される。よりバランスの取れた参照ベクトルの微調整を可能にするため
に、大きなマップと長いトレーニング・ランを持つ逆時間型関数の使用は勧める
価値がある。これらの関数とパラメータの効果的な選択はここまで実験的に決定
されただけである。そのようなデフォルトの定義がこのパッケージで使用された。
次の段階は、マップ上に異なる入力データ項目のイメージを位置づけるための
調整である。そのようなマップが意図する実際の応用においては通常、特定の入
力データ集合がどのように解釈されるのが適切かは日々のルーチンから自明かも
しれない。多数の典型的な手作業で解析されたデータ集合を入力し、方程式(1)
に従って最適のマッチがどこに横たわるかを見ることによって、マップあるいは
ノードの部分集合が、手作業の解析に従って「座標系」あるいは少なくともマッ
プ上の特徴的な参照点の集合の輪郭を描くようにラベル付けすることができる。
このマッピングはある仮説的な「弾性表面」に沿って連続であると仮定している
ので、不明データが内挿と外挿の手段によってこれらの調整された点に関してど
のように解析されるかは自明である。
IT eXpertさんからメールをいただいた。新しいコミュニケーション・システムの提案である。素晴らしいなあと思う。さっそく登録した。
たけ(tk)印の Ruby 日記のトップにリンクを張っていただいたのでお蔭様でアクセスが増えたみたい(^^)
小宮日記YukiWiki版はデザインがいい。カッコよく、読みやすい。人工知能も本格的になってきたね。我サイトもデザインも人工知能も考えたいのだが、うーん・・・まあ少しずつ・・・昨日帰り道がメガ経由に都合が良かったので、即道草。Cマガの特集が「学ぼう人工知能!」だったので今月はゲット(^^)それからCVSのデスクトップリファレンスとSoftwareDesign、ユニマガを目を瞑ってゲット・・・財布がまた軽くなった(^^;)アマゾンからスクリプト理論のシャンクの著書、「人はなぜ話すのか」-- 知能と記憶のメカニズム --がすぐ届いたし、日経Linuxも買ったばかりだ(^^;;;シャンクは最近は教育に力を入れているみたい。ノースウェスタン大学の学習科学研究所の所長だ。学習するのは人間じゃなくてコンピュータだったりして・・・小林雅一著、「グローバル・メディア産業の未来図---米マスコミの現場から」光文社文庫018、2001年12月20日初版、227ページ、700円も読んだばっかし・・・この本は現場報告として臨場感があり優れている。さて、メディアの行方は・・・すべてインターネットに統合するのがスマートな解と思うが、、、、、超ブロードバンドが前提だね。
このサイトもそれなりに少しは名が知れたみたいで、gooのdirectoryに登録されていた。そこからのアクセスがあるので気が付いたのだが、、、、、プログラミング言語の項の総合情報・ニュースやPerlではPerl6のページが、その他のプログラミング言語のその他にも入っていた(^^)ふーん。残念ながら人気ページのYARLは選外だった(^^;)Perl6のページにもう少し力を入れるか・・・
TSNETのTStcltkの部屋で始まった「Tcl/Tk日本語チーム」プロジェクト、いよいよSourceForge.JPで本格的に動き始めました。関心のある方は是非ご参画くださいませ。
まずはプロジェクトホームページにアクセスしてみてください。
K's Power Webのニュース・ディスカッション・サイトからこちらへリンクしていただいているが、AWKINGのアイデアを使われているためのようだ。
スクリプト言語はPerlとPythonだけじゃない(^^;)
まずはTcl、Google and TCLを紹介しておこう。
もち、Rubyもある。Ruby/Googleだ。
まとめて面倒を見ようというのが、SoapWare.Org。
artonさんのNETRubyは元々.net対応のRubyの試みだったのだが、今はC#によるRubyの実装に変貌している。.netのプログラミング言語としてはC#で十分というか、それが気に入ったのだそうだ。C#と言えば、対抗はJavaなわけだが、既にJRubyというJavaによる実装が開発されている。混沌としたプログラミング環境はいよいよ多様化している。最近思うのはJavaも実用になってきたということだ。PCの高性能化が後押ししているわけだけど、実際最近はJavaの実用的なアプリケーションに触る機会が増えてきた。これはインタープリタ主体のスクリプト言語でも本格的なアプリケーションを作れることを意味しているし、最早C/C++やDelphiを学ぶ必要もない?(^^;)のだ。もう一度Javaの本でもひっくり返してみるか・・・PnutsやJython辺りもおもしろいかも。
NHKの21世紀のパイオニアにリンクを張ってみようかとNHKのページに訪れると、随分ページの様子が変わっている。放送を補完する形でのインターネットの利用が進んでいるという印象だ。オンラインで現在の放送の情報が表示できる「Ch@ねっと」いうツールが出てくる。番組表も簡単に表示できるリモコンのスタイルだ。インターフェースとして統一感が不十分だが、放送が通信と融合するというのはこのような状態を指すのかもしれない。家庭内のメディアがPCを通じて統合される日は近いかもしれない。SONYのVAIOがホームサーバー/クライアント機能を強化しつつあるのは気になるところだ。テレビ・ビデオ・オーディオのサーバー用途が次のPC需要を生み出すことだろう。記録メディアもDVD-RAM/R/RWの混戦になるのか、テープが家庭用にも生き残るのか、、、、、テラバイト時代に向けて大変興味深い。
BSを見ていると、平野次郎の報告、「21世紀のパイオニア」はインド初代IT大臣プラモード・マハジャンの活躍を取り上げていた。ソフトウェア大国を目指すインドは1億が富裕層、3-4億が中間層、残りの5-6億はまだITの恩恵は受けていないそうだ。10億3千万の人口と聞いて驚いた。中国に匹敵する人口、人口抑制策を取る中国をいずれ上回るのは確実なのだろう。ITで国民を豊かにするのがプラモード・マハジャンの願いだ。しかし、私が覚えているインドの人口は5-6億だったが、現実とは確実に変化するものだと今更のように思った。日本の1980年代のバブルから1990年代の停滞への移行も確実な変化だ。21世紀、ITがどのように世界を変えるのか、その変化と経済的な効果を予測することは難しい。経済だけでなく各国の文化、コミュニケーションへの影響も大きなものになるだろう。言語への影響もあるかもしれない。英語のプレゼンテーションは否応なく増しているから、インドの強力な武器は英語でもあるのだが、米国のIT不況で、英語だけではビジネスが難しくなってるのはおもしろい。日本語専門のソフトウェア会社もあるぐらいだ。経済はグローバル化するが、言語こそが最後の境界になるのかもしれない。経済的には非関税障壁・・・
PythonCard/wxPythonの話題が転じて、use Perl;でPerlCardの話題になり、調べているとwxWindowsになり、wxPerlになり、wxBasicになった。wxBasicはBasicインタープリタでwxWindowsが組み込まれている。デモのwxminesは遊べる。まあ、Basicだからテキスト処理には向かないかもしれないが、古いコマンドラインのBasicしか知らない私には、GUIが扱えるのが大変おもしろい。使いこなすためにはwxWindowsを調べる必要がありそうだ。
最近、本屋で偶々手にした講談社現代新書1485、「知の編集術」(松岡正剛著、2000年1月20日第1刷、購入した本は第7刷だからまあ売れているね、260ページ、680円)、おもしろい。人間の知的活動は「編集」であるというコンセプトで貫かれた本である。こういう本は下手をするとワンパターンになってしまうが、なんと編集技法は64種類もある、ふぅーん、よくやるじゃんという感じになって、なるほどなるほどと読み終えてしまった。こういうのをPCにやらせてみたいのだけど、どうかな、Awking ProjectもWebの自動編集の試み、もう少し高度なものを考えないと・・・松岡正剛さんのISIS立紙篇のサイトは読み甲斐のあるサイト、二三日読み耽ってしまった。千夜千冊から一冊注文済み、読んだら感想を書こう。
MacのHyperCardというアプリケーションはPCの初期には有名で是非使ってみたいと思っていたが、残念ながらこれまで機会がなかった。PyJUGのニュースを読んでいると、PythonCard 0.6.6がリリース、HyperCardの操作性を実現しようとするGUIツールキットとあるのでこれはおもしろそうと試してみた。環境として必要なwxPythonもインストールする。これはPythonでは有名なGUI環境だ。PythonCardのサンプルをいくつか動かしてみた。うーむ、思った以上に素晴らしい。スクリプト言語によるパーソナルコンピューティングの基盤となる可能性があると思わせるぐらいインパクトがある。MySQLなどのデータベースのブラウザ等、充実した豊富なサンプルがあるだけでなく、日本語のインライン入力、表示など何も問題がない(日本語フォントを考慮した表示位置などの工夫は必要のようだ)。すごいなと思ったのは切り貼りや右クリックが使え、Windows同様の操作性をサポートしたGUI環境ということだ。PythonにはPySol、Alice、Zope等本格的なアプリケーションが多いが、さらにPythonを魅力的にするツールが加わったことを喜びたい。ここ数年パーソナルコンピューティング環境の充実には目覚しいものがある。良い時代になったものだ。なお、PythonCardのsamplesフォルダにあるsamples.pyというランチャではサンプルを起動できない場合があると思う。Pythonを空白を含むフォルダ名を持つフォルダにインストールしている場合だ。この問題は作者のコメントがスクリプト中にあり、検討中のようだ。
えーっと、ActivePerlのサイトからppmでGoogleSearchモジュールをインストールできないみたい。PythonではActivePythonを使っていないとpyPPMが使えないのでpyGoogleをインストールできない。という方のために、・・・・・自分のことだったりして(^^;)
めずらしくPythonのスクリプト・サンプルGoogleSearch.pyを・・・・・
使い方は、 python GoogleSearch.py search_string[Enter]
import sys
import google
data = google.doGoogleSearch(sys.argv[1])
i = 1
for result in data.results:
print "Result", i, "of", len(data.results)
print " URL: ", result.URL
print " title: ", result.title
print " summary: ", result.summary
print " snippet: ",result.snippet
print " cachedSize:", result.cachedSize
print " relatedInformationPresent: ", result.relatedInformationPresent
print " hostName: ", result.hostName
print " directoryCategory:fullViewableName: ", result.directoryCategory['fullViewableName']
print " directoryCategory:specialEncoding: ", result.directoryCategory['specialEncoding']
print " directoryTitle: ", result.directoryTitle
i = i + 1
書き忘れかけたけど、Googleで登録してライセンスキーをもらわないと使えない。google.pyではスクリプト中に書いてセットしたり、環境変数に書き込んでおいたり、キーを書いたファイルを設定できる。
TS Networkのニュースにも書いたが、重要なのでこちらにも転載しておこう。
-----
Develop Your Own Applications Using Googleを読んでみましょう。ここには新しい脈動、アイデアがあります。
SOAPを使ってGoogleの検索エンジンを使うWebサービスが提供されます。SOAPを使ったパーソナルユースのアプリケーションは初めてのような気がしますね。Googleが配布する開発キットにはGoogleSearch用のWSDL(Web Service Definition Language)ファイルが用意され、JavaやC#を使ったサンプルも同梱されています。Webサービスの具体的な仕組みを勉強する格好の材料になるでしょう。
スクリプト言語のユーザーならこちらもチェックしてみましょう。
Google Search for Perl and Python
-----
既にuse Perl;で話(ActiveState Releases Module for Searching Google)は出ていたので、気になっていたのだが・・・ようやく調べてみた。
さて、連休も残り僅か(^^;)ですが、本サイトも本格的に動き出して2年が経過しました。昨年の一周年の日記を読むとアクセス数が6000余りとあるので、この1年間は10000を越えるアクセスをいただいたということになる。1.5倍の伸びですね(^^)インターネットの普及には目覚しいものがあり、これをどのように活用するかがパーソナルコンピューティングの今後の課題であり、楽しみであるように思います。20年以上前のPC8001の時代に比べると隔世の感があります。フリーで使えるプログラミング言語は多種多様であり、極めて高機能なものです。商用のものと比べても引けを取らない。誰もがコンピューティングを創造的なものにできる時代がやってきています。単にExcelやWordで表を作ったり文書を作成するだけでは宝の持ち腐れです(^^;)是非プログラミングに取り組みましょう。その時、スクリプト言語はあなたをフランクに受け入れてくれるでしょう。
昨年末から50名程度の関係者でTS Networkについて議論し、メンバーのサイトを結んでスクリプト言語とテキスト処理に関するネットワークを作ろうとスタートしましたが、既に閑舎さんとZazelさんの御蔭でTSNETが動いています。続いて、中島さんの力添えもありTS Networkのサーバーもようやく動き始めました。TSNETには各スクリプト言語の関係者の方も数多く参加していただいています。掛け持ちも多いので大変とは思いますが、引き続きよろしくご支援ください。
最新の話題としては、Tcl/Tkの部屋の山本さんの発案で、Tcl/Tk日本語チームプロジェクトがSourceForge.JPに発足。関係文書の和訳、日本語環境改善のための開発を行います。Pythonについては既にPyJUGのほうでpython-doc-jpのメーリングリストが立ち上げられ、やはりSourceForge.JPにサーバーを移して同様の開発を進められるようです。私もpython-doc-jpの購読も始めたところ。
さて、本サイトではいよいよコンピューティングの究極、人工知能製作のための予備実験を進めていこう(^^;)と考えておりますぞ。これはAWKING Projectの延長線上にある大プロジェクトに育てようと(^^;;、無い知恵を振り絞って進めていきます。まずはチューリングマシンの機能を満たすように、問いに答えるための知識を蓄積するデータベースを作ることになりそうです。MySQLをXPにインストールしてと・・・(^^;;;すべて部品は揃っているって(^^)
Squishdot/Zopeで構築したBBSではテーマごとにアイコンが表示される。このアイコンを準備するのに結構手間取ってしまった。Tcl/Tkのアイコンは制約なくフリーの使用が認められているのでそのまま使えばよいが、オライリーの例のらくだのマークは制限が多く(本サイトでも使用しているが)、Python PoweredのアイコンもPythonのサイトにリンクすることが義務付けられているので、目的の使い方が不可能である。use Perl;のアイコンはおまえのサイトに貼り付けろとPerl Mongersのサイトに書いてあるのでそれに従って使わせてもらうことにした(^^;)多少向こうの意図とはずれるが、私のPerl関係のニュース・ソースのほとんどが、use.perl.orgだからね(^^;)RubyはRubyちゃんのリンク更新の連絡もいただいたこともあるしということで、Rubyちゃんにした。やはりコミュニケーションを大切に(^^)それから最後に、へびのアイコンを素材サイトを訪ねて幾千里、ようやくPythonのイメージに合うアイコンを見つけた。なかなかいいじゃないと、悦に入っている、、、、、、グリーンワッフルクロスのあずゆさんによれば、素材屋をオープンしたときからあるものだそうだ。怖くなく、適当なレベルでかわいくも見えるし、賢そうにも見える(^^;)
TS Networkは私のDTIのサイトに載せていたが、いつまでも静的なコンテンツばかりではおもしろくない。ページをスクリプトで自動生成するにしても私だけが作成に関与している「TS Networkのために」と本質的に変わらないからだ。TS Networkと銘打つからにはメンバーとのコラボレーションができる仕組みを持つことと、利用者とインタラクティブなコンテンツを作り出すことが目的となるのでサーバーを開設することが必要だった。サーバーとしては既にTSNETが動いており、100名以上の参加者を得て、スクリプト言語やXML等の各種テーマについてWeb+メーリングリストのシステムで議論が進められている。TS Networkサーバーにおいてはニュースをメインにおいて広報活動を中心に行い、より広範囲にコミュニケーションを発展させていきたい。当面、TS NetworkにおいてはSquishdot/Zopeで構築したBBSを中心にして活動していく。
get_mynews.plに注目してくださる方もおられるので、いい加減なままではちょっとね(^^;)ということで改訂した。各ニュースサイトのHTMLの書き方も時折変わるのでそれに合わせて書き換えていく必要がある。また、いい加減な取り敢えず動くレベルのパターンマッチング(^^;)だと思わぬ形で意図していない抽出が行われてしまう。XMLが普及していない現段階では正規表現によるパターンマッチングによる抽出に頼らざるを得ないし、これこそがテキスト処理であるということもできる。HTMLでも規則的に書いてもらえれば簡単なんだが、部分部分で書き方が変わったりするので困る。ニュースサイトなら自動的にHTMLを生成しているのじゃないかと思うんだが、、、、、意外と手書きだったり・・・・・
use LWP::Simple;
use Net::FTP;
require 'jcode.pl';
# Setup your configuration. <-- この部分は自分に合わせて設定してください。
$ftpsite = '';
$ftpaccount = '';
$ftppassword = '';
$yourdir = '';
$newsfile = 'mynews.html';
($scriptfilename = $0) =~ s/^([^.]+)\.pl$/$1/i;
$| = 1;
while(<DATA>){
chomp;
($site,$target)=split(/\t+/,$_);
print "Accessing to $target.....\n";
if($site =~ /Linux World/){
$sitedata{"$site\t$target"} = "<br>\n";
@lines = split(/\n/, (get $target));
foreach $line (@lines){
if($line =~ /^<!-- ▼======▼ 中面開始 ▼======▼ -->$/){
$insw = 1;next;
}elsif($line =~ /^<!-- ▲======▲ 中面終了 ▲======▲ -->$/){
$insw = 0;next;
}
if($insw == 1){
if($line =~ s/^(<a href=")(back)/$1http:\/\/www.idg.co.jp\/lw\/$2/){
$linksw = 1;
}elsif($line =~ /<!-- \*+ NEWS/){
$line .= "<br><I>Linux News</I>: ";
}elsif($line =~ /<!-- \*+ 連載/){
$line .= "<br><I>連載</I>: ";
}elsif($line =~ /<!-- \*+ SPECIAL/){
$line .= "<br><I>SPECIAL REPORT</I>: ";
}elsif($line =~ s|<font class="topdate">(\d{1,2}/\d{1,2})</font>(<br>)|$1$2|i){
;
}elsif($line =~ /^<img/){
next;
}elsif($line =~ /<a href="[^b]/i){
next;
}
if($line !~ /</){
if($linksw == 1){
$line = $line . "</a>\n";
$linksw = 0;
}else{
$line = $line . "<br>\n";
}
}
$sitedata{"$site\t$target"} .= $line;
}
}
}elsif($site =~ /ZDNN:AnchorDesk/){
$body = (get $target);
if($body =~ m|(\d{4}年\d{1,2}月\d{1,2}日 \d{2}:\d{2} .M 更新)|s){
$sitedata{"$site\t$target"} .= "<P>$1</P>\n";
}
if(@newslist = ($body =~ m|<p><a href="[^\n]+\n*[^\n]+<br clear="all"></p>|gis)){
$newspattern = "/news/";
foreach $news (@newslist){
if($news =~ s|($newspattern)|http://www.zdnet.co.jp$1|gis){
$sitedata{"$site\t$target"} .= $news . "\n";
}
}
}
}elsif($site =~ /CNET/){
@lines = split(/\n/, (get $target));
$sitedata{"$site\t$target"} = "<ul>\n";
foreach $line (@lines){
if($line =~ /\d{4}年\s+\d{1,2}月\s+\d{1,2}日\s+.+曜日/){
$count++;
if($count == 2){
$sitedata{"$site\t$target"} .= "</ul>\n";
last;
}
}
if($count == 1){
$line =~ s|(<a href=")(/[^>]+>)|$1http://japan.cnet.com$2|i;
$sitedata{"$site\t$target"} .= "$line\n";
}
}
}elsif($site =~ /BizTech/){
$sitedata{"$site\t$target"} = "<BR>\n";
@lines = split(/\n/, (get $target));
foreach $line (@lines){
jcode::convert(\$line, 'sjis');
if($line =~ m|<!-- ▼▼▼▼▼NEWS\(\w+\)挿入▼▼▼▼▼ -->|){
$insw = 1;
}elsif($line =~ m|\d{2}月\d{2}日 \d{2}時\d{2}分|){
$sitedata{"$site\t$target"} .= "<I>ニュース</I><br>$line<BR>\n";
}elsif($line =~ /<!-- ▼▼▼▼▼(日|専)/){
$insw = 0;
}
if($insw == 1){
if($line =~ s|(<a href=")(/[^>]+>)|$1http://biztech.nikkeibp.co.jp$2|i){
$sitedata{"$site\t$target"} .= "$line\n";
}elsif($line =~ /(<a href=")(http:[^>]+>)/i){
$sitedata{"$site\t$target"} .= "$line\n";
}
}
}
}
undef @lines;
}
open(OUT,"> $newsfile");
print OUT <<EOB;
<HTML>
<HEAD>
<TITLE>My News</TITLE>
<META HTTP-EQUIV="Content-Type" content="text/html; charset="Shift_JIS">
<style type="text/css">
<!--
BODY{background:#FFFFF0}
.title{font-size:16pt;color:#336666;font-weight:bold}
.item{font-size:14pt;color:#FFFFFF;font-weight:bold;background:#FF9900;text-indent:15px}
.content{font-size:12pt;color:#336666;font-weight:bold}
.header{font-size:12pt;color:#CC0000;font-weight:bold;text-indent:5px}
.footer{font-size:10pt;color:#336666;font-weight:bold}
//-->
</style>
</HEAD>
<BODY>
<div class="title">My News</div>
EOB
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$thisday = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday];
$thismonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon];
print OUT "<div class=\"header\">Last updated : $hour:$min:$sec $thismonth $mday ($thisday) ", $year+1900,"\n</div>\n";
foreach $key (keys %sitedata){
($site, $target) = split('\t', $key);
print OUT "<P><div class=\"item\">Source:$site <A HREF=\"$target\">$target</A></div>\n$sitedata{$key}\n";
}
print OUT <<"EOE";
<HR>
<div class=\"footer\">
This table is generated by <A HREF=\"${scriptfilename}.html\">$0</A><BR>
This HTML is transported by Net::FTP module.<BR>
<I><A HREF=\"index.html\">TS Network</A></I>
\ <FONT COLOR=\"ORANGERED\">\>\></FONT>
</div>
</BODY>
</HTML>
EOE
close(OUT);
print "Connecting to $ftpsite ...\n";
$ftp = Net::FTP->new($ftpsite);
print "Just login ...\n";
$ftp->login($ftpaccount, $ftppassword);
print "Moving to $yourdir ...\n";
$ftp->cwd($yourdir);
print "Changing to ascii mode ...\n";
$ftp->ascii();
print "Transporting $newsfile ...\n";
$ftp->put($newsfile, $newsfile);
$ftp->quit();
print "FTP finished.\n";
__END__
Linux World Online http://www.idg.co.jp/lw/index.html
ZDNN:AnchorDesk http://www.zdnet.co.jp/news/anchordesk/index.html
CNET Japan Tech News: US CNET発 http://japan.cnet.com/News/us.html
BizTech ニュース Top News http://biztech.nikkeibp.co.jp/biztech/topics.shtml