Адаптивный метод выбора каналов новостей



Скачать 185.7 Kb.
Дата04.05.2016
Размер185.7 Kb.


САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Математико-механический факультет

Кафедра системного программирования

Адаптивный метод выбора каналов новостей
Дипломная работа студента 544 группы

Гуревича Льва Станиславовича


Научный руководитель,

профессор……………………………………………………/О.Н. Граничин/


Рецензент,

аспирант……...……………………………………………../ Д. С. Шалымов/


“Допустить к защите”

Заведующий кафедрой,

профессор………………………………………………………./А.Н. Терехов/

Санкт-Петербург

2007 г.

Оглавление





Оглавление 2

Введение 3

ГЛАВА 1: Обзор существующих подходов 7

1.1 Групповая и контекстная фильтрация 7

1.1.1 Контекстная фильтрация 7

1.1.2 Групповая фильтрация 7

1.2 Новостные агрегаторы 11



ГЛАВА 2: Постановка задачи 13

ГЛАВА 3: Основной алгоритм 15

3.1 Алгоритм пересчета интересов на основе реакции пользователя. 16

3.2 Алгоритм выбора новостных источников для показа пользователю 19

ГЛАВА 4: Реализация подхода 22

Заключение 24

Литература 26



Введение


Мы живем в век информации – время неограниченного доступа к информационным ресурсам, время в которое объем информации, публикуемой различными сайтами, новостными лентами и другими источниками растет экспоненциально. Каждый день тысячи электронных газет публикуют десятки тысяч статей на различные темы. Каждая из них может быть потенциально интересна определенному читателю.

Избыточное количество источников новостей создает ситуацию, в которой человек может проводить больше времени в поисках новостей интересных для себя, чем за чтением этих новостей. Значительное количество алгоритмов информационной фильтрации призваны побороть избыток информации, позволяя человеку читать сразу то, что ему интересно.

Подобно системам информационного поиска, системы информационной фильтрации позволяют пользователю находить нужную им информацию. Поскольку информационные предпочтения могут существенно отличаться у различных людей, фильтрующая система должна подстраиваться под конкретного человека. Интеллектуальная фильтрующая система должна удовлетворять следующим требованиям:


  1. Подстройка под пользователя. Интеллектуальная фильтрующая система должна чутко реагировать на специфические интересы конкретного пользователя. Классические фильтрующие системы записывают информацию о пользовательских интересах в моделях пользователя или профилях. В настоящее время ведутся активные работы, направленные на поиск оптимального представления пользовательских интересов, позволяющих наилучшим образом определить будет ли тот или иной материал интересен данному пользователю, или нет.

  2. Адаптивность. Фильтрующая система, наблюдая повторяющиеся итерации взаимодействия пользователя с системой, должна замечать происходящие со временем изменения в интересах пользователя. Основываясь на предположении, что большинство действий пользователя согласуются с его текущими интересами, фильтрующая система должна анализировать их для определения изменений в интересах.

  3. Изучение. Фильтрующая система должна определять новые области информации и рекомендовать их пользователю, основываясь на том, что она о нем знает.

На рис1. приведена схема работы такой системы.



Рисунок 1 Схема классической системы фильтрации

Система состоит из трех модулей: модуль «Адаптация» изменяет профиль пользователя, основываясь на его реакции, модуль «Подстройка под пользователя» выбирает новости интересные пользователю, основываясь на его профиле, а модуль исследования добавляет к ним новости из новых областей.

Обычно, автоматизированный поиск на каком-то множестве элементов основан на запросе, задающем значения типичных характеристик этих элементов. Поиск текстовых документов использует запросы, содержащие слова или понятия, которые хотелось бы встретить в возвращаемых документах. Поиск по названиям компакт-дисков, например, нуждается в идентификации требуемого исполнителя, жанра, времени издания. Большая часть методов поиска используют своего рода меру схожести для сопоставления запросу, описывающему желаемое содержимое и последующего построения ранжированного списка результатов.

