サイト閲覧履歴からユーザーが興味を持つ記事のカテゴリ推測 (後編)

こちら のつづき。

実装

広告カテゴリ推測 API (AWS + Python)

ただの Web API。
記事ページアクセス時に発火するAPIリクエストで閲覧履歴記録と広告カテゴリの推測を同時に行い、推測結果をレスポンス。

  • Python 製
    • WAF: Flask
    • TF-IDF や Word2Vec などの自然言語処理: Gensim
  • tiangolo/uwsgi-nginx-flask
    • NGINX から Flask へ接続する際に必要な uWSGI がいい感じに設定されている Docker イメージ
    • この Docker イメージにも NGINX が組み込まれているが真面目に使っていない
    • 構築・運用の都合上、Docker コンテナ外にもリバースプロキシ用 NGINX を別途設置して、こちらで SSL 終端
    • EC2 インスタンスを管理するのがイヤなので、いつか EKS か ECS に載せ替えたい……

肌感だが、下記の状況でも t3.medium 1 台構成でとりあえずホスティングできている。

  • 月間約 27 万 PV
  • ピーク時アクセス約 1200 PV/h
  • 約 1 万記事分のデータをもとに生成したモデルファイルを用いた TF-IDF、 Word2Vec 関連の計算
  • 1 アクセスにつき、下記の計算を行う
    • TF-IDF ベースで特徴語 100 個抽出
    • 特徴語ベクトル 100 個とカテゴリ単語ベクトル 15 個のすべての組み合わせについてコサイン類似度計算

自然言語処理のモデルファイル生成など (AWS + Python + 自然言語処理)

API サーバーの Gensim で TF-IDF や Word2Vec の計算を行うのに先立って、あらかじめ下記の処理を行っておく必要がある。

  • 形態素解析をおこない、記事から名詞を抽出
  • Gensim による自然言語処理に必要なファイル生成
    • TF-IDF モデルファイル
    • Word2Vec モデルファイル
    • 単語辞書ファイル
  • 生成した自然言語処理用ファイルを S3 へ保存

この生成処理においては、行列計算をぶん回すようなややヘビーな処理を含むので、Web サーバーの Cron でシコシコ計算させるわけにもいかない。 よって、AWS Batch で随時スポットインスタンスを起動してバッチ処理的に行うことにした。

ECS (Fargate) も検討したが、AWS Batch に存在するジョブのタイムアウトが無さそうだったのでやめた。 バグを作り込んでバッチコンテナが無限に起動しっぱなしとか嫌だし、そんなことで夜中に叩き起こされたくない。

なお、AWS Batch でのモデルファイル生成時に使用する記事データは、 当サイトの Web サーバー上でシェルスクリプトを Cron から定時実行して S3 へアップロードしている。

フローティング広告表示

ひとまず、スコア 1 位のカテゴリの広告を表示。

評価

設計・実装者本人の独断と偏見に基づき、主観評価により厳正に評価を行った。
推測候補とする広告カテゴリは下記の設定。

  • workspaces
  • 仮想デスクトップ
  • workdocs
  • wordpress
  • wp
  • cms
  • プラグイン
  • 冗長化
  • aws
  • クラウド
  • サーバーレス
  • ec2
  • rds
  • s3
  • cloudfront

試行 1

閲覧履歴

出力

いい感じ。

{category: "workspaces", score: 0.5290445215787207}
{category: "仮想デスクトップ", score: 0.35859723647435504}
{category: "ec2", score: 0.27279101729393007}

試行 2

閲覧履歴

出力

そうだね。

{category: "wordpress", score: 0.5166666666666667}
{category: "aws", score: 0.5166666666666667}
{category: "ec2", score: 0.40736898183822634}
{category: "s3", score: 0.3627751876910527}
{category: "サーバーレス", score: 0.3395554686586062}
{category: "冗長化", score: 0.3359119335810343}

試行 3

閲覧履歴

出力

う〜ん……

{category: "workspaces", score: 0.3913167032356165}
{category: "s3", score: 0.37019435529197964}
{category: "仮想デスクトップ", score: 0.34126924725920976}
{category: "aws", score: 0.3008851457615288}

まとめ

  • 先人が作った優れたライブラリ、アルゴリズム、インフラを組み合わせて簡単にそれっぽいものが実現できた
  • AWS + 機械学習 + Python + 自然言語処理 => Gunosy っぽいとは限らない
    • Gunosy は偉大
  • [閲覧履歴 推薦] でググると学術論文がいくらでもヒットするので、そのうち論文読もう(読まない)
    • 出身研究室の先輩の論文が出てきてエモい
  • 今年の冬も寒そうだ

深夜2時ごろに井の頭公園で見かけた猫。寒そう。

ハックノートをフォローして
最新情報をチェックしよう

AWS構築サービスの全てをまとめた資料を公開中

ハックノート(TOWN株式会社)では、AWSの導入や構築支援を行っています。AWS導入メニューやサービス詳細、構成例や費用を掲載した資料をダウンロードできます。

AWSの新規導入やAWSへの移行を検討の際は、ぜひご参考ください。


APNコンサルティングパートナー

TOWN株式会社はAmazon公認コンサルティングパートナーです。