The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Topic Feeder PageRank: what powers a content cluster

Bart Turczynski

2026-09-17

The question this answers

You have a content cluster you care about — say the AI-Agent product area — and you want to know which internal pages power it. Not “which AI-Agent page is the strongest” (that is an authority question), but the inverse: which pages funnel link authority into the cluster? Those are the internal hubs worth protecting, strengthening, or learning from when you build the next section.

topic_feeder_pagerank() answers exactly that. It is the reverse-graph sibling of topic_sensitive_pagerank().

Why it is not just re-reading PageRank

In PageRank, authority flows along link direction — linking to an important page does not make the linker important. So “the pages that feed the AI-Agent cluster” cannot be recovered from forward PageRank or from topic_sensitive_pagerank(): those rank pages by inflow (you are important because important pages point at you). Feeders are the opposite, an outflow notion (you are important because you point at the cluster).

Mechanically, topic_feeder_pagerank() seeds the random surfer’s teleport on the cluster and runs PageRank on the transposed graph (reverse = TRUE). Mass lands on the cluster, then walks backward along links, piling up on the pages that feed it. The damping factor attenuates that credit with link distance — a direct feeder beats a feeder-of-a-feeder. No new solver: it is a prior_df handed to pagerank(reverse = TRUE).

A worked example

edges <- data.frame(
  from = c(
    "/hub", "/hub", "/feeder", "/blog-ai", "/ai",
    "/footer", "/sports", "/footer"
  ),
  to = c(
    "/ai", "/ai-demo", "/ai", "/ai", "/ai-demo",
    "/ai", "/scores", "/sports"
  )
)

The AI-Agent cluster is c("/ai", "/ai-demo"). By construction /hub is the strongest feeder (it links to both cluster pages), /feeder and /blog-ai feed it once each, /footer links in too, and /sports / /scores are unrelated.

fr <- topic_feeder_pagerank(
  edges,
  seeds = c("/ai", "/ai-demo"),
  clean_edge_urls = FALSE,
  prior_verbose = FALSE
)
fr[, c("node_name", "pagerank", "prior_weight")]
#>   node_name  pagerank prior_weight
#> 1       /ai 0.3508772          0.5
#> 2  /ai-demo 0.2462296          0.5
#> 3      /hub 0.1792090          0.0
#> 4  /blog-ai 0.0745614          0.0
#> 5   /feeder 0.0745614          0.0
#> 6   /footer 0.0745614          0.0
#> 7   /scores 0.0000000          0.0
#> 8   /sports 0.0000000          0.0

Reading the output

feeders <- fr[fr$prior_weight == 0, c("node_name", "pagerank")]
feeders
#>   node_name  pagerank
#> 3      /hub 0.1792090
#> 4  /blog-ai 0.0745614
#> 5   /feeder 0.0745614
#> 6   /footer 0.0745614
#> 7   /scores 0.0000000
#> 8   /sports 0.0000000

/hub tops the feeder list exactly as designed, and the off-topic /sports neighborhood earns no feeder credit.

Contrast with the forward (authority) view

Run topic_sensitive_pagerank() on the same cluster to see the difference in direction:

auth <- topic_sensitive_pagerank(
  edges,
  topics = list(ai_agent = c("/ai", "/ai-demo")),
  clean_edge_urls = FALSE,
  prior_verbose = FALSE
)
auth[, c("node_name", "ai_agent")]
#>   node_name  ai_agent
#> 1  /ai-demo 0.6491228
#> 2       /ai 0.3508772
#> 3  /blog-ai 0.0000000
#> 4   /feeder 0.0000000
#> 5   /footer 0.0000000
#> 6      /hub 0.0000000
#> 7   /scores 0.0000000
#> 8   /sports 0.0000000

The forward run concentrates score on the cluster and what it links onward to; the feeder run concentrates score on what points into the cluster. Use the forward view to find the cluster’s authorities, the feeder view to find its hubs.

Where it sits among the reverse-direction tools

pagerankr has three ways to look “backward” along links; pick by what you need:

Notes

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.