サイト内のリンク構造を基にしてサイト内に限った各ページの PageRank を計算から求めるプログラムを書いてみました。最終的な PageRank とは,外部から張られたリンクを加味した上で決定されるわけですが,サイト内でどのようなページが高い PageRank を獲得しやすいのか,その傾向を知ることは,サイトの SEO を考える上でも無駄ではないと思います。
Google の秘密 - PageRank 徹底解説を参考にして,PageRank を求めるプログラムを書いてみました。プログラムは 2 つに分かれていて,1 つ目は指定されたサイトを総舐めしてリンク構造を取得するためのプログラムで,2 つ目は取得されたリンク構造から各ページの PageRank を求めるプログラムになります。
外部リンクを考慮しない PageRank の計算では,まず各ページが PageRank 1 を持つ状態から計算を始めます。PageRank はリンク関係を表した隣接行列の固有ベクトルを求めることと同じであり,今回は外部のライブラリなどを利用せずに Perl プログラム単体で動作するようにしました。計算方法にべき乗法を用いたため,計算速度は恐ろしく遅いです。ここのサイト規模では 780 近い内部リンクがあり,64bit デュアルコアの AMD Opteron 1210 プロセッサを搭載したマシンで概ね 30 分程度を要しました。
Perl を用いて簡単なクローラを作成し,それを用いて対象となるサイト内リンクを全て取得します(ダウンロード) このプログラムによって,どのページからどのページへリンクが貼られているかを示す隣接行列を得ることができます。別のプログラムを使用して,当サイトの隣接行列を図示したものが次になります。
上の図からだけでも興味深い点が幾つか見られますので簡単に解説してみます。図の黒い部分がリンクがあるところで,横方向の直線は多くのページからリンクされていることを示しています。反対に縦方向の直線は他のページに多くリンクしていることを示しています。
rel="prev" と rel="next" によるものです。また,横に伸びる直線は,左サイドバーにある"ショートカット"や"勝手におすすめ"コーナーのように,全てのページで共通に表示されているリンクによるものとわかります。
先のクローラによって得られたサイト内の隣接行列を用いて,サイト内に限っての PageRank を求めることができます(ダウンロード) 最終的な PageRank は,外部から張られたリンクなどによって決定されますが,それでも現在のサイト内のリンク構造によって,どのページが高い PageRank を持つかを知ることは重要です(このサイトでの計算結果の例) サイトの内部リンクを幾ら増やしても,サイト全体のページランクの総和は変わりません。サイトの内部リンクについては,ウェブサイト内でリンク関係に基づき,PageRank が再配分されているだけと考えられます。それ故に,もしもサイト管理者があまり重要と考えていないページが高い PageRank を持つ場合には,サイト内のリンク構造を見直す必要があると云えます。
リンク属性の一つである rel="nofollow" は,スパムコメントなどによるスパムサイトの宣伝的な PageRank アップを防止するために使用されることが殆どです。しかし,この属性の与えられたリンク先には PageRank が流れないという効果を上手く利用することで,サイト内のページの PageRank をある程度コントロールすることができると考えられます。ページナビゲーション上,どうしてもリンクは必要であるが,そのリンクされたページには特に PageRank を必要としない場合(例えば,全ての記事ページ)などには,リンクに rel="nofollow" と追加することで PageRank の流出を防ぐことができると考えられます。そして,本当に PageRank を必要としているページに対して,適切に PageRank が流れるようにリンクを調整すればよいのです。