Контекстные головоломки
Сейчас ломаю голову как показывать баннеры в контекстной сети. Вопрос делится на два возможных варианта: показ рекламы в контекстной сети на подобии Adsense, бегун или директ (где выбирается заданное количество объявлений подходящих по ключевым словам для данной страницы) и показ в контекстной сети на подобии videoclick или автоконтекста бегуна (где линкуются ключевые фразы на странице, при наведении на которые, показывается реклама).
В обоих вариантах есть общие вещи, но есть и различия. В первом варианте кампании не конфликтуют друг с другом, а просто выбираются на основе каких-то приоритетов (скорее всего по ECPM, количеству заработанных денег за тысячу показов), а во втором легко может произойти конфликт, когда одна или более кампаний “дерутся” за одно слово или фразу.
Как бы я реализовал первый вариант. При поступлении запроса от пользователя, по URL получаем “карту слов” страницы. У меня эта “карта слов” представляет собой словарь (map), ключами которой являются основы слов, а значениями — другие словари, в которых ключами являются позиции слов в документе, а значениеми — непосредственно сами слова. Далее мы строим пересечение ключевых слов кампаний с “картой слов” страницы. В результате пересечения мы получаем список кампаний, подходящих для данной страницы. Строим некоторую приоритетную очередь и кешируем эти данные. После чего выбираем кампании согласно приоритетам и отдаём их в ответ на запрос пользователя. Ничего особо сложного тут не вижу
Несколько иначе обстоят дела со вторым вариантом. Слова и фразы могут конфликтовать. Как тут быть. Пока я придумал только один вариант решения задачи. Мы так же получаем “карту слов”, строим пересечение с ключевыми словами кампаний, но этого нам мало для определение какие кампании показать. Нам нужно знать какие слова и фразы “залинковать” и избежать при этом конфликтов. Как я предполагаю это сделать? Во время пересечения, помимо прочего, мы для каждой кампании запоминаем все позиции подходящих слов и фраз в документе. После так же строится приоритетная очередь. При выборе какие кампании показать, мы последовательно двигаемся по очереди. Если кампания подходит по ограничениям, мы берём первое слово/фразу в документе, запоминаем позицию слова/фразы которую мы выбрали (для фразы это будет набор позиций) ипереходим к следующей кампании в очереди. Снова проверяем ограничения и, выбираем первое слово/фразу которое подходит, но не пересекается теми позициями, которые мы запомнили на предыдущем шаге. Таким образом мы двигаемся по очереди и выбираем то количество кампаний, которое нам необходимо. Очередь, полагаю, должна быть циклической и мы должны запоминать, какую последнюю кампанию мы показали, чтобы при следующем запросе начать со следующего элемента.
Вот такие у меня мысли. За кадром осталось множество неосвещённых вопросов: откуда берётся “карта слов”, как мы синхронизируем наполнение кеша между потоками, как построить приоритетную очередь по ECPM и т.п. Всё это будущие мысли, а пока я изложил то о чём думаю сейчас. Скорее даже систематизировал для себя
Tags: контекст, крутилка, программирование



На highload был доклад по контексту бегуна от Александра Панкова. Он говорил, что они заранее индексируют страницы и составляют список наиболее подходящих объявлений. Если же страницы не найдено в индексе, то они отправляют ее на индексацию(асинхронно), а юзеру показывают РО по поведенческому алгоритму(но тут я могу ошибаться, не помню точно).
У них довольно мощная система индексации, кстати
Это как свой поисковичек написать :-))
Смотрел этот доклад, но урывками, меня больше интересовала архитектура
Я считаю что индексировать надо в момент прихода запроса. Ведь не известно где будет стоять код и на какую страницу придёт пользователь, заранее всё закешировать может только гугл с яндексом и т.п.
У меня была одна реализация, которая кешировала страницы асинхронно, но мне совершенно не понравилось, что в такой схеме минимум первый запрос остаётся без адекватного ответа.
По поводу списка объявлений, наверное всё не так просто, ведь объявления постоянно добавляются/удаляются/изменяются.
Эх, сколько интересных задач маячит на горизонте