次のコードがあるとします。
def compute_ranks(graph, k):
d = .8 #dampening factor
loops = 10
ranks = {}
npages = len(graph)
for page in graph:
ranks[page] = 1.0 / npages
for c in range(0, loops):
newranks = {}
for page in graph:
newrank = (1-d) / npages
for node in graph:
if page in graph[node]:
newrank = newrank + d * (ranks[node]/len(graph[node]))
newranks[page] = newrank
ranks = newranks
return ranks
では、互いに共謀する可能性のあるアイテムを許可したくないとします。アイテム辞書があれば
g = {'a': ['a', 'b', 'c'], 'b':['a'], 'c':['d'], 'd':['a']}
任意のパス A==>B について、B==>A からのパスが私の番号 k 以下の距離にあることを許可したくありません。
たとえば、k = 0 の場合、許可しない唯一のパスは A==>A です。
ただし、k = 2 の場合、以前のようにリンク A==>A は許可されませんが、D==>A、B==>A、または A==>C などのリンクも許可されます。
私はこれが非常に紛らわしいことを知っており、私の問題の大部分はこれが何を意味するのかを正確に理解していないことに起因しています.
質問の書き起こしは次のとおりです。
# Question 2: Combatting Link Spam
# One of the problems with our page ranking system is pages can
# collude with each other to improve their page ranks. We consider
# A->B a reciprocal link if there is a link path from B to A of length
# equal to or below the collusion level, k. The length of a link path
# is the number of links which are taken to travel from one page to the
# other.
# If k = 0, then a link from A to A is a reciprocal link for node A,
# since no links needs to be taken to get from A to A.
# If k=1, B->A would count as a reciprocal link if there is a link
# A->B, which includes one link and so is of length 1. (it requires
# two parties, A and B, to collude to increase each others page rank).
# If k=2, B->A would count as a reciprocal link for node A if there is
# a path A->C->B, for some page C, (link path of length 2),
# or a direct link A-> B (link path of length 1).
# Modify the compute_ranks code to
# - take an extra input k, which is a non-negative integer, and
# - exclude reciprocal links of length up to and including k from
# helping the page rank.