当社がリコメンドエンジンを提供しているOPTMS CONTENT(以下OPTMS)のアルゴリズムを解説する記事(2/3)です。
前回は、記事同士の類似度を用いることで、コールドスタート状態でも記事の推薦が成立することを確かめたという話をしました。今回は記事のカテゴリ分類について解説します。なぜ記事のカテゴリ分類が必要かというと、カテゴリ別にオススメ記事を提示する機能があるということと、それが推薦する記事の方向付けにおいても重要と考えたからです。
データを活用できる製品・基盤づくりがテーマです。
推薦の方向づけ
メディアのマッチング
OPTMSを開発・販売する株式会社アマナでは、ライセンスドコンテンツの販売を含む総合的なコンテンツマーケティングプラットフォームであるNewsCredの販売代理およびアドバイザリーサービスも提供しています。 アドバイスを行う方に、ライセンスド記事を選ぶにはどのような手順を取るか伺ってみると、最初はライセンス元のメディアを絞り込むことが多いようです。メディアが扱う話題が自社メディアと近ければ、記事を見つけやすいということがあるでしょうし、メディア毎に対象とする読者層は異なるはずなので、自社メディアの読者と近いメディアを選ぶ方が良いでしょう。例えば同じ話題を扱うとしても一般紙と専門誌では切り口や掘り下げ方、語り口なども違ってくると考えられます。
そこで、推薦アルゴリズムに記事の類似度だけでなく「メディアの類似度」という視点を加えることを考えました。ただ、メディアそのものを表す特徴量は不明です。まず、プロトタイプに用いたサンプル記事の提供メディアの編集方針などを見比べましたが、量・質ともに不十分だったので、発信する記事の傾向をメディアの特徴とみなすことにします。具体的にはメディアが取り上げる話題、カテゴリの偏りを比較することにしました。実際ある方法で計算したカテゴリの分布と、メディアの分類には関連があることは確認しました。
※表のメディア名は非表示としています
次に、ユーザー企業のオウンドメディアのカテゴリの偏りを計算して推薦結果に反映します。前回解説したプロトタイプでは、推薦対象のオウンドメディアに掲載済みの記事をクロールして推薦に用いたと説明しました。この時クロールしておいた記事のカテゴリを計算・集計すればオウンドメディアの傾向が得られます。
余談ですが、これからサイトを立ち上げるユーザー向けに、サイトの方向性を決めるための対話型インタフェースも計画されていました。搭載は諸般の事情で先送りとなっていますが、ここに私たちの価値観研究の成果を入れる予定でした。つまり、ターゲット読者層の傾向を入力することで、興味のあるカテゴリが推定され、そこからオススメのメディアが決まるというものです。ただし、法人向け(B2Bサイト)を訪問する読者は個人の興味・関心ではなく業務上の必要に迫られて情報収集するはずですから、利用企業の業種、あるいは想定読者の業種・職種・職位といった情報から、興味のある記事カテゴリを推定することになるでしょう。
記事の分類
メディアが発信する記事カテゴリの分布は推薦に使えると考えましたが、肝心の記事カテゴリの定義、ならびに、実際の記事をどのように分類するかは大きな課題でした。調べてみると「標準的な」記事カテゴリというものが無いことに気づきます。各メディアが独自にカテゴリを定義している場合もあるものの、それらを統合するのは困難です。以下では、私たちが採用した記事の分類方法を説明します。
方針
実は当初、Googleのコンテンツ分類APIを使うことを考えました。有償ですが、ライセンスドコンテンツ全量を分類するのではなくメディアごとにランダムサンプリングすれば、費用を抑えられます。ところが、「記事カテゴリ」毎のオススメを表示する機能が新たに追加されたことで、新着記事の一定割合に分類APIを呼び出す必要があるため、独自に実装することにしました。次に、Googleの分類APIが出力するカテゴリを正解とする機械学習を検討したものの、そのカテゴリもOPTMSで使いやすいとは言えなかったので、カテゴリそのものも定義しなおすことにします。とは言え記事の一つ一つを人間が仕分けることは困難ですから、まず教師なしアルゴリズムで記事を分類したのち、分類された記事の集まりにカテゴリ名を与えるというボトムアップ式の手順を取りました。
トピックモデル
教師なしで記事を分類するといえば、トピックモデルの適用が考えられます。トピックとはカテゴリより細かい分類の概念で、LDAという計算アルゴリズムが有名です。LDAは記事が複数の話題(=トピック)を扱っている可能性を考慮に入れ、そのトピックの分布を確率的に推定します。
LDAを使ってトピックを計算してみたのですが、トピックごとに記事を並べた結果を見てもまとまりが感じられません。この状態を言い表す、こんな記事がありました:
alphaの値が大きい(= 2.65)トピックであるtopic-8の単語分布を見てみると、比較的あらゆるジャンルの文書で出てくる汎用的な単語が多いことがわかります。一方で、alphaがある程度小さい値(= 0.47)になると、そのトピック(topic-71)の単語分布はある1つのジャンルの単語(ここではレストランに関する単語)によって構成されるようになります。さらにalphaの値が小さい(= 0.019)トピックになると、そのトピック(topic-156)の単語分布は、ある文書特有の単語のみで構成されるようになります。
~https://seedata.co.jp/blog/tech/264/より引用。ハイライトは筆者~
ハイライトした箇所は「大きすぎる」または「小さすぎる」トピックの特徴を表しています。私が得た結果にも同じように「多くの記事で汎用的に用いられる単語」と「記事特有の単語」に分かれる傾向が見られました。ハイパーパラメータを調整したり、トピックの分布をもう一度クラスタリングすれば解決できるかもしれませんが、そうするくらいなら、最初からクラスタリングしても良さそうです。
記事ベクトルに対するGMM
次に試したのは記事ベクトルのクラスタリングです。最適なクラスタ数を定量的に判断できるアルゴリズムとしてGMMを選び、記事のクラスタをピックアップしたところ、内容的に近しい記事が集まっていると見受けられました。最終的に以下の手順でカテゴリを得ることができました。
- 記事ベクトルをメディアごとにクラスタリングする
- GMM:Gaussian Mixture Modelを適用し、BIC基準でクラスタ数を決定
- 所属記事数5未満のクラスタは除外
- クラスタのベクトルを計算する
- クラスタに所属する記事のベクトル重心を保存する
- 以後はGMMのモデルは使わず、クラスタのベクトルと記事ベクトルの類似度を使う
- クラスタを新しく整理したカテゴリに割り振る
- 各クラスタに所属する記事の件名を10件まで抽出しておき、件名とカテゴリを見比べて人間が判断する
- ある程度決まったところで、カテゴリの統廃合を議論
- 最終的に大分類14、小分類60ほどの分類が得られた
定義したカテゴリに記事を分類する手順は以下のとおりです。
- 対象の記事と「近しい」クラスタを3つ選ぶ
- クラスタ中心点と記事ベクトルのコサイン類似度の上位から3つ
- クラスタ数を増やすと一つの記事に複数のカテゴリが割り振られやすくなる。既存の記事で、カテゴリが1種の記事が最多となるように3とした。
- 得られたクラスタに対応するカテゴリを割り付ける
ここまでのまとめ
ターゲットとなる読者をセグメントするのに、興味のある記事のカテゴリ特徴を用いるのが自然だと思われます。これにより、記事の掲載元メディアと二次利用先のWebサイトと「読者層の近さ」を測り記事の推薦順位に反映しています。
問題はカテゴリ自体の定義に決定版がなく、現在の記事データセットからカテゴリを見つける必要があったことです。膨大な記事を1件ずつ精査するのは現実的でないので、記事ベクトルのクラスタリング結果を用いることで効率化を図りました。なお、現時点のカテゴリも決定版ではなく今後新しい記事媒体が増えるとともに見直していくことになるでしょう。
ここまで記事の推薦について解説しました。次回は、画像の推薦について説明したいと思います。