Ruby loves PageRank
Довел до ума обещанный PageRank на Ruby. Забрать можно из моего гит репозитория. Код закомментирован, примеры использования в тестах. Тесты и идея взяты из этой статьи.
В кратце можно описать алгоритм так:
- Пусть у нас есть n страниц, на каждой из которых Ij ссылок. Мы хотим оценить некую "важность" страницы, с помощью которой можно было бы сказать, какая страница "авторитетнее", на основе количества ссылок на эту статью и "важности" страниц, с которых ведут ссылки. Важность и обзовем словом PageRank.
- Предположим, что если страница j ссылается на страницу i, то она отдает ей 1/|Ij| своей "важности".
- Составляем матрицу ссылок следующим образом: в клетке Si,j стоит число 1/|Ij|, если на j-ой странице есть ссылка на i-ую, 0 в противном случае.
- У нас получается квадратная матрица, в которой по диагонали стоят нули, а сумма всех чисел в столбце равняется единице.
- Чтобы посчитать "важность" каждой страницы необходимо найти собственный вектор V полученой матрицы H, соответствующий собственному значению 1. Vi — важность страницы i. Для этого воспользуемся простейшим итерационным методом.
- В данном решении возникают проблемы, типа висячей страницы, которая не ссылается ни на какие другие. Такая страница перетягивает на себя всю "важность" страниц, которые на нее ссылаются. Для этого мы интерпретируем H в вероятностном аспекте, о чем говорится в статье. Также в ней рассматриваются другие проблемы. Для понимания процесса рекомендую с ней ознакомится.
Комментарии и дополнения к коду приветствуются.
3 comments
Jump to comment form