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

はじめに

なぜやるのか

11 月、日増しに寒さが身にしみるようになっていたある日
「うちのサイトも Gunosy っぽいことやろう」
という、だいぶざっくりとした注文が降ってきた。

そもそも Gunosy っぽさとは

下記を駆使したネットニュースの推薦。

  • ネット記事のクローリング
  • 記事分類
  • ユーザー属性推定
  • 記事のリアルタイム評価
  • 同一記事判定
  • ……

大学学部生時代に研究室の輪読で集合知プログラミングをちょっとかじっただけの人間にとって、どれも軽いノリでできるもんじゃないが、 まぁとりあえず下記をやればいいんやな (思考停止)。

  • AWS
  • 機械学習
    • Python?
  • 自然言語処理

さて、どうしようか

設計・実装者の力量や晩秋を迎えた新富町の空気感、事業部のグルーブ感などを総合的に勘案した結果
「Gunosy っぽいこと」
に対する現実的な解答として、次のソリューションを実現することにした。

「このサイト (hacknote.jp) の右下から「ズズッ」っと出てくるフローティング広告について、下記 3 系統のうち、各ユーザーに最も適していると思われるものを推定して表示」

  • WordPress 系
  • AWS 系
  • Amazon WorkSpaces 系

ハモニカ横丁のバーで飲んだ平成最後のアイリッシュコーヒー。あったかくて、甘くて、それでいて強烈……

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

問題の定義

入力

  • ユーザーの記事アクセス履歴
    • 記事 ID リスト
    • 例: 47566, 47566, 47312, 47304 ……
  • カテゴリリスト
    • 出し分けを行う広告に関連する単語
    • 予め決めておく
    • 例: workspaces, 仮想デスクトップ, workdocs, wordpress, wp, cms, プラグイン, 冗長化, aws, クラウド, サーバーレス, ec2, rds, s3, cloudfront

期待される出力

  • ユーザーが興味を持っていると推測されたカテゴリ上位及びその興味度合いをスコアリングした数値
    • 例: wordpress: 0.8, ec2: 0.7, rds: 0.4, aws: 0.3

コンセプト

説明のため、ここでは下記を仮定。

  • 記事アクセス履歴: x, y
  • カテゴリリスト: wordpress, workspaces, aws

特徴語抽出 (自然言語処理)

TF-IDF 値を利用して、ユーザーが最近アクセスした各記事から特徴語上位を一定数だけ抽出。

ここでいう「特徴語」とは「ある文書によく出現するが、一般的、ありきたりではない単語」を意味する。
例えば、この記事において「TF-IDF」という単語と「一般的」という単語では、どちらが記事の特徴を捉えているかは自明であろう。
TF-IDF を用いると、このような文書における単語の重要度を数値化できる。

今回は、下記のように特徴語抽出をおこなった。

  1. 記事のタイトルと本文の形態素解析をおこない、その結果から名詞のみ拾い出し
  2. ストップワード除外など細々とした処理
  3. TF-IDF 値を計算
  4. TF-IDF 値で単語を降順ソートし、その上位一定数を特徴語として抽出

記事 x の TF-IDF 計算例

['workspaces', 0.6156759224176485]
['メンテナンス', 0.29169069438511463]
.
.
.

記事 y の TF-IDF 計算例

['ecs', 0.48548416099570235]
['cloudfront', 0.3457914203711411]
.
.
.

値は正規化 (normalizing the resulting documents to unit length) 済み

特徴語とカテゴリ単語間の類似度計算 (自然言語処理 + 機械学習)

抽出した特徴語とカテゴリリストの単語を Word2Vec によりベクトル化。 特徴語ベクトルとカテゴリ単語ベクトルの全組み合わせについてコサイン類似度を計算。

※Word2Vec がどのように単語をベクトル化しているかについては、他サイトの解説を参照されたい……

カテゴリごとにユーザーの興味度合いをスコアリング

先述したコサイン類似度を利用して、カテゴリごとにユーザーの興味度合いをスコアリング。
スコア計算式は、雰囲気で定義した。

カテゴリAのスコア = 下記の平均

・類似度トップの支配率:(カテゴリAが類似度トップとなった回数) / (特徴語の総数)
・類似度トップ時の類似度平均値:(カテゴリAが類似度トップとなった時の類似度の和) / (カテゴリAが類似度トップとなった回数)

「workspaces」カテゴリのスコア計算例

・類似度トップの支配率 =>  2 / 4 = 0.5
・類似度トップ時の類似度平均値 => ( 1.0 + 0.33 ) / 2 = 0.665

=> スコア =  ( 0.5 + 0.665 ) / 2 =  0.6

「aws」カテゴリのスコア計算例

・類似度トップの支配率 =>  2 / 4 = 0.5
・類似度トップ時の類似度平均値 => ( 0.42 + 0.35 ) / 2 = 0.385

=> スコア = ( 0.5 + 0.385 ) / 2 = 0.4

※何も考えずに算術平均を使用した。本来、率や比の平均には調和平均を使用したほうが良いらしいが、気づいたときには後の祭り

結果

workspaces => 0.6
aws => 0.4

=> このユーザーには wordpress, workspaces, awsのうち wordpress は刺さらないのないのかな、という具合。

後編 へ続く。

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

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

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

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


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

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