日記
はてなダイアリーキーワード自動リンクAPI from はてなダイアリー日記 (13:51)Edit

2004/2/24

現在の先っちょはunoさんの上記版らしい。全然追随できてないんだけど、そのうち試そう。


2004/2/7

>>はてなダイアリー外のアプリケーションにおいて、はてなダイアリー内と同じく、キーワードの自動リンクを可能とするためのAPIを試験公開しました。

これも「そのうち遊ぶ」用メモ。これも単に記事単位でヒットしたキーワードへのリンクを並べるだけなら簡単なんだよな。うちの場合はすでに自前のキーワードリンクを持っているんで、記事内にはてなキーワードへのリンクを埋め込むってのはしないけど。

ただ個人的には、Perl用正規表現の形式での配布よりも、純粋にキーワード一覧として(正規表現用エスケープなし+改行区切りとかで)配布してもらえた方がうれしいな。その方が使い道の幅が広がりそうだし、自分でそれを正規表現用文字列に加工するのは簡単だし。

2004/2/17

むぅ。なんか思ったより手軽に遊べない。俺のローカルPHP環境ではこの巨大な正規表現の固まりは直接コンパイルできない(preg_**関数レベルでメモリ不足になるっぽい)でやんの。しょうがないから、適当に(特殊なキーワードを登録されたら通らなくなるけどまあいいか)キーワード単位でばらしてから利用することに。あと、短すぎるキーワードは嫌いなんで、ついでに指定文字数(デフォルトはマルチバイト含めて3文字)より短いキーワードは無視。とやってもまだすげー時間がかかるよ。ここのシステム上に組み込もうと思ってたけど、単語単位でばらし終わった後の正規表現のマッチングだけで10秒以上かかるとなると、とてもオンラインで実行する気になれないなー。新しいキーワードの取り込みから始めると余裕で1分近くかかるし。もっと高速化する姑息な手段を考えるか、それとも遅くても使えるような使い道を考えるか。

以下サンプルコード。使いたい人はもうちょっと確実度が高いように(エラーハンドリングとか排他制御とか)自力で改造して使うが吉。最近よくはてな関連落ちてるしね。

$hkw =& new CHatenaKeyword();
$url = 'http://mylog.ishinao.net/';
$results = $hkw->getMatchedList(file_get_contents($url));
foreach ($results as $keyword) {
echo '[<a href="http://d.hatena.ne.jp/keyword/'.urlencode($keyword).'"&gt;';
echo htmlspecialchars($keyword);
echo '</a>]';
}
class CHatenaKeyword {
var $_cacheFile;
var $_keywordUrl;
var $_cacheTime;
var $_rawKeyword;
var $_keywords;
var $_sizeLimit;
function CHatenaKeyword() {
$this->_cacheFile = 'keywordlist.txt';
$this->_keywordUrl = 'http://d.hatena.ne.jp//wp-content/keyword/keywordlist';
$this->_cacheTime = 60*60*24;
$this->_sizeLimit = 3;
if (!$this->_loadKeywordList()) {
$this->_loadNewKeyword();
$this->_saveKeywordList();
}
}
function _loadNewKeyword() {
$this->_keywordText = file_get_contents($this->_keywordUrl);
$this->_splitKeywordText();
}
function _saveKeywordList() {
$fp = fopen($this->_cacheFile, 'w') or die;
fwrite($fp, serialize($this->_keywords));
fclose($fp);
}
function _loadKeywordList() {
$fileinfo = stat($this->_cacheFile);
if (time() - $fileinfo['mtime'] > $this->_cacheTime) {return false;}
$this->_keywords = unserialize(file_get_contents($this->_cacheFile));
return true;
}
function getMatchedList($text) {
$results = array();
foreach ($this->_keywords as $pattern) {
if (preg_match($pattern, $text, $matches)) {
$results[] = $matches[0];
}
}
return $results;
}
function _splitKeywordText() {
$this->_keywords = array();
$keywordText = preg_replace('/([^\])|/', "$1\n", $this->_keywordText);
foreach (split("\n", $keywordText) as $keyword) {
if ($this->_sizeLimit != 0) {
$str = str_replace('\s', ' ', $keyword);
$str = str_replace('\', '', $str);
if (mb_strlen($str) < $this->_sizeLimit) {continue;}
}
$this->_keywords[] = '/'.$keyword.'/';
}
}
}

2004/2/17 その2

チェックしたいテキストを入れて「はてなキーワード抽出」すると、そのテキストに含まれるキーワードリンクを表示してくれる。高速化のために文字数制限を4文字にした。

2004/2/19

高速化版がでましたよ。このくらい速ければいろんな用途に使えそう。

※うが、なんか俺の環境では動かないな。コードを読まなきゃだめか。

Published At2004-02-07 00:00Updated At2004-02-07 00:00