Метод определения потенциально интересной информации использует данные о предпочтениях выделенного множества пользователей. Обычно, такие системы не используют информацию о действительном содержимом (ключевые слова, имя автора, описание) элементов, а основываются на шаблонах их использования или предпочтений между ними для других пользователей. Так называемые системы collaborative filtering или системы групповой фильтрации строятся на допущении, что хорошим способом для поиска интересной информации является поиск других людей, имеющих похожие интересы, и рекомендовать те названия, которые те «похожие» люди предпочитают. Методы такого типа являются достаточно популярными, в том числе и в случае, когда пользователя интересует поиск по новостным лентам или блогам.

В последнее время растет популярность форматов RSS и Atom. Эти стандарты созданы для того, что бы заменить рассылки. Они позволяют пользователю получать информацию о новостях, опубликованных на сайте, не заходя на него. Созданы специальные программы – агрегаторы, позволяющие собирать и читать новости из большого количества источников в одном месте. Совмещению технологии агрегации и фильтрации и посвящен мой диплом.

В главе 1 приведен обзор существующих методов новостной фильтрации, в главе 2 сформулирована постановка задачи, решаемой в данной работе. В главе 3 представлен решающий поставленную в главе 2 задачу алгоритм, а четвертая описывает особенностями программной реализации и использованной архитектурой. В заключении перечислены результаты использования и перспективы дальнейшего развития описанного в дипломной работе нового подхода.



ГЛАВА 1: Обзор существующих подходов

1.1 Групповая и контекстная фильтрация


Большинство подходов к решению задачи информационной фильтрации можно разделить на 2 основные категории: контекстная (Content Based Filtering, CBF) и групповая (Collaborative Filtering, CF).

Подход CBF[2,3,5] построен на предположении о том, что новость, которая интересна пользователю похожа на те, которые ему были интересны ранее. Подход CF[2,4,5,9], в свою очередь, пытается найти пользователей, похожих на данного, и затем рекомендует данному пользователю ту информацию, которая показалась интересной похожим на него. В последнее время было проведено значительное количество исследований, направленных на комбинирование этих двух подходов. Такие подходы называют гибридными[2,5]. Более подробно рассмотрим collaborative filtering, так как он будет использоваться в предлагаемом далее алгоритме.



1.1.1 Контекстная фильтрация


CBF-система занимается вычислением схожести, между свежими новостями и профилем пользователя. Наиболее общий и простой метод этой категории – сопоставление ключевых слов. Основываясь на этом простом методе, были разработаны системы типа vector space model, позволяющие лучше фильтровать и искать информацию.

1.1.2 Групповая фильтрация


Задачей collaborative filtering является предсказание пользы элементов для конкретного пользователя, основанное на базе данных пользовательских предпочтений других пользователей. Рассмотрим два вида collaborative filtering: memory-based и model-based. Memory-based алгоритмы оперируют надо всей базой данных для создания рекомендаций. Model-based, наоборот, используют базу данных для обучения или настройки модели, которая затем используется при составлении рекомендаций.

Collaborative filtering-системы часто различаются по признаку: оперируют ли они неявными или явными средствами выражения пользовательских интересов. Явные средства означают, что пользователь сознательно описывает свои предпочтения, обычно на основе дискретной целочисленной шкалы. Неявные средства означают интерпретацию пользовательского поведения или выбора для определения предпочтений. Неявные средства выражения интересов могут быть основаны на просмотре информации (для Интернет-приложений, например), истории покупок (для магазинов) или других шаблонах доступа к информации.

Несмотря на тип доступных данных о предпочтениях, collaborative filtering – алгоритмы должны справляться с недостатком данных. Обычно, у нас нет полного набора предпочтений по всем названиям элементов. Нельзя допускать, что отсутствие некоторого элемента – случайность, так как пользователи склонны выражать предпочтения по тем элементам, которые были ими просмотрены, а значит их заинтересовали.

1.1.2.1 Memory-based алгоритмы


В целом, задача collaborative filtering состоит в предсказании предпочтений пользователя на основании пользовательской базы данных предпочтений. База данных пользователей состоит, таким образом, из набора предпочтений (голосов) vij, соответствующих оценке пользователем i элемента j. Если Ii обозначает набор элементов, по которым пользователь i определил свои оценки, тогда можно выразить среднюю оценку пользователя i как:

.

В memory-based collaborative filtering алгоритмах оценки пользователя, обозначаемого нами как a, предсказываются, основываясь на неполной информации о нем и наборе весов, рассчитанных на основании базы данных пользователей. Допустим, что предсказанная нами оценка paj пользователем a элемента j, это взвешенная сумма оценок других пользователей:



