テキスト分類によるプライバシーに配慮した広告のためのコンテクストターゲティング 自然言語処理API

Article by Rafał Rybnik, ソフトウェア開発の責任者 にて Instytut Badań Pollster

コンテクストアドバタイジング
特に断りのない限り、記事中の写真はすべて著者によるものです。

ユーザーを追うのではなく、興味を追う

今日のオンライン広告の現実では、効果的なマーケティング戦術は、サードパーティのCookie(および代替ストレージ)やデバイスのフィンガープリントなど、さまざまなユーザー追跡技術に依存しています。 サードパーティークッキー(および代替ストレージ)やデバイスフィンガープリントなど、さまざまなユーザー追跡技術が用いられています。しかし、このような しかし、データ漏洩、GDPR、CCPA、およびこれらに触発されたデータ保護法の増加の世界では、このアプローチは時代遅れになります。 このアプローチは時代遅れになります。SafariとFirefoxには、クロスサイトトラッキングを減らすためのソリューションがすでに組み込まれています。 Chromeも代替策に取り組んでいます。つまり、サードパーティ製Cookieの終わりは近いのです。AppleのIdentifier for AppleのIDFA(Identifier for Advertisers)は、ユーザーの明示的な同意を得たアプリのみがアクセスできるようになります。また クロスドメイントラッキングの可能性がなくなると、広告主はコンテクスト広告に回帰します。 広告に回帰します。

この記事では、NLPクラウドが提供するText Classification APIに基づいて、コンテキストターゲティングを実装する方法を紹介します。 に基づいてコンテキストターゲティングを実装する方法を紹介します。ここで紹介する方法は、どんな広告技術(アドサーバー、OpenRTBなど)にも簡単に適用できます。 (アドサーバー、OpenRTBなど)に簡単に適応できます。

コンテキスト・ターゲティング

広告主は、サードパーティのCookieを使用して個々のユーザーをターゲットにすることができなくなるため、コンテクスト広告キャンペーンが再び増加することが容易に予測できます。 予測できるのは、コンテクスト広告キャンペーンが再び増加することです。これは、ユーザーの関心事を十分な規模でターゲティングする唯一の方法かもしれません。 大規模にユーザーの関心事をターゲットにする唯一の方法かもしれません。コンテクスト広告は、ブラウザの履歴ではなく、ユーザーが今見ているコンテンツに基づいて表示されます。 コンテクスト広告は、ユーザーのブラウザ履歴や行動プロファイルではなく、ユーザーが今見ているコンテンツに基づいて表示されます。

コンテクストアドバタイジング
(の写真 コンテクスト広告とは コンテクスト広告とは?)

ユーザーにとっては、訪問したウェブサイトのページのトピックにマッチした広告が表示されるため、より興味深いものとなるはずです。 ユーザーにとってより興味深いものになるはずです。

タグが欲しい

ほとんどの広告配信技術や広告ネットワークは、広告配信コード中にキーワードやタグを渡すことをサポートしています。 をサポートしています。テキストはウェブの中核であり、非常に豊富な情報源となります。しかし しかし、広告やレコメンデーションのためにテキストからコンテキスト、タグ、キーワードを抽出することは、困難で時間のかかる作業です。 困難で時間がかかります。しかし、中規模のニュースサイトのオーナーであれば、編集チームが割り当てたいくつかのタグを超えて を超えて、すべての関連するトピックを抽出することは難しいでしょう。

このプロセスを自動化しようとする最初の試みは、過去に多かれ少なかれおかしな失敗をもたらしました。

誤ったコンテクストのアドバタイジング
(の写真 バッドアドプレイスメントは面白い。 If Not Yours)

記事のテキスト分類

幸いなことに、自然言語処理の進歩により、より正確な照合を短時間で行えるようになりました。 テキストの分類とは、テキストの内容に合わせてカテゴリやラベルを割り当てることです。

様々なテーマの記事が掲載されているページを例に考えてみましょう。

広告掲載

広告掲載では、記事の内容に関連したテーマのバナーを表示することを目指しています。

私たちのソリューションが満たすべき条件

なお、広告システムやウェブ開発はこの記事の対象外ですが ここでは、広告システムやウェブ開発は対象外としますが、使用するツールや技術にかかわらず、一般的なコンセプトは同じです。

テキスト分類API

このような場合、私は、テキストの分類を処理するロジックを別のAPIに分離することをお勧めします。 別のAPIに分離することです。それを自分で作るか、既製のソリューションを使うかの2つの選択肢があります。

Pythonと自然言語処理ライブラリを使って、シンプルなテキスト分類エンジンを準備することは、午後1回の作業です。しかし、精度や増加するトラフィックへの対応という点で問題が生じます。増え続けるユーザーとそのクリックストリームをなんとか処理しなければなりません。

あなたがウェブサイトのオーナーであれば、機械学習モデルのチューニングや評価で遊びたいとは思わないでしょう。そこで、できる限り外部のソリューションに委ねることにします。なお、ここではユーザーデータは一切送信せず、ウェブサイトに属するデータのみを送信する予定です。これにより、ユーザーのプライバシー保護の観点から、外部のコンテクストターゲティングツールの使用がよりシンプルになります。

NLPクラウドは、機械学習モデルを用いたテキスト処理のための複数のAPIを提供しています。その中の一つ はテキストクラシファイアです。 簡単に実装できるという点で期待できそうです。 (ドキュメントを見る).

NLPクラウドモデル

NLP Cloud APIを使えば、特定のビジネスケースにどのアルゴリズムが有用かを試すことができます。

テキストの分類をウェブサイトのコンテンツと統合する

Webサイトのバックエンドは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キーを公開せず、データをよりコントロールするために 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)

適切なクリエイティブの表示を管理する、フロントエンドのメカニズムをスケッチしてみましょう。

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のページへ)

紙飛行機

お読みいただきありがとうございました。私があなたのためにこれを書くことを楽しんだように、あなたが読むことを楽しんでくれれば幸いです。