本レッスンの残りの目標は
PageRankアルゴリズムを実装するために
検索エンジンのコードを修正することです
小さな問題が1つあります
PageRankはGoogleの登録商標なのです
たとえ動作が同じであっても
私たちのアルゴリズムをPageRankとは呼べないので
URankと名づけましょう
このアルゴリズムを実装するためにまず必要な作業は
リンクグラフを保持することです
私たちはページの人気度を
リンク構造で判断しているため
どのページがどのページにリンクしているのかを
把握する必要があります
各リンクが示すページ間のつながりを
グラフと見なすことができます
理論的に言えばグラフとは
この丸で描いているノードと
ノード間を結ぶエッジの集合です
私たちのエッジはページのリンクのように
1方向に進むので
有向グラフと呼ばれます
そこで私たちのWebリンク構造を表すために
有向グラフを作る必要があります
ページはグラフにおけるノードです
各ページについて
自身から他のノードに出ているエッジを
把握する必要があります
そのための方法として
ディクショナリを持つことにしましょう
そのディクショナリのエントリはノードです
ノードはURLすなわちページです
そして各URLについて
そのURLがリンクを張っている
すべてのページのリストを保持します
それではこの丸をノードA、ノードB
ノードC、ノードDとしましょう
ノードAのエントリはB、C、Dのリストになります
ノードBのエントリは
Bからはエッジが出ていないので空リストになります
例を完成させましょう
Cからは1つのノードにリンクが出ています
Dからはリンクが出ていません
これが目標です
クロールするWebページの構造を示す
このようなグラフを作りましょう
クローラでリンクを追っていくので
この構造は把握できますね
つまり私たちの目標は
crawl_web関数を修正することです
レッスン5の最後の方でも定義し直しましたね
今回はcrawl_webが
単にインデックスを生成するだけでなく
グラフも生成するようにします
crawl_webの修正を行いますが
シードページから処理を始める点は変わりません
ただし生成するのはインデックスとグラフの両方です
このグラフは各ノードからリンク先のページへの
マッピングを示します
レッスン5の最後の時点でのコードを確認して
どのように変更するべきかを考えてみましょう
これがcrawl_webの
レッスン5が終わった時点でのコードです
復習しますがcrawl_webは
リストtocrawlのすべてのページを追っていきます
シードページseedからクロールを始めます
インデックスはディクショナリとして生成します
そしてtocrawlにページが残っている限り
whileループの処理を繰り返します
その時にpopでtocrawl内にあるページを
抜き出していきます
以前にクロールしたことのないページなら
そのページからコンテンツを取得して
インデックスに追加します
get_all_linksにページのコンテンツを渡して
そのリンクをすべて取得したら
その中でtocrawlに含まれていないリンクを
tocrawlに追加します
そしてこのページを
クロール済みページのリストcrawledにappendします
このcrawl_webがグラフを
生成するように修正するには
コードの大部分は変更不要です
インデックスを生成するだけでなく
グラフも生成するようにします
グラフもディクショナリにします
グラフは各ノードすなわち各URLについて
そのノードから出るエッジのリストへの
マッピングを示す構造となるからです
ここでグラフを空のディクショナリとして生成します
そして新しいページを見つけたらこのグラフに加えます
さらにreturnも
インデックスとグラフの両方を返すように変更します
小テストを行う前にもう1点変更を加えましょう
get_all_linksを呼び出しているこの部分を
変えたいと思います
グラフの作成処理とリストtocrawlのどちらとも
すべてのリンクを使うので
新しい変数outlinksを作成しましょう
そしてget_all_links(content)の結果を
outlinksに代入します
こうすればoutlinksを
tocrawlへの入力として使えますし
さらにグラフの作成にも使うことができます
グラフの作成を行う部分に空行を作りましたので
これを小テストにしましょう
グラフを更新するために必要な
この部分のコードを書いてください