はじめまして。白ヤギコーポレーションでエンジニアをしている谷田です。
カメリオでは、テーマに合ったニュース記事を提供するために、機械学習を応用した新しいアプローチを最近こっそり導入しました。この記事では、カメリオがどのようにニュース記事がテーマに合っていると判断しているのか、そのアルゴリズムの概要を解説してみたいと思います。
カメリオでは新しく入ってきたニュース記事を、何万もあるテーマの中から良く当てはまるものに自動的に振り分けています。これまでカメリオでは、記事があるテーマに振り分けられるためのさまざまな条件を半自動的に導出して、テーマと記事とのマッチングを行っていました。しかしこの従来の方法では、テーマ名の単語が記事中にたくさん出てきたりした場合に、実際にはあまりテーマに関係が無かったり、あるいはユーザの興味を引かないような記事が混ざってしまうことがありました。
新しく導入した機械学習を用いたアプローチは、従来の手法で選ばれたニュース記事を受け取ると、ユーザーが興味を持ちそうな記事だけを残す一種のフィルタとして実装しています。言い換えると、一見テーマにマッチしていそうなニュース記事の中から、実際には内容がテーマに関係していないものを取り除くことを目指しています。
記事の例
新しい手法によってアプリで表示される記事がどのように変わったのか、まずは例を見てみましょう。新しい手法を導入する以前、ある時に「カメラ」テーマで出ていた記事は次のようなものでした。
– 3Kクラスの360度撮影! 約1.7万円で買える、コスパ抜群な全天球カメラ
– NIPPO/ホイールローダー自動停止システム開発/ステレオカメラで障害物対応
– OpenCV-Python Tutorialsの「カメラ校正」への補足
– TSIHD、店頭状況をカメラで分析 来客の購入率など
– スマートデバイス向け業務カメラアプリケーションKAITO セキュアカメラを住友生命保険相互会社に提供開始
– 世界初 中判ミラーレスデジカメがなんだかすごそう【倶楽部】
– iPhone7のカメラ・モジュールが激写される!7 Plusじゃなても一眼レフ並に?
– 富士フイルムがX-Pro2やX-T1など6機種の新ファームをリリース(デジカメinfo)
カメラに関する記事が並んでいますね。しかし、よく見てみるとカメラという単語はタイトルに含まれているものの、カメラそれ自体についての記事でないものもあるようです。そういった記事は「カメラ」テーマをフォローしているひとの関心は薄いと思われるので、一覧から取り除かれているほうが良さそうです。さて、一覧で色がついている記事がありますが、それらは新しい手法によって取り除かれるものです。カメラ自体にあまり主題が置かれていない記事が省かれていると思うのですが、いかがでしょうか。
もうひとつ、「自動車」テーマの例も見てみます。
– BMW/MINIブランドを体験できる複合販売店「BMWグループ東京ベイ」がオープン
– Official: 世界最速記録を競い合う「ボンネビル・スピードウィーク」が3年ぶりに開催へ
– トロロッソ「1台でもトップ10に入れて良かった」/F1イギリスGP2日目
– レッドブル「フェラーリに勝って2列目を独占」/F1イギリスGP2日目
– アルピナ B10 ビターボをじっくりと
– Official: 北米日産、マイナーチェンジした「パスファインダー」を発表
– ウィリアムズ「7番手と12番手、これが今の実力だ」/F1イギリスGP2日目
– メルセデスAMG「最後の最後までシビレる展開に」/F1イギリスGP2日目
一覧の記事を眺めると、大きく分けて乗用車に関する記事とF1に関する記事の二種類が混ざっていることが見てとれます。F1に関する記事については「フォーミュラ1」テーマが用意されているので、「自動車」テーマとしては乗用車の記事がメインになっていると良さそうです。新しい手法を適用することで、一覧に色付きで示されたF1に関する記事がフィルタリングされます。
手法の説明
今回導入した手法は、ざっくり言うとCBOW+SVMです。CBOWというのは文書をベクトル化する方法で、SVMはベクトル化された文書を分類する手法です。新しいニュース記事が入ってきたとき、その記事を表示するか除外するか判別するまでの流れを順を追って見ていきたいと思います。
まず記事が入力されると、その文書に含まれる単語を抽出します。抽出された各単語はWord2Vecという単語の意味を表現する手法によってベクトルに変換します。そして変換された各単語ベクトルの平均をとり、その結果得られたベクトルを記事のベクトルとします。このように記事のベクトルを単語の分散表現(ベクトル)の足し合わせで表現する手法をCBOWと呼びます。
記事のベクトルはテーマごとに用意されたSVMに入力として与えられ、出力としてテーマに対する記事の良さのスコアが得られます。SVMは機械学習でよく用いられる分類器のひとつで、前もって正解データを与えて学習させておきます。正解データとして用いられるのは”良い”記事と”悪い”記事ですが、それらの記事の”良さ”はカメリオでの人気度などから判断しています。SVMから得られたスコアはテーマごとに設けたしきい値と比較され、最終的に記事を表示するか除外するかを決定します。
この方法は比較的シンプルなので、テーマごとの学習にかかる時間が短くすみます。それだけではなく、いろいろ試した方法のなかでも分類性能が高くて意外なほどでした。そのほか試してみた方法では、文書ベクトルを得るのにParagraph Vectorという手法を用いてみたり。あるいは、テーマごとに単語の生成モデルを推定して、記事の良さをWMD(Word Mover’s Distance)という手法で求めてみたりしました。しかしそれらの方法では、より時間がかかるのにも関わらず、得られた性能は今回導入した方法に及びませんでした。
このようにして動作するフィルタリングを前述のマッチングと組み合わせて、カメリオではテーマごとに表示する記事を選んでいます。大ざっぱな説明だったかもしれませんが、雰囲気だけでも感じていただけていれば幸いです。