где n – число пользователей в базе данных collaborative filtering с ненулевыми весами. Веса w(a,i) могут отражать расстояние, корреляцию или схожесть между каждым пользователем i и текущим (активным) пользователем a. Далее, мы рассмотрим детали различных алгоритмов collaborative filtering, касающиеся расчета весов. Существуют иные возможные характеристики memory-based collaborative filtering, однако в этой работе мы ограничиваем себя формулировкой, описанной выше.


1.1.2.1.2 Корреляция


Общая формулировка статистических методов collaborative filtering (в противовес вербальным или качественным аннотациям) впервые появилась в контексте проекта GroupLens, где корреляция по Пирсону была основой для задания весов[9]. Корреляция между пользователями a и i выражается как:

,

где суммирование по j производится по элементам, для которых оба пользователя (a и i) определили свои оценки.


1.1.2.1.3 Схожесть векторов


В области информационного поиска, схожесть между двумя документами обычно измеряется через сопоставление документу вектора частот слов и вычисление косинуса угла между двумя векторами частот. Можем использовать этот формализм в задаче collaborative filtering, где оценки будут играть роль частот слов. Заметьте, что, следуя этому алгоритму, измеренные оценки обозначают положительные отзывы, и негативные отзывы не учитываются, и неоцененные элементы получают нулевую оценку. Соответственно, веса выражаются как

,

где множители в знаменателе служат для нормализации оценок так, что пользователи, которые оценивают активнее других, не будут более на других похожи. Другие схемы нормализации тоже возможны.

Дополнить метод можно схемой «оценки по умолчанию», которая позволяет расширить множество оцененных пользователем элементов. Другим важным дополнением может быть использование так называемой инверсной частоты оценок. При поиске по текстовым документам, сравнение документов осуществляется на основе векторов частот отдельных слов, причем каждое слово имеет вес, отражающий его специфичность, так что общеупотребительная лексика обладает более низким приоритетом. Аналогичный поход можно использовать и в collaborative filtering, вводя новую оценку пользователем a элемента j: , при .

1.1.2.2 Model-based методы


С вероятностной точки зрения, задача collaborative filtering может рассматриваться как вычисление математического ожидания значения оценки на основе имеющейся информации о пользователе. Для активного пользователя, мы хотим предсказывать оценки на еще не наблюдавшихся им элементах. Если допустить что оценки – это целые числа в интервале от 0 до m, то получится:

,

где это вероятность того, что активный пользователь оценит именно таким значением элемент j при условии имеющихся наблюдений о сделанных оценках.


1.1.2.2.1 Байесовская кластеризация


Пусть переменная C принимает небольшое дискретное множество значений, обозначающих кластеры пользователей. Разделим пользователей по кластерам, и будем считать их предпочтения через условные вероятности:


1.1.2.2.1 Байесовские сети


Метод на основе обучения байесовской сети заключается в формировании такой сети, что каждый узел ее – это элемент, подлежащий оцениванию. У каждого узла есть конечное множество состояний – оценок соответствующего элемента. По такой модели алгоритм обучения байесовской сети определяет наилучшие предсказатели для каждого элемента, такие, что становится возможным построение дерева решений, которое в зависимости от состояния элемента-корня определяет с высокой вероятностью значение элемента-листа.

В целом, метод байесовских сетей, а также корреляционный метод работают быстрее остальных, соответственно разделяя между собой первенство на различных наборах данных.


1.2 Новостные агрегаторы

. В интернете существует большое количество программ, называемых агрегаторами. Задача приложений такого рода - собирать информацию из различных фидов и представлять её в одном месте. Пользователю, как правило, предоставляется возможность в явном виде указать источники, информацию из которых он хотел бы получать. Это создает существенные проблемы, в условиях обилия источников. Алгоритмы фильтрации реализованные в этих системах, как правило, достаточно примитивны и позволяют пользователю только фильтровать уже выбранные им источники по ключевым словам.

