クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

リンクで順位を決める仕組み

このレッスンのあとで: ページの順位が、リンクに沿って流れ、くり返しで落ち着く様子を説明できる。

65分のレッスンコマンド1件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

たくさんリンクされたページは、大事なページ

リンクに基づく順位づけとは、多くのページから、しかも大事なページからリンクされているページを、大事だとみなす考え方です。ページの中の語だけでは、同じ語を含むページが多すぎて、順位がつけられません。

そこで、ページどうしのつながりを、手がかりにします。大事さは、リンクに沿って流れ、くり返し計算すると落ち着きます。

このレッスンのゴール

メモ

ページの順位が、リンクに沿って流れ、くり返しで落ち着く様子を説明できる。

キーワード

ことばいみれい
リンクあるページから、別のページへの案内
被リンク別のページから、そのページへ向かうリンク
順位の流れページが、持っている順位を、リンク先に分けること
反復同じ計算を、くり返し行うこと
減衰係数リンクをたどる割合。ここでは 0.850.85

学生が入力するセルは、このプレビューでは空白です。

順位は、リンクに沿って流れる

ページを、リンクでつながった点だと考えます。各ページは、持っている順位を、リンク先に等しく分けて渡します。

たくさんのページから渡されるほど、そのページの順位は上がります。渡す側が上位のページなら、渡される順位も大きくなります。

1回の計算で、順位を渡し直す

最初は、4ページすべてが 0.25 です。1回ごとに、各ページは順位を、リンク先に等しく分けて渡します。

ただし、全部を渡すのではありません。リンクをたどる割合を 0.85(減衰係数)とし、残りの 0.15 は、全ページに等しく配ります。

ページ C の1回目の順位

コマンド
docker exec jupyter python3 -c "print(round(0.15 / 4 + 0.85 * (0.25 / 2 + 0.25 / 1 + 0.25 / 1), 3))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: 1回目、2回目、20回目の順位

ページ最初1回目2回目20回目
A0.250.250.5210.373
B0.250.1440.1440.196
C0.250.5690.2980.394
D0.250.0380.0380.038

学生が入力するセルは、このプレビューでは空白です。

くり返すと、値が落ち着く

コード: python
links = {"A": ["B", "C"], "B": ["C"], "C": ["A"], "D": ["C"]}
rank = {}
for page in links:
    rank[page] = 0.25
for round_number in range(1, 4):
    new = {}
    for page in links:
        new[page] = 0.15 / 4
    for page in links:
        share = rank[page] / len(links[page])
        for target in links[page]:
            new[target] = new[target] + 0.85 * share
    rank = new
    print(round_number, "回目の C:", round(rank["C"], 3))
# range(1, 4) を range(1, 21) に変えて、C の値が落ち着くか見てください。

何回もくり返すと、順位は落ち着く

表のように、1回目と2回目では、順位が大きく動きます。くり返すうちに、動きは小さくなり、やがてほとんど変わらなくなります。

この落ち着いた値が、ページの順位です。数が小さいページでは、20回ほどで十分です。順位の合計は、いつも1です。

よくある間違い

注意

リンクされた数が多いページほど、順位が高いと考えがちです。表では、被リンクが1つの A が、高い順位を保ちます。リンクを出す C が上位だからです。数より、誰からかが効きます。

さらに挑戦: リンクのないページ

課題では、どのページも、1つ以上のリンクを出すと決めています。リンクを1つも出さないページがあると、len(links[page]) が 0 になり、割れません。

そのページの順位を、全ページに等しく配る方法を考えて、書いてみてください。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。