こんにちは。レシピ事業部検索チームの薄羽 (@usulity) です。
続々と関連記事が投稿されていますが、日本とグローバルのクックパッドを統合しました。
この統合に際して、日本のクックパッドの様々な機能がグローバル版へ移植されました。今回は、移植された機能の一つである「人気のキーワード」について、移植した際にどんな課題があってどう解決したのかの一部をご紹介できればと思います。
人気のキーワード
人気のキーワードは、「クックパッドで最近よく検索されているキーワード」を集計して、ランキング形式で掲載する機能です。
このように、人気のキーワードは1時間おきに更新され、その時期・時間帯のトレンドを反映したようなキーワードのランキングになっています。
トップページの検索窓の下にも上位のキーワードが表示されており、人目につきやすい機能の一つです。
グローバル版人気のキーワード
グローバル版にも人気のキーワード機能があります。
基本的な機能は日本のものと同じで、そのときのよく検索されているキーワードを表現しています。
今回取り組んだタスクは、このグローバル版の人気のキーワードとして、日本の人気のキーワードを日本版の計算方式で表示することがゴールになります。
課題
ということで、「グローバルにも人気のキーワードがあるから、日本語でも集計を実行するように修正すれば終わり!」としたいところなんですが、いくつか問題があります。
そもそも、グローバル版と日本版は別物のアプリケーションであるため違いは色々ありますが、「ログがない」ことと「更新頻度の違い」は移植する上で大きな問題でした。
ログがない
人気のキーワード機能を移植するにあたり、ユーザが移行してきたタイミングではもう人気のキーワードを表示しておきたいという要望がありました。
人気のキーワードは検索ログから計算するため、人気のキーワードを表示するにはグローバル版で検索ログが溜まっている必要があります。
しかし、日本のユーザをグローバル版の方に流すまでは、日本のユーザはグローバル版の方にはいないため検索ログはありません。
このままでは移行してきたタイミングで人気のキーワードを表示することができないので、なんとかグローバルの方にログがない状態でも人気のキーワードを計算できるようにしておきたいです。
また、キーワードのクオリティの面でも懸念があります。
この次でも説明しますが、人気のキーワードの計算は、過去の長い期間に渡ったログを使うことで、そのときの人気度を計算しています。
そのため、移行の初期段階ではログが十分に溜まっていないことで、人気のキーワードの質が不安定になってしまう恐れがあります。
更新頻度の違い
日本の方は毎時の更新なのに対して、グローバルの方は日次の更新になります。
計算頻度が日次か毎時かでは、単なる実行頻度の違い以上の差があり、人気度の計算方法が異なります。
人気度は長期的な目線と短期的な目線の両方で見た時に、目立って検索されている語を抽出しています。
簡略化しますが、例えばグローバル版の方では、人気度を「そのキーワードのその日の検索回数」/ 「過去に渡ったそのキーワードの1日の平均検索回数」で計算します。
こうすることで、あるキーワードが平均よりその日多く検索されていたら、そのキーワードの人気度は高くなります。
毎時の計算においても同じようなことをしますが、時間の区切り方が異なります。
「その時間帯」で目立って検索されたキーワードを調べたいので、毎時の計算では人気度を、「そのキーワードが1時間の間に検索された回数」-「そのキーワードがこの時間帯で検索される平均回数」として計算します。
このように、日次と毎時では人気度の計算方法が異なり、毎時では日次より細かい単位で平均を計算します。
単純にグローバル版の人気のキーワードの計算を毎時に動かしても再現できないことが分かったので、グローバル版の人気のキーワード計算の仕組みを変えるか、新しくバッチジョブを用意する必要があります。
解決
日本版とグローバル版両方のログから合算する
移行先にログがない問題を解決するために、移行先の人気のキーワードは日本とグローバル両方のログから計算します。
幸い、日本版でも人気のキーワードの計算に特別な情報は使っていなかったため、グローバル版のログで情報が足りないといったことはありませんでした。
これにより、グローバル版に移行初期のタイミングでも、良いクオリティの人気のキーワードが計算できるようになります。
また、ユーザの段階的な移行を考えた時にも、この方法は利点があります。
日本版とグローバル両方からログを取得しているため、仮にユーザの50%は日本、もう50%がグローバルにいるようなケースでも、両方のプラットフォームでのユーザ行動を加味した人気のキーワードを計算できます。
実際に、 One Experience ではユーザを日本版から少しずつグローバル版の方へ移行していきました。
それぞれからの検索ログを同じ価値と見なして良いかは議論の余地がありますが、それを検証するのは大変なので、1つの検索ログが1回の検索を示すことだけ確認して、移行途中で日本版と大きく結果が離れていなければよしとしました。
このように、データソースを両方のプラットフォームから取得して計算することで、移行段階に左右されずに人気のキーワードを提供することができます。
日本用のバッチジョブを用意する
更新頻度の違いによる人気度の計算方法の違いが大きいため、今回は日本用のバッチジョブを用意することにしました。
グローバル版の方の仕組みを日本版に寄せる方向性も考慮しましたが、更新頻度以外に以下の理由で別のバッチジョブとして作ることにしました。
- グローバル版の方の人気のキーワードのクオリティをチェックしながら開発するコストが高い
- 日本とそれ以外の言語ではログの量に差があるため、そのためのパラメータ調整にコストがかかる
グローバル版では、多数の言語の人気のキーワードを計算しています。グローバル版の人気のキーワードの仕組みを変えた時、抽出されたキーワードのクオリティへの影響をチェックしたいわけですが、言語が違うのでチェックするのが大変です。
また、日本用にチューニングした人気度の計算方法が、他の言語でうまくいくとは限りません。日本向けに設定したパラメータが他の言語でも適切かどうかわかりせんし、また各言語向けに設定をするのもコストがかかります。
日本とその他の言語で別々のバッチジョブと言っても、将来的にはやはりなるべく1つにまとめられるようにしておきたいので、なるべくグローバル版の仕組みには乗るように注意しました。
結果とまとめ
結果として、ユーザの移行が始まる前に実装が完了し、無事移行初期段階でも人気のキーワードを表示することができました。
やはり、ユーザがどっちのプラットフォームに居ても人気のキーワードを計算できることは、One Experience ではとても有効な方法だったと思います。
また、バッチジョブを分けることで他の言語への影響をあまり気にする必要がなかったことも、開発していく上では重要だったと今改めて思います。一方で、人気のキーワードの計算が日本語だけ分かれていることでメンテナンスコストが増えてしまっているので、これを他言語と統合していくということが今後の課題として残っています。
個人的な感想としては、正しく人気のキーワードを計算できているのか最後まで不安がありましたが、結果としては日本版と同様のキーワードをグローバル版でも表示することができて良かったと思っています。
以上、One Experience における人気のキーワード機能の移行の話でした。
面白いと思ってくださった方は、ぜひチャンネル登録と高評価、また他にも色々な角度の One Experience 話が投稿されておりますので、ぜひそちらもご覧ください。