Справочная информация. Я пытаюсь реализовать три функции transition_model
, sample_pagerank
и iterate_pagerank
в файле pagerank.py
, весь код в таком файле, кроме этих трех функций, задается профессор. Есть еще три папки (corpus0
, corpus1
, corpus2
), которые содержат HTML файлов для ранжируемых веб-сайтов, в той же папке (с именем pagerank
), где находится pagerank.py
. Я не должен ничего менять в файле, кроме трех функций. Тем не менее, любые подобные предложения будут оценены.
Информация об ошибке. Код останавливается в строке 13 из-за sys.argv == 1 вместо 2. После некоторого поиска в Google я теперь знаю, что sys .argv [0] - это путь к pagerank.py
, а sys.argv [1] должен быть путем к одной из папок, но код не найдет ни одну из трех папок. Я также обнаружил, что библиотека os
предназначена для чтения папок, но я не вижу использования такой библиотеки в основном
Предположения. Я пытался удалить две папки из трех, это не сработало. Я новичок в python, поэтому я действительно не знаю, как python читает файлы и его синтаксис.
pagerank.py
import os
import random
import re
import sys
import numpy as np
DAMPING = 0.85
SAMPLES = 10000
def main():
if len(sys.argv) != 2:
sys.exit("Usage: python pagerank.py corpus") <----- Stops here.
corpus = crawl(sys.argv[1])
ranks = sample_pagerank(corpus, DAMPING, SAMPLES)
print(f"PageRank Results from Sampling (n = {SAMPLES})")
for page in sorted(ranks):
print(f" {page}: {ranks[page]:.4f}")
ranks = iterate_pagerank(corpus, DAMPING)
print(f"PageRank Results from Iteration")
for page in sorted(ranks):
print(f" {page}: {ranks[page]:.4f}")
def crawl(directory):
"""
Parse a directory of HTML pages and check for links to other pages.
Return a dictionary where each key is a page, and values are
a list of all other pages in the corpus that are linked to by the page.
"""
pages = dict()
# Extract all links from HTML files
for filename in os.listdir(directory):
if not filename.endswith(".html"):
continue
with open(os.path.join(directory, filename)) as f:
contents = f.read()
links = re.findall(r"<a\s+(?:[^>]*?)href=\"([^\"]*)\"", contents)
pages[filename] = set(links) - {filename}
# Only include links to other pages in the corpus
for filename in pages:
pages[filename] = set(
link for link in pages[filename]
if link in pages
)
return pages
def transition_model(corpus, page, damping_factor):
"""
Return a probability distribution over which page to visit next,
given a current page.
With probability `damping_factor`, choose a link at random
linked to by `page`. With probability `1 - damping_factor`, choose
a link at random chosen from all pages in the corpus.
"""
distribution = dict()
# Iterates through all corpus' keys
for current in corpus:
if current == page:
for link in current:
distribution.update( link = damping_factor / len(current) + ((1 - damping_factor) / len(corpus)) )
return distribution
for link in corpus:
distribution.update( link = damping_factor / len(corpus) + ((1 - damping_factor) / len(corpus)) )
return distribution
raise NotImplementedError
def sample_pagerank(corpus, damping_factor, n):
"""
Return PageRank values for each page by sampling `n` pages
according to transition model, starting with a page at random.
Return a dictionary where keys are page names, and values are
their estimated PageRank value (a value between 0 and 1). All
PageRank values should sum to 1.
"""
sample_list = set()
# Creates first samlpe at random.
sample_list.add(random.choice(list(corpus.keys())))
for i in range(n):
probability = transition_model(corpus, sample_list[i], damping_factor)
sample_list = np.random.choise(transition_model(corpus, sample_list[i], damping_factor), )
raise NotImplementedError
def iterate_pagerank(corpus, damping_factor):
"""
Return PageRank values for each page by iteratively updating
PageRank values until convergence.
Return a dictionary where keys are page names, and values are
their estimated PageRank value (a value between 0 and 1). All
PageRank values should sum to 1.
"""
raise NotImplementedError
if __name__ == "__main__":
main()