Gunosyデータ分析ブログスマートフォン用の表示で見るGunosyデータ分析ブログGunosyで働くデータエンジニアが知見を共有するブログです。開発しているニュースアプリ、ニュースパスでは「多くの人が知っておくべき」と判断されるニュースが出た時、即座にそれをユーザにプッシュ通知でお知らせする速報プッシュ機能があります。誰もが知るような有名人の結婚や、多くの死傷者が出てしまったような事件などが起こったときに速報が送られます。「多くの人が知っておくべきとまではいかないが、この話題に興味がある人は知っておいたほうが良さそう」なニュースも多くあります。スポーツ業界内でのニュースや、株価の大幅変動といったニュースなどがこれに当たると考えています。そのようなニュースを全ユーザに送っても興味がないユーザが殆どですし、そのようなユーザからするととても邪魔な通知になってしまいます。実際、以前のオリンピックの際などは速報を送りすぎてしまったのが原因で速報通知機能をOFFにするユーザが多くいました。そこでニュースパスで、このような速報を興味がありそうな人だけに送るターゲティングプッシュシステムを作りました。今回はそれについての話になります。実はニュースパスには既に一部の地域のユーザや、一部のバージョンのアプリ使っている人にだけプッシュ通知を送信する仕組みがあります。対して、該当ユーザを抽出するクエリを予め準備しておくことで実現しています。「居住地を北海道に設定しているユーザを抽出するクエリ」や「1.xx.x以下のバージョンのアプリを使っているユーザを抽出するクエリ」を予め作っておいて、通知送信時はそのクエリを選択するだけで一部のユーザだけに通知を送信することができます。実装コスト削減のため、今回作った機能もこの仕組みの上に乗せるようにしています。上に格納するか、というのが今回の話のキモになります。「興味がありそうな人」とはニュースパスでは個人個人にパーソナライズされた記事リストを配信するため、記事やユーザを同一のベクトル空間に埋め込む仕組みが存在します。これについて興味がある方は下記のスライドに詳しく載っているのでぜひ読んでみてください。今回はこの埋め込まれた記事やユーザのベクトルを使って「興味がありそうな人」を抽出します。本当はアドホックに「記事ベクトルとユーザベクトルの距離が近い人」を抽出できれば良かったのですが、負荷的な理由と、上記の速報システム上に乗せるのに都合が悪いという理由で断念しました。)とその埋め込みベクトルを作っておき、それと近いベクトルを持つユーザが「そのジャンルに興味があるユーザ」であるとしました。ターゲティングプッシュシステムターゲティングプッシュシステムは大雑把に以下のような構成になっています。順を追って説明していきます。タグベクトル生成まずはタグベクトルを作る必要があります。重心ベクトルを使用します。