Существует 2 основных подхода к созданию подобных систем. Первым является создание портала с базой данных, на котором могут регистрироваться пользователи. Портал сам имеет предопределенный набор источников, а так же позволяет пользователям регистрировать свои. Фоновый процесс, запущенный на сервере, непрерывно сканирует источники в поисках новостей и заносит появившиеся новости в базу данных. Примером такой системы является портал newsgator.com. Другим подходом является создание клиентских приложений, хранящих информацию на компьютере пользователя (Microsoft Outlook, Firefox Reader…).

ГЛАВА 2: Постановка задачи


Рассмотрим задачу адаптивного отображения информации блогов. В интернете существует ряд порталов, пользователи которых пишут блоги. Это livejournal.com, blogspot.com и многие другие. Блог предоставляет возможность выплеснуть на бумагу свои мысли каждому человеку. В большинстве своем, блоги не имеют тематики и в них попадает все, что приходит в голову человеку. Пользователи этих порталов читают блоги друг друга. Некоторые блоги имеют по несколько тысяч читателей. Авторы таких блогов, зачастую, получают предложения о сотрудничестве от газет и журналов.

В соответствии с [1] существует 2 теории описывающие поведение пользователя, читающего новости. Одна говорит, что чтение новостей преследует цель получения конкретной информации. Другая – что процесс чтения доставляет удовольствие сам по себе. В случае блогов, очевидно работает первая теория.

Рассматривается задача, построить систему, позволяющую пользователю находить интересные для себя блоги и следить за новостями, публикуемыми в них.

Пусть у нас есть множество источников новостей S и множество пользователей A. Каждый источник j в момент времени k поставляет некий набор новостей, news(k,j). Предположим, что пользователь a заинтересуется новостью из источника j c вероятностью p(a,j). Задачей является разработать алгоритм, который бы выбирал источники, которые мы будем показывать. Пусть мы можем показать на странице не более t новостей, и нам надо добиться того, что бы пользователь просмотрел как можно большее число новостей из показанных. Следует всегда показывать все новости одного источника, доступные в данный момент времени, так как вероятности просмотра их равны и считаются независимыми. Через каналы RSS и ATOM не передается вес конкретной новости. Выпишем целевую функцию



Здесь click(a,k) – случайная величина, отображающая количество кликов пользователя a в момент времени k. Функция - характеристическая функция, принимающая значение 1, в случае, если в момент времени k пользователю a показывается источник j.

Оптимально было бы выбирать для показа источники с наибольшей величиной p, однако эти величины не известны заранее. Их необходимо восстановить из наблюдений. После каждой сессии k система получает в качестве обратной связи те новости, по которым кликнул пользователь.

ГЛАВА 3: Основной алгоритм


В рекомендательных системах, как правило, используются CF и CBF алгоритмы (см Главу 1), а так же методы комбинирующие эти два подхода. Поставленная в работе задача существенно отличается от классической. Во-первых, она ориентирована в большей степени на источники в виде блогов, что делает затруднительным использование CBF подхода в силу того, что интересы пользователя при чтении таких источников не связаны напрямую с тематикой. Как правило, пользователя в большей степени привлекают стиль автора и его жизненная позиция. Прямое использование методов CF было бы не эффективным, так как оно не учитывает принадлежность двух новостей к одному источнику, таким образом, имея более низкую эффективность, а так же столкнулось бы с проблемой редкозаполненности матрицы интересов, связанной с тем что количество новостей значительно превышает количество источников. Предлагаемый мной алгоритм, является адаптацией алгоритмов collaborative filtering к модели с источниками, поставляющими последовательность новостей.

Алгоритм оперирует с вектором предпочтений пользователя va. Этот вектор, изначально заполняется в соответствии с анкетированием, проведенным при регистрации. Анкета нового пользователя сравнивается с анкетами других пользователей, уже пользующихся системой и его интересы получаются как взвешенная сумма интересов этих пользователей. J-й элемент вектора соответствует значению интереса пользователя a к источнику j. Алгоритм итеративно уточняет значение этого вектора, основываясь на наблюдениях за реакциями пользователя. Во время k-й сессии, мы показываем top самых рейтинговых для него источников, для которых есть новости. Оставшееся место на ленте занимают новостные источники, подобранные при помощи collaborative filtering, проведенного корреляционным алгоритмом, примененным к векторам v.


3.1 Алгоритм пересчета интересов на основе реакции пользователя.


