Article by Rafał Rybnik, 软件开发部主任 在 巴丹民意调查所

除非另有说明,文章中的所有图片均由作者提供。
在今天的网络广告现实中,有效的营销策略依赖于各种用户跟踪 技术,如第三方cookies(和替代存储)和设备指纹。但在一个 数据泄露、GDPR、CCPA以及受其启发而增加的数据保护立法的世界中,这种方法已经过时。 这种方法已经过时了。Safari和Firefox已经内置解决方案,以减少跨网站追踪。 Chrome浏览器也在进行替代工作。因此,第三方cookie的末日很快就会到来。苹果的Identifier for 广告商的标识符(IDFA)很快将只在得到用户明确同意的应用程序中使用。在这一过程中 跨域追踪的可能性的消失,使广告商重新回到上下文的 广告。
在这篇文章中,我将向你展示如何在NLP Cloud提供的文本分类API的基础上实现上下文定位。 提供的文本分类API。这里描述的方法可以很容易地适用于任何广告技术 (如广告服务器、OpenRTB等)。
由于广告商将无法通过使用第三方cookies来定位个人用户,因此一个简单的预测是,上下文广告活动将再次崛起。 预测,上下文广告活动将再次兴起。这可能是唯一能在足够大的范围内锁定用户 这可能是在足够大的范围内锁定用户兴趣的唯一方法。上下文广告是基于用户现在正在看的内容,而不是他们的浏览器历史。 而不是他们的浏览器历史或行为档案。

(图片来自 什么是情境式
广告?)
这对用户来说应该是更有趣的,因为他们会看到与他们正在访问的网站页面的主题相匹配的广告。 他们正在访问的网站页面相匹配的广告。
大多数广告服务技术和广告网络支持在广告服务代码中传递关键词或标签。 服务代码。文本是网络的核心,可以是一个极其丰富的信息来源。然而。 从文本中提取上下文、标签和关键词,例如为了广告或推荐的目的,可能会很困难,也很耗时。 困难和耗费时间。但是,如果你是一个中等规模的新闻网站的所有者,除了编辑部分配的几个标签之外 的标签,就很难提取所有相关的主题。
过去首次尝试将这一过程自动化的结果是,或多或少地出现了一些搞笑的错误。

(图片来自 糟糕的广告投放很有趣。
如果不是你的)
幸运的是,自然语言处理方面的进展允许在更短的时间内实现更准确的匹配。 文本分类是指分配符合文本内容的类别或标签。
让我们考虑一个有各种主题的文章的页面例子。
我们的目标是让广告位显示与文章内容相关的主题性横幅。
我们的解决方案必须满足的条件。
请注意,广告系统和网络开发不在本文的范围内,但无论使用何种工具和技术,一般的概念都是一样的。 但无论使用何种工具和技术,一般概念都是一样的。
在这种情况下,我的首选解决方案是将处理文本分类的逻辑分离到一个 独立的API。我们有两个选择:自己创建或者使用一个现成的解决方案。
使用Python和自然语言处理库准备一个简单的文本分类引擎是一个下午的任务。但问题出现在准确性和为增加的流量服务方面。我们需要以某种方式处理不断增长的用户群和他们的点击流。
如果你是一个网站所有者,你不太可能想玩机器学习模型的调整和评估。因此,我们将尽可能多地委托给一个外部解决方案。请注意,我们不打算在这里发送任何用户数据,只有属于网站的数据。这使得从用户隐私的角度来看,使用外部情景定位工具要简单得多。
NLP云是一个使用机器学习模型进行文本处理的多个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)
让我们在前端勾画一个机制,它将管理一个适当的创意的显示。
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代码,甚至不需要访问后台 后台!
使用上下文定位的最大挑战是在新闻网站上使用它。许多主题出现在 的文章中出现,包括那些与广告商的行业一致的话题。但同时 但与此同时,它们所包含的耸人听闻、往往带有悲伤色彩的故事并不是做广告的好地方。 广告。
文本 另一方面,NLP Cloud的文本分类API在标记文本方面做得非常好,所以 我们不妨重复整个过程,这一次要记住排除具有特定主题的文本 的文本。 (见文本分类API页面)

谢谢你的阅读。我希望你喜欢阅读,就像我喜欢为你写这个一样。