Имате проблеми с ИИ или разработката на пълен пакет? Нашите експерти са тук, за да ви напътстват: индивидуални съвети, техническа интеграция и др. Свържете се с [email protected].

Контекстуално насочване за рекламиране, съобразено с поверителността, благодарение на API за обработка на естествен език за класификация на текст

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

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

Не проследявайте потребителя, а интересите

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

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

Насочване към контекста

Тъй като рекламодателите няма да могат да таргетират индивидуални потребители с помощта на бисквитки на трети страни, лесно прогноза е, че кампаниите за контекстна реклама отново ще се увеличат. Това може да бъде единственият начин за насочване на потребителите интереси в достатъчно голям мащаб. Контекстните реклами се основават на съдържанието, което потребителят разглежда в момента, а не от историята на браузъра или поведенческия му профил.

Контекстно рекламиране
(снимка от Какво е контекстуално реклама?)

Предполага се, че това ще бъде по-интересно за потребителите, тъй като те ще виждат реклами, които съответстват на темата на уебсайта, който посещават.

Дайте ми етикет

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

Първите опити за автоматизиране на този процес в миналото са довели до повече или по-малко смешни провали:

Неправилно контекстуално рекламиране
(снимка от Лоши рекламни места Забавно, Ако не е твоя)

Класификация на текстовете на статиите

За щастие напредъкът в обработката на естествен език позволява много по-точни съвпадения за по-малко време. Класификацията на текстове е присвояване на категории или етикети, съответстващи на съдържанието на текста.

Нека разгледаме примерна страница със статии на различни теми:

Поставяне на реклами

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

Условия, на които трябва да отговаря нашето решение:

Обърнете внимание, че рекламните системи и разработването на уеб са извън обхвата на тази статия, но общите концепции остават същите, независимо от използваните инструменти и технологии.

API за класификация на текст

Предпочитаното от мен решение в такива случаи е да отделя логиката, която обработва класификацията на текста, в отделен API. Имаме две възможности: да го създадем сами или да използваме готово решение.

Изготвянето на прост механизъм за класификация на текст с помощта на Python и библиотеки за обработка на естествен език е задача за един следобед. Но възниква проблем по отношение на точността и обслужването на увеличения трафик. Трябва по някакъв начин да се справим с нарастващата потребителска база и потока от кликове.

Ако сте собственик на уебсайт, едва ли ще искате да си играете с настройката и оценката на моделите за машинно обучение. Затова ще делегираме колкото се може повече на външно решение. Обърнете внимание, че тук не планираме да изпращаме никакви потребителски данни, а само данни, принадлежащи на уебсайта. Това прави използването на външни инструменти за контекстуално таргетиране много по-просто от гледна точка на поверителността на потребителите.

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

Модели на NLP Cloud

С помощта на 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 за класификация от NLP Cloud се справя доста добре с маркирането на текстове, така че можем да повторим целия процес, като този път имаме предвид да изключим текстове с дадена тема от излъчване на банери върху тях (вижте страницата на API за класификация на текст)

Хартиен самолет

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