« 2007年02月 | メイン | 2007年04月 »

2007年03月 アーカイブ

2007年03月01日

赤坂見附ランチ事情?

サイボウズ・ラボに入社してちょうど一ヶ月。
ラボにもだいぶなじめてきました(よね?)し、社内向けにはいくつかちらほらアウトプットを出せるようになってきましたが、まだ社外に向けてのアウトプットが出来ていないのが目下の課題。
3月は手始め的ちょっとしたものでもいいから、外へのアウトプットをするのが目標。はてさて。
とりあえず個人blogの方になりますが、PlaceEngine を使ったマッシュアップ小ネタを近々公開できる見込みです。

「毎週通ってもいい!」というランチのお店があればblogに書いちゃおう~と思い、「ラボ周辺」のカテゴリーを用意して、せっせと毎日違うお店にランチしに行っているんですが、まだ「こ、これわっっ!」というお店には出会えません……
まあまだ一ヶ月ですし、お店の数はもう本当にうなるほどあるので、気長に探します。

2007年03月15日

キーワード抽出モジュール Lingua::JA::Summarize を使うコツ

いわゆる「Web2.0」っぽい要素である「タグ」。
一般にはタグ付けは手動で行うわけですが、自然言語テキストへのタグ付け(キーワード抽出)を自動で行うことができれば、あれこれと可能性が広がって楽しそう……しかし、それは実現が難しかったり高コストだったりして、簡単に手を出せる解はあまりありません。

ラボの奥さんの作成したキーワード抽出モジュール Lingua::JA::Summarize は次の特徴を持っています。
  • 動作要件の敷居が低い
  • 辞書のメンテナンスをしなくても、未知語や熟語もある程度抽出してくれる
  • 希望の結果に近づけるためのチューニングが可能
本モジュールを使って、サイボウズ・ラボ内での情報交換を行っている社内掲示板をスレッド単位で解析しているのですが、辞書を一切チューニングしていない状態でも「しょこたん☆ぶろぐ」や「猫かぶり隊隊員ニャンコ達」などの特徴的なキーワードが抽出されます(いったい何の情報交換をしてるんだか (^_^;))。

そういったコストパフォーマンスのいいキーワード抽出モジュールなんですが、あまり使われている様子がなくもったいない。 そこでQ&A式で使い方やコツをご紹介します。
  • Q1: Lingua::JA::Summarize を使うには何が必要?
  • Q2:実際にキーワード抽出を行うサンプルコードある?
  • Q3:「こと」とか「とき」といった不要な単語がキーワードとして抽出されてしまうんだけど……
  • Q4:文字コードに UTF-8, Shift_JIS, ... を使いたい
  • Q5:出てきて欲しいキーワードがどうしても出てこないんだけど……
なお、動作原理その他に興味のある方は、奥さんのブログの下記エントリーなどを参照してください。

続きを読む "キーワード抽出モジュール Lingua::JA::Summarize を使うコツ" »

2007年03月22日

Mash Up Award 2nd で PlaceEngine 賞

これは個人の blog の方に書かせていただいた内容なのですが、 Sun と RECRUIT が中心となって開催された Mash Up Award 2nd にて、中谷の作った作品が PlaceEngine 賞をいただいてしまいました。
細かいことは繰り返しになってしまうので、もしご興味あれば http://d.hatena.ne.jp/n_shuyo/20070321/mashup を参照してやってください。

で、昨日授賞式があって参加してきたのですが、想像していた以上に受賞者&関係者の方が多くて、ごく一部の方としかお話しできなかったというに、あっという間に名刺売り切れ……。
名刺をお渡しできなかったけれど、中谷を探してここにたどり着いた方がもしもいらっしゃったらば、 nakatani at labs.cybozu.co.jp にご連絡してやってくださいまし。あいすいませんが、よろしくお願いします。

2007年03月26日

Javascript で既存関数にエラー処理を追加 (Shibuya.es #3)

Shibuya.es、じゃなかった、Shibuya.es #3 行ってきました。
デブサミでの Shibuya.* はやっぱり場所柄からか少々おしとやかやってんなあ……

どの話もおもしろかったんですが、nazoking さんの "WiiでSAGOOL" が個人的にプチツボだったので、ちょっぴり検証してみました。
一般化すると「元のソースをできるだけ汚染しないで、関数にエラー処理を追加する」ということですから、いわゆるアスペクト指向うんぬんが得意としている領域ですよね。
確か nazoking さんの方法は(以下、記憶で書いているので間違ってたらすいません)、エラー処理を行うラッパーを用意し、関数呼び出しをそのラッパー経由で行うよう、呼び出し側を自動的に書き換えるというもの。
これにより外部参照しているスクリプトについては書き換えることなくエラー処理が追加される。一方 html 内に記述されているスクリプト、特に onClick などのイベントに直書きされているものについては手動で書き換える必要あり。

この「直書きされていると書き換える必要あり」をなんとかしたいかも。
定義されている関数全てに自動的にエラー処理を追加する方法はちと思いつかなかったんですが、関数名を指定して狙い打ちならなんとかなりそう。
<html><head>
<script type='text/javascript'><!--
function push_button(message) {
    alert(message);
    aaa();
}

function Test(){}
Test.prototype.push_button2 = function(message){
    alert(message);
    bbb();
}
var test = new Test();
--></script>
</head><body>
<input type='button' value='おして' onClick='javascript:push_button("クリックしました");' />
<input type='button' value='おして2' onClick='javascript:test.push_button2("クリックしました2");' />
</body></html>
こんな html を書いて「おして」や「おして2」をクリックしても単純にエラーになりますが、</head> の前に下記を追加すると、エラーがダイアログで表示されるようになりました。ばんざい。
<script type='text/javascript'><!--
// 指定された関数にエラー処理を追加する。
// オブジェクトに定義されている関数の場合は、2つめの引数にオブジェクトを指定
insertLogger = function(funcname) {
    if (arguments.length>1) {
        // オブジェクトの指定がある場合
        obj=arguments[1];
        obj["__"+funcname] = obj[funcname];
        obj[funcname] = function(){ try{ obj["__"+funcname].apply(obj, arguments); }catch(ex){alert(ex);} };
    } else {
        // オブジェクトの指定がない場合
        eval( "__"+funcname+"="+funcname+";" );
        eval( funcname +"=function(){ try{ __"+funcname+".apply(window, arguments); }catch(ex){alert(ex);} };" );
    }
}

// エラー処理を追加する関数を指定
insertLogger("push_button");
insertLogger("push_button2", test);
--></script>
alert(ex); のところを、エラー内容をサーバに GET で送り込みつつ、throw するようにすれば、nazoking さんの発表内容に近づくかな。

プレフィックスが "__" でいいのかとか、なんか勝手に bind されちゃうんですけどもーとか、ツッコミどころは……
まあ、"javascript aop" とか "javascript アスペクト" あたりでぐぐってみれば、より一般的にあれこれ挑戦してみた方の情報が出てくるから、そっちでいいかなあ、などと(苦笑)。

About 2007年03月

2007年03月にブログ「nakatani @ cybozu labs」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年02月です。

次のアーカイブは2007年04月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。