Está a ter dificuldades com a IA ou com o desenvolvimento full-stack? Os nossos especialistas estão aqui para o orientar: aconselhamento personalizado, integração técnica e muito mais. Entre em contacto com [email protected].

Visada contextual para uma publicidade favorável à privacidade graças à classificação de texto Natural Language Processing API

Article by Rafał Rybnik, Chefe de Desenvolvimento de Software em Instytut Badań Pollster

Publicidade contextual
Salvo indicação em contrário, todas as fotografias do artigo são da autoria do mesmo.

Não siga o utilizador, siga os interesses

Na realidade actual da publicidade online, as tácticas de marketing eficazes dependem de uma variedade de rastreio do utilizador técnicas, tais como cookies de terceiros (e armazenamentos alternativos) e impressões digitais de dispositivos. Mas, num mundo de fugas de dados, GDPR, CCPA e maior legislação de protecção de dados inspirada por estes, este a abordagem torna-se obsoleta. Safari e Firefox já incorporam soluções para reduzir o rastreio cruzado no local. O cromado também trabalha em alternativas. Por isso, o fim dos cookies de terceiros está para breve. Identificador da Apple para Os anunciantes (IDFA) em breve estarão acessíveis apenas para aplicações com consentimento explícito do utilizador. O o desaparecimento da possibilidade de rastreio de domínios cruzados faz com que os anunciantes regressem ao contexto publicidade.

Neste artigo, mostro-vos como implementar a definição de contexto com base na API de Classificação de Texto fornecido pela NLP Cloud. A abordagem aqui descrita pode ser facilmente adaptada a qualquer tecnologia publicitária (tais como servidores de anúncios, OpenRTB, etc.).

Contextualização

Porque os anunciantes não serão capazes de visar utilizadores individuais utilizando cookies de terceiros, um A previsão é de campanhas publicitárias contextuais a aumentar novamente. Esta poderia ser a única forma de atingir o utilizador interesses numa escala suficientemente grande. Os anúncios contextuais são baseados em conteúdos que o utilizador está a analisar neste momento, em vez do seu histórico de navegação ou perfil comportamental.

Publicidade contextual
(imagem de O que é Contextual Publicidade?)

É suposto ser mais interessante para os utilizadores, pois estes verão anúncios que combinam com o tópico do páginas web que estão a visitar.

Dê-me uma etiqueta

A maioria das tecnologias e redes publicitárias apoiam a passagem de palavras-chave ou tags durante o anúncio códigos de serviço. O texto é o núcleo da web e pode ser uma fonte de informação extremamente rica. No entanto, extrair contexto, etiquetas e palavras-chave do mesmo, por exemplo, para fins publicitários ou de recomendação, pode ser difícil e demorado. Mas se é o proprietário de um site de notícias mesmo de tamanho médio, para além de algumas etiquetas atribuídos pela equipa editorial, será difícil extrair todos os tópicos relevantes.

As primeiras tentativas para automatizar este processo resultaram em erros mais ou menos hilariantes no passado:

Publicidade contextual incorrecta
(imagem de Má colocação de anúncios Engraçado, Se Não É Seu)

Classificação de texto dos artigos

Felizmente, os avanços no Processamento de Linguagem Natural permitem uma correspondência muito mais precisa, em menos tempo. A classificação de texto é a atribuição de categorias ou rótulos consistente com o conteúdo do texto.

Vamos considerar uma página de exemplo com artigos sobre uma variedade de tópicos:

Colocação de anúncios

O nosso objectivo é ter anúncios com banners tematicamente relacionados com o conteúdo do artigo.

Condições que a nossa solução deve cumprir:

Note-se que os sistemas de publicidade e desenvolvimento web estão fora do âmbito deste artigo, mas o os conceitos gerais permanecem os mesmos, independentemente das ferramentas e tecnologias utilizadas.

Classificação de texto API

A minha solução preferida nestes casos é separar a lógica que lida com a classificação do texto em API separada. Temos duas opções: criá-lo nós próprios ou utilizar uma solução pronta.

Preparar um motor de classificação de texto simples utilizando bibliotecas Python e Natural Language Processing é uma tarefa para uma tarde. Mas o problema surge em termos de precisão e de servir o aumento do tráfego. Temos de lidar de alguma forma com a crescente base de utilizadores e com o seu fluxo de cliques.