Более формально: пусть - вектор интересов пользователя a в момент времени k. Конкретные значения элементов данного вектора нам не важны. Важно их значение относительно других элементов. Начальное приближение этого вектора строится по анкете. В дальнейшем они пересчитываются рекуррентно по формуле приведенной ниже. Пусть во время сессии k мы показали Items_Shown новостей из источника j. Пользователя заинтересовали Items_Clicked из них. - интерес пользователя к источнику j. Рекуррентная формула пересчета выглядит следующим образом:

(1)

Здесь - коэффициент затухания, используемый для того, что бы быстро отслеживать изменения интересов пользователя. На рисунке ниже приведен результат моделирования этого алгоритма:





Рисунок 2 Результаты моделирования алгоритма

Здесь моделировалось 3 источника новостей, поставляющих во время каждой итерации 1 новость. Коэффициент затухания был взят равным 0,97. В течение первых 30 итераций пользователь интересовался новостью из первого источника с вероятностью 80%, из второго 50%, из третьего 30%. Легко видеть, что алгоритм сразу упорядочивает данные источники в правильном порядке. Затем, после 30й итерации, интересы пользователя изменяются. Вероятности становятся 40%, 70% и 30% соответственно. Из графика следует, что после 10 итераций система снова получила правильное представление о порядке интересов пользователя. После 60 хода интересы пользователя меняются в очередной раз и становятся соответственно 30%, 70% и 90%. После 16 итераций данный алгоритм вновь упорядочил источники в правильном порядке. Таким образом, алгоритм показывает высокую скорость адаптации к меняющимся интересам пользователя. Легко понять, что данный алгоритм асимптотически упорядочивает источники в правильном порядке (мат. ожидание последовательности величин генерируемых им для фиксированного источника существует и конечно, и, при условии что вероятность клика для одного источника больше чем для другого, мат ожидание данной величины для него так же будет больше).

В работе [4] приведен алгоритм, адаптация которого к решаемой задаче приводит следующей формуле:

(2)



Рисунок 3 Результаты алгоритма, приближающего вероятности

На рисунке 3 приведен результат моделирования данного алгоритма. Его траектории, хотя и стремятся асимптотически к вероятностям и имеют более низкую дисперсию, он как следует из экспериментов, имеет намного более низкую скорость сходимости.


3.2 Алгоритм выбора новостных источников для показа пользователю


Задача поиска источников новостей интересных пользователю осложняется количеством источников. Для того что бы алгоритм, приведенный в предыдущем разделе, собрал статистику по всем агентствам потребовались бы десятки лет. Для преодоления этой проблемы в данной работе были использованы алгоритмы групповой фильтрации. В соответствии с [3] наилучшим образом с задачей групповой фильтрации новостей справляется Memory Based алгоритм с весами равными корреляции пользовательских векторов. В целом, Memory Based методы характеризуются возможностью эффективной реализации на базе данных, что так же является достоинством данного алгоритма для систем с большим количеством пользователей.

Рассмотрим алгоритм, описываемый следующими двумя формулами





Здесь мы считаем, что пользователь определил свои оценки по формуле (1), приведенной в предыдущем разделе.

Итак, в начале каждой пользовательской сессии мы имеем вектор явных оценок пользователя и вектор , полученный при помощи алгоритма групповой фильтрации. Необходимо выбрать k источников, которые будут показаны пользователю. Все источники новостей с точки зрения данного пользователя находятся в одном из состояний, показанных на диаграмме приведенной ниже:



Рисунок 4 состояния источника

Источник, о котором пользователь ничего не знает, находится в состоянии NonObserved. Группа Newbie имеет фиксированный размер и в нее попадают источники из NonObserved, получившие самый высокий рейтинг по алгоритму групповой фильтрации. Попавший в группу Newbie получает va,i равный . В состоянии Newbie каналы находятся в течение 4х сессий после попадания в него, в которых они были отражены. Этого времени должно хватить пользователю для оценки контента. После истечения 4х сессий, источник переходит или в interesting или в NotInteresting в зависимости от величины интереса к нему со стороны пользователя. В состоянии Interesting находятся те каналы, которые имеют наибольший интерес пользователя. Из него поток перейти в состояние NotInteresting в случае падения величины интереса к нему. Состояния banned и favorite получаются в результате явных воздействий пользователя (нажатие кнопок add to favorite и ban). В этих состояниях канал находится вне зависимости от того, какие показатели по нему дают алгоритмы.

