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

Якщо не вказано інше, всі фотографії в статті належать автору.
У сучасних реаліях інтернет-реклами ефективні маркетингові тактики покладаються на різноманітні методи відстеження користувачів, такі як таких як сторонні файли cookie (та альтернативні сховища) та дактилоскопіювання пристроїв. Але у світі витоків даних світі витоків даних, GDPR, CCPA та посилення законодавства про захист даних, натхненного ними, цей підхід стає застарілим. Safari та Firefox вже мають вбудовані рішення для зменшення міжсайтового відстеження. Chrome також працює над альтернативами. Отже, кінець сторонніх файлів cookie не за горами. Apple's Identifier for Advertisers (IDFA) незабаром буде доступний тільки для додатків з явною згодою користувача. Зникнення можливості перехресного Зникнення можливості міждоменного відстеження змушує рекламодавців повертатися до контекстної реклами.
У цій статті я показую, як реалізувати контекстний таргетинг на основі API класифікації текстів що надається NLP Cloud. Описаний тут підхід може бути легко адаптований до будь-яких рекламних технологій (таких як рекламні сервери, OpenRTB і т.д.).
Оскільки рекламодавці не зможуть таргетувати окремих користувачів за допомогою сторонніх файлів cookie, можна легко спрогнозувати прогнозується, що контекстні рекламні кампанії знову зростатимуть. Це може бути єдиним способом орієнтуватися на інтереси користувачів інтереси користувачів у досить великому масштабі. Контекстна реклама базується на контенті, який користувач переглядає в даний момент, а не на історії браузера або поведінковому профілі.

(фото з Що таке контекстна реклама
Реклама?)
Очікується, що це буде цікавіше для користувачів, оскільки вони бачитимуть рекламу, яка відповідає тематиці сторінок сайту, які вони відвідують. сторінок сайту, які вони відвідують.
Більшість технологій показу оголошень і рекламних мереж підтримують передачу ключових слів або тегів під час показу оголошень під час показу кодів оголошень. Текст є основою Інтернету і може бути надзвичайно багатим джерелом інформації. Однак, вилучення з нього контексту, тегів і ключових слів, наприклад, для рекламних або рекомендаційних цілей, може бути важким і трудомістким. Але якщо ви власник навіть середнього за розміром новинного сайту, крім кількох тегів, виділених редакцією виділених редакцією, буде складно витягти всі релевантні теми.
Перші спроби автоматизувати цей процес у минулому призводили до більш-менш кумедних помилок:

(фото з Погане розміщення реклами - це смішно,
Якщо не твоє)
На щастя, досягнення в обробці природної мови дозволяють отримувати набагато точніші збіги за менший час. Класифікація тексту - це присвоєння категорій або міток, що відповідають змісту тексту.
Розглянемо приклад сторінки зі статтями на різноманітну тематику:
Наша мета - щоб під час розміщення реклами відображалися банери, тематично пов'язані зі змістом статті.
Умови, яким має відповідати наше рішення:
Зауважимо, що рекламні системи та веб-розробка виходять за рамки цієї статті, але загальні концепції залишаються незмінними незалежно від але загальні концепції залишаються однаковими незалежно від використовуваних інструментів і технологій.
Моє найкраще рішення в таких випадках - відокремити логіку, яка обробляє класифікацію тексту, в окремий API. У нас є два варіанти: створити його самостійно або скористатися готовим рішенням.
Підготувати простий механізм класифікації текстів з використанням бібліотек Python та Natural Language Processing - завдання на один день. Але виникає проблема з точки зору точності та обслуговування збільшеного трафіку. Потрібно якось обробляти зростаючу базу користувачів і їх клікабельність.
Якщо ви власник веб-сайту, то навряд чи захочете гратися з налаштуванням та оцінкою моделей машинного навчання. Тому ми будемо делегувати якомога більше зовнішньому рішенню. Зверніть увагу, що ми не плануємо передавати сюди жодних даних користувачів, лише дані, що належать сайту. Це значно спрощує використання зовнішніх інструментів контекстного таргетингу з точки зору конфіденційності користувачів.
NLP Cloud є постачальником декількох API для обробки тексту з використанням моделей машинного навчання. Один з них є класифікатор текстів, який виглядає перспективним з точки зору простоти реалізації (дивіться документи).
За допомогою NLP Cloud API ви можете спробувати, який алгоритм може бути корисним для конкретного бізнес-кейсу.
Оскільки бекенд сайту побудований на Python (Flask), ми починаємо з написання простого клієнта до Natural Language Processing 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 рекламні кампанії, які потрібно запустити:
Страхова компанія (ключове слово: insurance)
Компанія з відновлюваної енергетики (ключове слово: renewables)
Перукар (ключове слово: good look)
Давайте накидаємо механізм на фронт-енді, який буде керувати відображенням відповідного креативу.
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 класифікації NLP Cloud, з іншого боку, досить добре справляється з тегуванням текстів, тому ми можемо повторити весь процес, на цей раз пам'ятаючи про те, щоб виключити тексти з заданою тематикою від показу банерів на них (див. сторінку API класифікації текстів)

Дякую, що прочитали. Сподіваюся, Вам сподобалося читати так само, як і мені було приємно писати це для Вас.