SITEINFOのないページをAutoPagerizeするSITEINFO speculator for AutoPagerize version 0.0.2

Pagerization version 0.2.2 – ?D of Kに触発されてちょっと自分でも書いてみた。

AutoPagerizeよりもあとに実行されるようにインストールしておくと、AutoPagerizeでSITEINFOにマッチしなかったとき自動的にnextLinkpageElementを推測してAutoPagerizeを再実行します。

インストール

siteinfospeculator.user.js

つかいどころ

全部のページで使うとちょっと重たいので、Greasemonkeyの設定でincludeを*.tumblr.comで使ったりするといいとおもいます。tumblrのAutoPagerizeされてないテーマも、だいたい正しくAutoPagerizeできるかんじです。

フィードバック

SITEINFO speculatorでAutopagerizeが起動されたときは、右上の緑色がほんもののSITEINFOで起動されたときよりも暗くなります。マウスを持っていくと、自動生成されたSITEINFOの質がどうだったかのフィードバックを送るためのリンクが出てくるので、今後の開発の参考になるので、ひどいSITEINFOができてむかついたというときはmessyを、完璧で感動したというときはperfect, 一応動いてるけどみためがおかしくなるとかのときはokを押してもらえると助かります。

rating UI

SITEINFOのレイティングと一緒に、ページのURLと使っているブラウザのUserAgentと生成されたXPathが送信されます。送られたデータはRatingsからみることができます。もし間違っておくって消したい、というときにはここで削除してください。

アルゴリズム

nextLinkの検出は適当です。単純なOperaのFast Forwardアプローチで、”»”, “次”, “Older”, “older”, “Next”, “next”, “→”, “←”, “>”, “<”, “«”, “前”, “Prev”, “prev” をキーワードにして引っかかったテキストリンクだけを探しています。なのでnextLinkが画像だと機能しません。(version 0.0.2で画像もいちおう対応しました)

前にSITEINFOで調べたかんじでは、nextLinkは時系列の向きに関わらず右向きの矢印で示されることが多かったので、そういう並び方に変えたほうがよさそう。今はマッチしたキーワードのリンクを、テキストの長さに反比例するコスト関数で評価して、コストの小さいものをnextLinkにしてます。のページのほうが10 年の今日、Netscape Communications 社が mozilla.org を設立よりも優先されるように、という小細工。

pageElementXML::Diffのアルゴリズムをベースにしてます。Diffは正確に差分を出す必要があるけど、今回は差異があることだけわかればいいので、かなり簡略化して差異がある部分だけをみつけて、ツリーを下から上に差異を足しこんでいって、終わったところで、今度は上から差異の変化を見ていって差異のほとんどが含まれている要素を見つけてそれをpageElementにしています。0.5~1.0秒くらいブロックしちゃうかんじだけど、そこはyieldで書き直せば解決。

精度のほうはあんまり試してないけど、nextLinkが見つかったものに関しては5~6割くらい正しくpageElementを出せそう。

Pagerization version 0.2.2 – ?D of Kのリストを参考にいくつか試した結果は

http://1470.net/list/memo/recent
ok
http://2ch.ru/g/
nextLinkが見つけられない
http://www.adiumxtras.com/index.php?a=search&cat_id=3
ok
http://allabout.co.jp/relationship/secondmarriage/closeup/CU20071006A/index.htm
ok
http://www.altphotos.com/Gallery.aspx?browseby=toprated
ok(でも2ページしか出ない。AutoPagerizeのSITEINFOがあっても2ページしか出ないけど偶然?)
http://jp.techcrunch.com/
ok(アルゴリズム的には正しいけどレイアウトが乱れる)
http://mozillazine.jp/
ok
http://coderepos.org/share/changeset/
ok(ただしレイアウトが大きく異なっているChangeset 8044 – CodeRepos::Share – Tracで止まる)

かんそう

nextLinkを見つけるようなアルゴリズムがない。たくさんデータを集めて統計的に解決するしかなさそう。

Greasemonkeyが実行されてから実際にAutoPagerizeで次のページがロードされるまで時間があるので、Greasemonkeyでページの解析をしなくても、リモートのサーバにリクエストを送って差分を解析してもらうこともできる。これは基本的にブラウザで新しいページをロードするたびにリクエストが送られることになる。サーバ側はpathtraqと同じデータを得ることができる。だから今のpathtraqに欠けているインストールすることのインセンティブとして、nextLinkpageElementを返してくれるAPIとかどうかなーと思ったり。pageElementの検出はWebページの本文抽出にも似ているところがあって、ますますpathtraqと相性いいなと感じました。

検出精度を高めていくには自動でテストをまわしてカバレッジを出してくれる何かがないとつらいです。perlのWWW::Mechanize::AutoPagerHTML::TreeBuilder::XPathでSITEINFOをパースしてみたらXPathの評価で例外が出まくってだめでした。PHPのXMLまわりはクソでwell-formedにするのも一苦労なので、ruby, pythonをまともに使えない自分には手詰まり。


About this entry