» 「日本語スペルチェック」、「表記のゆれ」の2つの日本語検索機能を強化
関連語のAPIもすばらしいですが、この日本語特有のぶれを何とかしてくれるAPIもつくって欲しいです!
引っ越し、引越し、引越、このぶれを吸収するシステムを自前でつくろうと思っても大変。。
あとは同義語。ヤフーとYahoo!、Yahoo、Y!をひとくくりにできたらなぁ、といつも思います。
ちなみに、Googleでは「ブラjる」「じーこ」に修正候補は出てこない。「中田ひでとし」は出てくる。「多運ページ」で検索すると「もしかして: タウンページ」と出てくるが、Yahoo!には出てこない。「タウン頁」はGoogleでは出てこず、Yahoo!では出てくる。「タ運ページ」でもYahoo!は出てくる。どちらも必ずしも漢字の読みでQuery Expansionしているわけではないらしい。検索数に応じてExpandするか決めているとしたら、GoogleとYahoo!ではよく検索される語の種類がだいぶ違うということなのだろうか。
「ブラjる」はYahoo!では0件、Googleもダブルクォーテーションで囲んでフレーズ検索にすると0件。検索語と検索結果からだけでは「ブラジル」には繋がらないはず。
「こんなワードをゆらして!」といったご意見もお待ちしています。
ブログにもこう書かれているので全部ではないにしろ人間による辞書的なアプローチも一定の割合を占めているのでしょうか。「タ運ページ」なんて誤変換は普通しないと思うのでここは機械的な感じがする。
ゆらして欲しいワードは、よく間違えられて悲しい思いをする自分の名前。「舟木信宏」ぢゃなくて「船木信宏」です。
RECRUIT — Sun×RECRUIT Mash up Award 対象API一覧
このマッシュアップのコンテスト、僕も出そうと思っています。
公開されたAPI、それぞれいじっているところですがフロム・エー ナビのAPIはパラメータが多過ぎてそのままだと使いづらい。
そこで提供されているリファレンスのPDFを開いて「テキストとして保存」してからPHPで簡易的なパーサを書いて配列に放り込んだ後、SpycでYAMLに変換。
例えばバイトの勤務時間帯を指定するパラメータ、hours_ctrgy_cdは01~04をコード値として指定できます。で、以下のようなYAMLにしました。
---
-
id: 01
name: 午前(7:00.12:00)
-
id: 02
name: 昼(12:00.17:00)
-
id: 03
name: 夕方・夜(17:00.22:00)
-
id: 04
name: 深夜・早朝(22:00.翌7:00)
漏れや間違いはないと思ってますが、、もしあったら教えていただけると幸いです。edition_cdのデータ構造はリファレンスと違い、ツリー構造にしてあります。あと、使ったよーって方はぜひつくったアプリを教えてください!
» ダウンロード(約11k)
diggで見つけました。かっこいー。
» zipped.org – Best of the web all in one place
Make a Yoda in origami you must.
ファンとしてはこのコメントにやられた感じ。
川畑 文昭氏の作品だそうです。ネタ自体は1年前に取り上げられていた模様。(小太郎ぶろぐ:(PDFファイル)折り紙ヨーダの作り方)
#include <stdio.h>
int main(int argc, char *argv[])
{
char *str;
str = argv[1];
while (*str != '\\0') {
printf("%c\\n", *str);
str++;
}
return 0;
}
C言語で書くと以上のような処理をPHPで書きたいとき。
<?php
$str = $argv[1];
for ($i = 0; isset($str[$i]); $i++) {
echo $str[$i]."\\n";
}
こういうときはissetが速い。こんな処理が必要になることは滅多にないのですが、、文字列中に半角の文字が何文字あるか数えたい時とか正規表現だと遅い時とかに使えるかと。
phpspotで前の記事を紹介していただいた中で、全角で関数名や変数が書ける、という面白い構文が紹介されていたので自分も使ったことのある変なのを書いてみました。
あと、issetは複数の引数を取れる、というTIPSは最近面白いこちらのブログに。
» ウノウラボ Unoh Labs: isset()って
あと,is_string() とか is_int() ってアンダーバーで区切られているのに,
なぜか isset() は is_set() ではないんですよね.
ちなみにこれは歴史的経緯だったような。今のCODING_STANDARDSだとis_*が命名規則に則っていますがissetとかsetcookieはその規則を適用する前だったとか。PHP-usersのMLで見た記憶があるのですがうろ覚え&検索してもここまでしかわからず。

