Код не будет читать папки в том же каталоге - PullRequest
0 голосов
/ 10 июля 2020

Справочная информация. Я пытаюсь реализовать три функции 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()

1 Ответ

0 голосов
/ 16 июля 2020

, если вы запускаете свой код в PyCharm, go в Run -> Edit Configurations -> и в Parameters добавьте корпус. Пример "corpus0".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...