Se é proprietário de um website, é pouco provável que queira brincar com a afinação e avaliação dos modelos de aprendizagem da máquina. Assim, delegaremos o máximo que pudermos numa solução externa. Note que não pretendemos enviar aqui quaisquer dados de utilizador, apenas dados pertencentes ao sítio web. Isto torna a utilização de ferramentas externas de segmentação contextual muito mais simples do ponto de vista da privacidade do utilizador.

NLP Cloud é um fornecedor de múltiplas APIs para processamento de texto utilizando modelos de aprendizagem por máquina. Um deles é o é o classificador de texto, o que parece promissor em termos de simples implementação (ver docs).

Modelos NLP Cloud

Com a NLP Cloud API, pode experimentar qual o algoritmo que pode ser útil para um determinado caso de negócios.

Integrar a classificação do texto com o conteúdo do sítio web

Como o backend do website é baseado em Python (Flask), começamos por escrever um cliente simples para o Processamento de Linguagem Natural 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
    ]
}

Bastante bom. A cada etiqueta é atribuída a sua relevância para o tema sem qualquer esforço.

O plano é que a selecção dos banners a serem afixados seja feita por um sistema de difusão de anúncios (decisão será baseado nas pontuações dos rótulos atribuídos individualmente). Portanto, a fim de não expor as As chaves API e para ter mais controlo sobre os dados, escreveremos um simples proxy:

@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 []

Campanhas

Vamos supor que temos 3 campanhas publicitárias a realizar:

Ad placement
Companhia de seguros (palavra-chave: insurance)

Ad placement
Empresa de energias renováveis (palavra-chave: renewables)

Ad placement
Cabeleireiro (palavra-chave: good look)

Vamos esboçar um mecanismo na parte da frente, que irá gerir a exibição de um criativo apropriado.

function displayAd(keyword, placement_id) {

    var conditions = {
        false: ' ',
        "insurance": ' ',
        "renewables": ' ',
        "good look": ' '
    }

    var banner = document.querySelector(placement_id);
    banner.innerHTML = conditions[keyword];

}

Este é o nosso adserver 🤪

Agora utilizando o fetch, vamos recuperar etiquetas para o texto de um artigo, que obtemos utilizando o seu selector:

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));

Note-se que só exibimos o anúncio do cliente se a pontuação for superior a 0,8:

Math.max(…scores) >= 0.8

Caso contrário, exibimos auto-promoção.

Este é obviamente um valor arbitrário, que pode ser apertado e afrouxado conforme necessário.

Colocação de anúncios
As notícias sobre fontes de energia renováveis encaixam nos anúncios de células fotovoltaicas.

Colocação de anúncios
As notícias sobre os perigos na casa podem aumentar a intenção de compra seguros.

Colocação de anúncios
Embora um anúncio sobre seguros tivesse sido adequado para o artigo, era não exibido porque o nível de relevância correcto não foi alcançado.

O leitor atento notará que o exemplo da faixa do cabeleireiro não apareceu. Isto é porque o tema dos artigos está centrado em notícias mundiais sérias, onde as questões de moda são não abordado. Para poder implementar a campanha, é necessário escolher um sítio diferente ou repensar o seu estratégia por palavra-chave.

Desempenho

Podemos conseguir uma carga rápida de páginas graças a esta função assíncrona: fetch . No entanto, ao mesmo tempo, o anúncio só aparecerá depois de os rótulos terem sido descarregados. Por este motivo e para reduzir os custos, é melhor implementar alguma forma de cache num ambiente de produção.

Uma modificação adicional poderia ser simplesmente o armazenamento de etiquetas directamente na base de dados. Para pouco frequentemente artigos actualizados, isto faz certamente sentido.

Contudo, uma solução baseada num API separado, que podemos alimentar com qualquer texto e obter os seus rótulos, dá-nos a possibilidade de utilizar o código JS praticamente em qualquer página em quase tempo real, mesmo sem acesso ao backend!

Takeaways

O maior desafio na utilização da focalização contextual é a sua utilização em sites de notícias. Muitos tópicos aparecem em os artigos aí publicados, incluindo os que estão em consonância com a indústria do anunciante. Mas no ao mesmo tempo, os tons sensacionais, frequentemente tristes, das histórias que contêm não são um bom lugar para fazer publicidade.

O texto classificação API pela NLP Cloud, por outro lado, faz um bom trabalho de etiquetagem de textos, por isso podemos também repetir todo o processo, desta vez tendo em mente excluir textos com um determinado tema de ter banners emitidos neles (ver a página de classificação de texto API)

Avião de papel

Obrigado pela sua leitura. Espero que tenha gostado tanto de ler como eu gostei de escrever isto para si.