» Bambalam PHP EXE Compiler/Embedder 1.0 – Free php to exe converter!
coool!! こういうのを待っていました。
例えば、
echo time();
と書いたtime.phpを
c:\work>bamcompile.exe time.php time.exe
としてやるとtime.exeができて、これはPHPのインストールされていない他のWindowsでも動く!
does not workだったのがremote URLへのaccess。エラーメッセージもなしに落ちる。ソース(streams.c)を見た感じ、何かを上書きしているようでその辺りが原因か?
echo file_get_contents('http://www.zuzara.com/');
小粒なRSSリーダーを作って配布できる~と一番最初に思ったので残念。
require_onceしたファイルもexeに内包されると思いきやそうではないようでその点も今後に期待。
あと、extensionは使える、とサイトに書いてありますがcurlとかmbstringを試したところ動かず。パスはあっているはずなのに「指定されたモジュールが見つかりません」
こういうときさくさく英語でメール書いて開発者さんに送れるとハッピーなんですが。。
ハーフタイム暇、みたいな。
» 初回限定、それは小悪魔の囁き。
初回限定・特典付の商品をAmazonから探してきて載せています。
< ?php
$test = 'aaa';
switch (true) {
case ($test > 10):
echo "10!";
break;
case is_numeric($test):
echo "digit!";
break;
case is_float($test):
echo "float!";
break;
case is_aaa($test):
echo "aaa!";
break;
default:
break;
}
function is_aaa($str)
{
return ($str === 'aaa') ? true : false;
}
URLのパラメータが数字だったら、という処理をif文ではなくswitch文で書けたらきれいかな、と思ってやってみたら動きました。ユーザ定義関数を使うときはちゃんとboolを返さないと動かないようです。
マニュアルには見当たらない構文ですが使う機会はありそう。他のLLでも動くんでしょーか。
その他の PHP 関連記事。
追記:
ソースの一部を変更。
3年以上経過した今見ると、URLのパラメータのチェックには PHP5.2 以降なら filter_var を使った方が自然かと思います。
ブログ検索において、RSSは必ずしも記事全文を配信していないので、クローラーが記事のURLにアクセスし記事の本文を取得するケースが多いようです。
上記の記事ではどちらも本文を抽出してくる、とあっさり書かれていますが100%に近い精度を実現するとなるとそう簡単ではないはず。
ちょっと調べてみたら以下のような取り組みが論文として読めました。英語圏の文献は、検索語が悪かったのかいまいち。「blog entry extract body text etc…」
- NRI 技術創発 ブログ記事の自動分類により消費者意識の側面を捉える試み(PDF)
- なんでもRSS! HTML文書からのRSS Feed 自動生成 南野朋之 奥村学:人工知能学会研究会資料 SIG-SWO-A501-03(PDF)
なんでもRSS!はブログから記事本文を取得しているわけではなくて、普通のウェブページからRSSに必要な要素として記事を取得する方法が書かれています。NRIのレポートではそれと同様の手法で「エントリ切り出し機構の成功確率は推定9割である」と述べられていました。
gooやYahoo!ではどんな風に実装されているんだろうと気になり、自分でもつくってみました。今回できたスクリプトでは28件中23件、8割の成功確率でした。NRIのレポートでも推定、とあるように人間が目で見て正解か確かめていくのはしんどいのでちょっとサンプル数は少なめ。
ソースは以下。PHP。
/**
* ブログから記事本文を取得したい
*
* @author Nob Funaki
* @license This file is entirely BSD licensed.
*
*
* @param string HTML全文
* @return string ブログの記事本文(HTMLなし)
*/
function getBlogEntryBody($buf)
{
$_threshold_len = 100; // 本文の必要最小文字数(strlenで)
$_threshold_per = 0.1; // 本文中のHTML要素の割合
$buf = substr($buf, strpos($buf, '</head>'));
$res = '';
$max = 0;
$match = preg_split("'(<td[^>]*?>)|(</td>)|(<div[^>]*?>)|(</div>)'i", $buf, -1, PREG_SPLIT_NO_EMPTY);
foreach ($match as $val) {
$c = preg_match_all("'<[^>]*?>'", $val, $m);
$val = trim(strip_tags($val));
$len = strlen($val);
if ($len > $_threshold_len) {
$per = $c / $len;
if ($max < $len && $per < $_threshold_per) {
$max = $len;
$res = $val;
}
}
}
return $res;
}
tdかdivで囲まれた文字列で、文章と比べてHTMLのタグがあまり多くないもののうち、一番文字数が多いのが本文だろう、というアルゴリズム。
実行は以下のように。
$buf = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
echo getBlogEntryBody($buf);
実験に使ったのははてなブックマークの今日の人気エントリー50件。あえてはてブにしたのは記事本文がある程度長くないと精度が落ちるだろうなぁ、と思ったので。ブログではないブックマークも多いので、今回はRSSのAutoDiscoveryがあるもの28件をブログとして実験に使いました。
実行速度にはそれなりに気を使いましたが数百万のブログをクロールするとなると正規表現の部分は要チューニングかも。
うまく取得できなかった5件の大まかな特徴は、
- サイドバーの一部と誤認
- moreのついている記事(トップページでは全文を表示しないで記事個別ページに飛ばすタイプ)
- 記事の中にdivを使った区切り線があった
- はてなダイアリーのページ内リンクはどうしよう?(1ページに複数記事がある)
今回の実験対象にはありませんでしたが、Yahoo!のブログや楽天のブログもHTMLがあまり整っていないので難あり。
サイドバーやコメントに文字数が多いと誤認識するのが一番問題。これはHTMLの構造を解析する必要がありそう。ここから始まる精度との戦いはヘビーでしょう。。とはいえ、こういった基礎研究的な技術はきっとみんなの役に立つ!と思いつつ、自分も必要になるのでアップデートしていくつもりです。もしもっとうまい方法があればぜひ教えてください。
Firefox1.5.0.4がリリースされた直後、リリースノートへのリンク先が1.5.0.3だったのでアレ?と思ってURLの3を4に書き換えてみたらNot Found。たまたまアクセスした404のページは、和訳されたドキュメントならではのエレガントなデザインになっていました。
