Затрудняетесь с ИИ или разработкой полного стека? Наши эксперты готовы помочь вам: индивидуальные консультации, техническая интеграция и многое другое. Обращайтесь по адресу [email protected].

Контекстный таргетинг для рекламы с учетом конфиденциальности благодаря классификации текста API обработки естественного языка

Article by Rafał Rybnik, Руководитель отдела разработки программного обеспечения в Instytut Badań Pollster

Контекстная реклама
Если не указано иное, все фотографии в статье принадлежат автору.

Не отслеживайте пользователя, отслеживайте интересы

В сегодняшней реальности онлайн-рекламы эффективные маркетинговые тактики опираются на различные методы отслеживания пользователей такие как сторонние файлы cookie (и альтернативные хранилища) и отпечатки пальцев устройств. Но в мире утечек данных, GDPR, CCPA и вдохновленного ими законодательства о защите данных, такой подход становится неактуальным. подход становится устаревшим. Safari и Firefox уже имеют встроенные решения для уменьшения межсайтового отслеживания. Chrome также работает над альтернативами. Таким образом, конец сторонним файлам cookie уже не за горами. Идентификатор Apple для Advertisers (IDFA) скоро будет доступен только для приложений с явным согласием пользователя. The исчезновение возможности междоменного отслеживания заставляет рекламодателей вернуться к контекстной рекламе.

В этой статье я покажу вам, как реализовать контекстное таргетирование на основе API классификации текста. предоставляемого NLP Cloud. Описанный здесь подход может быть легко адаптирован к любым рекламным технологиям (таких как рекламные серверы, OpenRTB и т.д.).

Контекстное таргетирование

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

Контекстная реклама
(фотография из Что такое контекстная Реклама?)

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

Дайте мне метку

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

Первые попытки автоматизировать этот процесс в прошлом приводили к более или менее уморительным промахам:

Некорректная контекстная реклама
(фотография из Неудачное размещение рекламы - это смешно, Если не твой)

Классификация статей по тексту

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

Рассмотрим пример страницы со статьями на различные темы:

Размещение рекламы

Наша цель состоит в том, чтобы рекламные объявления отображали баннеры, тематически связанные с содержанием статьи.

Условия, которым должно удовлетворять наше решение:

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

API классификации текста

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

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

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

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

Облачные модели NLP

С помощью NLP Cloud API вы можете попробовать, какой алгоритм может быть полезен для конкретного бизнес-кейса.

Интегрировать классификацию текста с содержанием веб-сайта

Поскольку бэкэнд сайта основан на Python (Flask), мы начнем с написания простого клиента для обработки естественного языка API:

import pandas as pd
import requests
import json


class TextClassification:
    def __init__(self, key, base='https://api.nlpcloud.io/v1/bart-large-mnli',):
        self.base = base
        self.headers = {
            "accept": "application/json",
            "content-type": "application/json",
            "Authorization": f"Token {key}"
        }

    def get_keywords(self, text, labels):
        url = f"{self.base}/classification"
        payload = {
            "text":text,
            "labels":labels,
            "multi_class": True
        }

        response = requests.request("POST", url, json=payload, headers=self.headers)
        result = []
        try:
            result = dict(zip(response.json()['labels'], response.json()['scores']))
        except:
            pass
        return result
        
tc = TextClassification(key='APIKEY')

print(
    tc.get_keywords(
        "Football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal. Unqualified, the word football normally means the form of football that is the most popular where the word is used. Sports commonly called football include association football (known as soccer in some countries); gridiron football (specifically American football or Canadian football); Australian rules football; rugby football (either rugby union or rugby league); and Gaelic football.[1][2] These various forms of football share to varying extent common origins and are known as football codes.",
        ["football", "sport", "cooking", "machine learning"]
    )
)

Results:

{
    'labels': [
        'sport', 
        'football', 
        'machine learning', 
        'cooking'
    ], 

    'scores': [
        0.9651273488998413, 
        0.938549280166626, 
        0.013061746023595333, 
        0.0016104158712550998
    ]
}

Очень хорошо. Каждому ярлыку присваивается его соответствие теме без особых усилий.

Планируется, что выбор баннеров для показа будет осуществляться системой подачи объявлений (решение будет основано на оценках индивидуально присвоенных меток). Поэтому, чтобы не раскрывать API ключи и иметь больший контроль над данными, мы напишем простой прокси:

@app.route('/get-labels',methods = ['POST'])
def get_labels():
    if request.method == 'POST':
        try:
            return tc.get_keywords(request.json['text'], request.json['labels'])
        except:
            return []

Кампании

Предположим, что нам нужно запустить 3 рекламные кампании:

Ad placement
Страховая компания (ключевое слово: insurance)

Ad placement
Компания по возобновляемым источникам энергии (ключевое слово: renewables)

Ad placement
Парикмахер (ключевое слово: good look)

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

function displayAd(keyword, placement_id) {

    var conditions = {
        false: ' ',
        "insurance": ' ',
        "renewables": ' ',
        "good look": ' '
    }

    var banner = document.querySelector(placement_id);
    banner.innerHTML = conditions[keyword];

}

Это наш сервер объявлений 🤪

Теперь, используя fetch, мы получим метки для текста статьи, которые мы получаем с помощью ее селектора:

var text = document.querySelector("#article").textContent;
var labels = ["insurance", "renewables", "good look"];

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"text":text,"labels":labels});

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
};

fetch("http://127.0.0.1:5000/get-labels", requestOptions)
    .then(response => 
    response.json()
    )
    .then(result => {
    if (result == []){
        console.log("self-promote");
        displayAd(false, "#banner");
    } else {
        var scores = result['scores'];
        var labels = result['labels'];

    if (Math.max(...scores) >= 0.8) {
        console.log("Ad success");
        var indexOfMaxScore = scores.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);
        displayAd(labels[indexOfMaxScore], "#banner");

    } else {
        displayAd(false, "#banner");
    }
    }
    })
    .catch(error => console.log('error', error));

Обратите внимание, что мы показываем рекламу клиента только в том случае, если показатель выше 0,8:

Math.max(…scores) >= 0.8

В противном случае мы демонстрируем саморекламу.

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

Размещение рекламы
Новости о возобновляемых источниках энергии подходят к объявлениям о фотоэлементах.

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

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

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

Производительность

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

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

Однако решение, основанное на отдельном API, который мы можем подать на любой текст и получить его метки, дает нам возможность использовать JS-код практически на любой странице в режиме реального времени, даже без доступа к бэкенду!

Выводы

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

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

Бумажный самолетик

Спасибо, что прочитали. Я надеюсь, что вы получили такое же удовольствие от чтения, как и я от написания этой книги для вас.