Created
November 24, 2023 08:28
-
-
Save Jan200101/826188c21ee3c3eb69e16703a812683e to your computer and use it in GitHub Desktop.
pagerank
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from __future__ import annotations | |
class Page: | |
o = 0.5 | |
def __init__(self, iid): | |
self.id = iid | |
self.references = [] | |
self.referers = [] | |
self.rank = 1 | |
def __repr__(self): | |
return f"<Page {self.id} references={len(self.references)}, referers={len(self.referers)}>" | |
def add_reference(self, page: Page): | |
if page not in self.references: | |
self.references.append(page) | |
page.add_referer(self) | |
def add_referer(self, page: Page): | |
if page not in self.referers: | |
self.referers.append(page) | |
page.add_reference(self) | |
def rank_impl(self): | |
k = 0 | |
for x in self.referers: | |
k += x.rank / len(x.references) | |
b = (1 - self.o) + self.o * k | |
return b | |
def calculate_rank(self, iterations): | |
if iterations > 0: | |
v = {} | |
# calculate the rank | |
for x in self.referers: | |
v[x.id] = x.calculate_rank(iterations-1) | |
# apply the rank later so we don't end up causing false results | |
for x in self.referers: | |
x.rank = v[x.id] | |
return round(self.rank_impl(), 10) | |
a = Page("a") | |
b = Page("b") | |
c = Page("c") | |
a.add_reference(b) | |
a.add_reference(c) | |
b.add_reference(c) | |
c.add_reference(a) | |
for x in range(10): | |
a.rank = 1 | |
b.rank = 1 | |
c.rank = 1 | |
print(x, c.calculate_rank(x)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment