Article by Rafał Rybnik, 소프트웨어 개발 책임자 at 인스티튜트 바다 여론조사 기관

달리 명시되지 않는 한, 기사의 모든 사진은 저자가 직접 촬영한 것입니다.
오늘날의 온라인 광고 현실에서 효과적인 마케팅 전략은 제3자 쿠키, 디바이스 지문과 같은 다양한 사용자 추적 타사 쿠키(및 대체 저장소) 및 디바이스 핑거프린팅과 같은 다양한 기술을 활용합니다. 하지만 데이터 유출, GDPR, CCPA, 그리고 이를 기반으로 한 데이터 보호 법안이 강화되는 상황에서 이러한 접근 방식은 접근 방식은 더 이상 쓸모가 없습니다. Safari와 Firefox는 이미 사이트 간 추적을 줄이기 위한 솔루션을 내장하고 있습니다. Chrome도 대안을 마련하고 있습니다. 따라서 타사 쿠키의 종말은 곧 다가올 것입니다. Apple의 광고주 식별자 광고주 식별자(IDFA)는 곧 사용자의 명시적 동의가 있는 앱에만 액세스할 수 있게 됩니다. 교차 쿠키의 도메인 간 추적 가능성이 사라짐에 따라 광고주들은 문맥 맞춤형 광고로 돌아갑니다.
이 문서에서는 NLP 클라우드에서 제공하는 텍스트 분류 API를 기반으로 컨텍스트 타겟팅을 구현하는 방법 를 기반으로 문맥 타겟팅을 구현하는 방법을 설명합니다. 여기서 설명하는 접근 방식은 모든 광고 기술(예: 광고 서버, OpenRTB 등)에 쉽게 적용할 수 있습니다. (광고 서버, OpenRTB 등)에 쉽게 적용할 수 있습니다.
광고주가 타사 쿠키를 사용하여 개별 사용자를 타겟팅할 수 없기 때문에, 쉽게 예측할 수 있는 문맥 광고 캠페인이 다시 증가할 것으로 예측됩니다. 이는 충분한 규모로 사용자의 관심사를 타겟팅할 수 있는 타겟팅할 수 있는 유일한 방법일 수 있습니다. 문맥 광고는 사용자가 브라우저 기록이 아닌 지금 보고 있는 콘텐츠를 기반으로 합니다. 현재 보고 있는 콘텐츠를 기반으로 합니다.

(사진 출처 컨텍스트 광고란?
광고란?)
사용자가 방문하는 웹사이트 페이지의 주제와 일치하는 광고가 표시되므로 사용자에게 더 흥미로울 것입니다. 주제와 일치하는 광고를 보게 되므로 사용자가 더 흥미를 느낄 것입니다.
대부분의 광고 게재 기술 및 광고 네트워크는 광고 게재 시 키워드 또는 태그 전달을 지원합니다. 키워드 또는 태그 전달을 지원합니다. 텍스트는 웹의 핵심이며 매우 풍부한 정보 소스가 될 수 있습니다. 하지만 광고나 추천 등의 목적으로 텍스트에서 문맥, 태그, 키워드를 추출하는 것은 어렵고 시간이 많이 소요될 수 있습니다. 하지만 중형 뉴스 사이트의 소유자라면 편집팀에서 할당하는 몇 개의 태그를 넘어서는 몇 가지 태그만으로는 관련 주제를 모두 추출하기 어려울 것입니다.
이 프로세스를 자동화하려는 첫 번째 시도는 과거에 다소 웃지 못할 실수를 초래했습니다:

(사진 출처 잘못된 광고 게재 위치가 웃기다,
당신의 것이 아니라면)
다행히 자연어 처리의 발전으로 더 짧은 시간에 훨씬 더 정확한 매칭이 가능해졌습니다. 텍스트 분류는 텍스트 콘텐츠와 일치하는 범주 또는 레이블을 할당하는 것입니다.
다양한 주제에 대한 글이 있는 예제 페이지를 살펴보겠습니다:
트위터의 목표는 기사 콘텐츠와 관련된 주제별 배너가 광고 게재 위치에 표시되도록 하는 것입니다.
솔루션이 충족해야 하는 조건:
광고 시스템과 웹 개발은 이 문서의 범위를 벗어나지만, 일반적인 개념은 일반적인 개념은 사용되는 도구와 기술에 관계없이 동일하게 유지됩니다.
이러한 경우 제가 선호하는 해결책은 텍스트 분류를 처리하는 로직을 별도의 API로 별도의 API로 분리하는 것입니다. 직접 만들거나 기성 솔루션을 사용하는 두 가지 옵션이 있습니다.
Python과 자연어 처리 라이브러리를 사용하여 간단한 텍스트 분류 엔진을 준비하는 것은 오후에 할 수 있는 작업입니다. 하지만 문제는 정확도와 트래픽 증가에 따른 서비스 제공 측면에서 발생합니다. 늘어나는 사용자 기반과 그들의 클릭 스트림을 어떻게든 처리해야 합니다.
웹사이트 소유자라면 머신러닝 모델 튜닝 및 평가에 직접 참여하고 싶지 않을 것입니다. 따라서 가능한 한 많은 부분을 외부 솔루션에 위임할 것입니다. 여기에는 사용자 데이터는 전송하지 않고 웹사이트에 속한 데이터만 전송할 계획입니다. 이렇게 하면 사용자 개인정보 보호 관점에서 외부 문맥 타겟팅 도구를 훨씬 더 간단하게 사용할 수 있습니다.
NLP Cloud는 머신 러닝 모델을 사용하여 텍스트 처리를 위한 여러 API를 제공합니다. 이 중 하나는 텍스트 분류기입니다, 간단한 구현 측면에서 유망해 보이는 텍스트 분류기입니다. (문서 보기).
NLP 클라우드 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)
적절한 광고 소재의 표시를 관리하는 프런트엔드 메커니즘을 스케치해 보겠습니다.
function displayAd(keyword, placement_id) {
var conditions = {
false: '
',
"insurance": '
',
"renewables": '
',
"good look": '
'
}
var banner = document.querySelector(placement_id);
banner.innerHTML = conditions[keyword];
}
광고 서버입니다. 🤪
이제 가져오기를 사용하여 선택기를 사용하여 가져온 글의 텍스트에 대한 레이블을 검색합니다:
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 코드를 사용할 수 있습니다. 백엔드!
문맥 타겟팅을 사용할 때 가장 어려운 점은 뉴스 웹사이트에서 문맥 타겟팅을 사용하는 것입니다. 뉴스 웹사이트에 게시되는 기사에는 광고주의 업종과 관련된 주제를 포함하여 많은 주제가 게시됩니다. 하지만 동시에, 선정적이고 종종 슬픈 분위기를 풍기는 기사들은 광고하기에는 좋지 않습니다.
반면 NLP Cloud의 텍스트 분류 API는 반면에 텍스트에 태그를 지정하는 데 매우 효과적입니다. 전체 프로세스를 반복하되, 이번에는 특정 주제가 있는 텍스트는 배너가 표시되지 않도록 제외하는 것을 염두에 두고 배너가 표시되지 않도록 합니다. (텍스트 분류 API 페이지 참조)

읽어주셔서 감사합니다. 제가 이 글을 쓰면서 즐거웠던 만큼 여러분도 즐겁게 읽으셨기를 바랍니다.