Алгоритм отображения работает следующим образом: каналы группы preferred и interesting отображаются всегда, когда в них есть новости. Если не хватает этих каналов, добавляются каналы в состоянии Newbie.

ГЛАВА 4: Реализация подхода


Описанный выше алгоритм, в рамках дипломной работы был реализован на языке Java с использованием технологий Hibernate, JSF, JDBC, AJAX, Java Servlets, сервлет-контейнера Tomcat и сервера базы данных hypersonic SQL.

В момент start-up контейнера инициируется процесс загрузки потоков в базу данных. Каждый поток опрашивается с фиксированной частотой и новые сообщения из него добавляются в базу. Работа с потоками организована при помощи библиотеки Rome, что позволяет поддерживать большинство версий стандартов RSS и Atom. База данных, реализованная на hsql, имеет структуру приведенную ниже



После аутидентификации пользователя в системе, ему показывается дерево, в узлах которого находятся источники новостей, а в листьях сами новости. Нажав на узел дерева можно посмотреть все содержимое новости, в конце которого идет ссылка на полный текст.

При клике на определенную новость соответствующая запись добавляется в таблицу user_click. Повторный просмотр одной и той же новости игнорируется. В момент окончания сессии происходит пересчет таблицы user_interest, отображающей отношение пользователя к данному агентству. Поле v соответствует значению vaj, отображая, таким образом, собственный интерес пользователя к источнику, поле p соответствует величине полученной при групповой фильтрации. Таблица user_interest_state является справочником, хранящие состояния с диаграммы описанной выше.

Все взаимодействия с базой данных осуществляются через ORM библиотеку Hibernate, позволяющую быстро вносить изменения в структуру данных и перегенерировать схему БД в соответствии с ними. Пользовательский интерфейс написан при помощи свободно распространяемой реализации стандарта JSF ICEFaces. Данная реализация позволяет получить AJAX представление без написания JavaScript кода, собирая страничку из готовых компонент. Аутидентификация проводится встроенными средствами Tomcat.


Все библиотеки и приложения, использованные для создания дипломного проекта, имеют открытый исходный код и распространяются под различными вариантами свободной лицензии, позволяющими использовать полученное приложение в коммерческих целях.


Заключение


В ходе написания дипломной работы были исследованы различные подходы к работе с потоками новостных данных, и рассмотрены 2 широких класса приложений: RSS агрегаторы и адаптивные фильтры новостей. Была разработана система, сочетающая свойства этих двух категорий приложений. Существенным отличием от других подобных систем (см [5]), данная система построена на основе групповой фильтрации, что делает её намного более пригодной для пользователей, которые читают статьи, не связанные с их профессиональной деятельностью, а в попытке узнать что-то интересное и приятно провести время. Были разработаны как алгоритмы, так и реализация данного подхода и пользовательский интерфейс.

После дизайнерской переработки интерфейса планируется открыть проект для свободного доступа в интернете в виде портала. Так же планируется выделение адаптивных алгоритмов в отдельный сервис, для возможности экспериментирования с другими реализациями. Для этого предлагается использовать систему, описанную в [7].



Литература


  1. Dozier D, Rice R. Rival theories of electronic newsreading The new media sage publications. London. 1984

  2. Balabanovic, M. and Shaham, Y. Fab. Content-Based, Collaborative Recommendation. CACM. 40(3):66-72, March 1997.

  3. Robin van Meteren. Using Context based filtering for recommendation

  4. Breese J.S., Heckerman D. and Kadie C., Empirical Analysis of Predictive Algorithms for Collaborative Filtering. In Proceedings 14th Conference on Uncertainty in Artificial Intelligence, Madison WI. Morgan Kauffman, 1998.

  5. Singh, Shepherd, Duffy, Watters. An Adaptive User Profile for Filtering News Based on a User Interest Hierarchy

  6. http://www.feedrinse.com/

  7. http://newsgator.com

  8. Вахитов А. Т., Сервис для моделей оптимизации на основе рекуррентных алгоритмов. Дипломная работа, каф. системного программирования математико-механического факультета СПбГУ, 2007

  9. Resnic, Iacovou, Sushak. An open architecture for collaborative filtering of news, 1994



База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница