Article by Rafał Rybnik, Ръководител на отдела за разработка на софтуер в Instytut Badań Pollster

Освен ако не е посочено друго, всички снимки в статията са на автора.
В днешната реалност на онлайн рекламата ефективните маркетингови тактики разчитат на различни методи за проследяване на потребителите. техники, като например бисквитки на трети страни (и алтернативни хранилища) и пръстови отпечатъци на устройства. Но в свят на изтичане на данни, GDPR, CCPA и засилено законодателство за защита на данните, вдъхновено от тях, това подходът става остарял. Safari и Firefox вече имат вградени решения за намаляване на проследяването между сайтове. Chrome също работи върху алтернативи. Така че краят на бисквитките на трети страни е скоро. Идентификатор на Apple за рекламодателите (IDFA) скоро ще бъде достъпен само за приложения с изрично съгласие от страна на потребителя. На сайта изчезването на възможността за проследяване между домейни кара рекламодателите да се върнат към контекстуалното реклама.
В тази статия ви показвам как да приложите контекстно таргетиране въз основа на API за класификация на текст. предоставена от NLP Cloud. Описаният тук подход може лесно да се адаптира към всякакви рекламни технологии (като рекламни сървъри, OpenRTB и др.).
Тъй като рекламодателите няма да могат да таргетират индивидуални потребители с помощта на бисквитки на трети страни, лесно прогноза е, че кампаниите за контекстна реклама отново ще се увеличат. Това може да бъде единственият начин за насочване на потребителите интереси в достатъчно голям мащаб. Контекстните реклами се основават на съдържанието, което потребителят разглежда в момента, а не от историята на браузъра или поведенческия му профил.

(снимка от Какво е контекстуално
реклама?)
Предполага се, че това ще бъде по-интересно за потребителите, тъй като те ще виждат реклами, които съответстват на темата на уебсайта, който посещават.
Повечето технологии за обслужване на реклами и рекламни мрежи поддържат предаването на ключови думи или тагове по време на рекламата. кодовете за обслужване. Текстът е в основата на уеб и може да бъде изключително богат източник на информация. Въпреки това, извличането на контекст, тагове и ключови думи от него, например за целите на рекламата или препоръката, може да бъде трудно и отнема много време. Но ако сте собственик дори на среден по големина новинарски сайт, отвъд няколко тага разпределени от редакционния екип, ще бъде трудно да се извлекат всички релевантни теми.
Първите опити за автоматизиране на този процес в миналото са довели до повече или по-малко смешни провали:

(снимка от Лоши рекламни места Забавно,
Ако не е твоя)
За щастие напредъкът в обработката на естествен език позволява много по-точни съвпадения за по-малко време. Класификацията на текстове е присвояване на категории или етикети, съответстващи на съдържанието на текста.
Нека разгледаме примерна страница със статии на различни теми:
Нашата цел е рекламните места да показват банери, тематично свързани със съдържанието на статията.
Условия, на които трябва да отговаря нашето решение:
Обърнете внимание, че рекламните системи и разработването на уеб са извън обхвата на тази статия, но общите концепции остават същите, независимо от използваните инструменти и технологии.
Предпочитаното от мен решение в такива случаи е да отделя логиката, която обработва класификацията на текста, в отделен API. Имаме две възможности: да го създадем сами или да използваме готово решение.
Изготвянето на прост механизъм за класификация на текст с помощта на Python и библиотеки за обработка на естествен език е задача за един следобед. Но възниква проблем по отношение на точността и обслужването на увеличения трафик. Трябва по някакъв начин да се справим с нарастващата потребителска база и потока от кликове.
Ако сте собственик на уебсайт, едва ли ще искате да си играете с настройката и оценката на моделите за машинно обучение. Затова ще делегираме колкото се може повече на външно решение. Обърнете внимание, че тук не планираме да изпращаме никакви потребителски данни, а само данни, принадлежащи на уебсайта. Това прави използването на външни инструменти за контекстуално таргетиране много по-просто от гледна точка на поверителността на потребителите.
NLP Cloud е доставчик на множество приложни програмни интерфейси (API) за обработка на текст с помощта на модели за машинно обучение. Един от тях е класификаторът на текст, който изглежда обещаващ от гледна точка на простото изпълнение (вижте документите).
С помощта на 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 рекламни кампании, които трябва да стартираме:
Застрахователно дружество (ключова дума: insurance)
Компания за възобновяема енергия (ключова дума: renewables)
Фризьорски салон (ключова дума: 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 за класификация от NLP Cloud се справя доста добре с маркирането на текстове, така че можем да повторим целия процес, като този път имаме предвид да изключим текстове с дадена тема от излъчване на банери върху тях (вижте страницата на API за класификация на текст)

Благодарим ви, че четете. Надявам се, че четенето ви е доставило удоволствие, както и писането на този текст за вас.