GREEを支えるテキスト情報可視化ツールのご紹介
こんにちは、マーケティング部の戸井田明俊と情報システム部の亀井利光です。
Advent Calendarの7日目(今日でグリー創立10周年!)は、ユーザーの皆様から頂いたご意見・ご感想などのテキスト情報を可視化するツール、UserText Dashboard(以下UTD)を開発した話です。
背景・目的
グリーでは、ユーザーの皆様から頂いたお問い合わせなどのテキスト情報を管理しています。
それらは今までデータの種類によって別々のストレージで管理されており、管理ツールも様々なものが混在していました。
またテキスト情報とユーザー様の属性情報が紐付けられていなかったため、ユーザーセグメントごとの分析が不十分でした。
そこでユーザーの皆様のご意見・ご感想をもれなくくみとり、より多くの方に安心してご利用していただけるサービス運用の実現をめざし、テキスト情報を一括で管理できる社内BIツールを開発しました。
欲しかった機能
- テキスト情報を一つのストレージに共通のフォーマットで格納し管理したい
- 発言者の情報やテキストのメタ情報で条件をしぼれるようにしたい
- ex) 11/3の「 探検ドリランド」のレベルがxx以上のユーザーの問い合わせ内容
- 閲覧権限を細かく管理したい
- ディレクターがプロダクトの追加・削除を管理できるようにしたい
実現方法
全体構成
図1 全体構成
システムは、図1のようなシンプルな構成になっています。
- ローデータ
テキストのローデータはコミュニティ、問い合わせ、アンケートから構成されています。
弊社のコミュニティは、設立当初の2004年から運営されており膨大なテキスト情報が蓄積されています。
- Data Warehouse
ここには、ゲームのアクセスログや属性情報がHadoop上に保存されています。
属性情報には、ゲーム毎のパラメータ(デッキの強さ、レベル、ギルドレベル、バトル回数、クエストプレイ回数 etc)が保存されています。
今回、UTDを実装するにあたりテキストのローデータをData Warehouse内に追加しました。
長年蓄積された大容量のテキストローデータと属性情報をジョインし後述するデータ形式でHadoop上に管理しています。
- Web / API server
UTDユーザー毎の閲覧権限やプロダクトの追加をディレクター(エンジニア以外の方)が管理したかったので、デフォルトで管理画面がついているDjangoを採用しました。
プロダクトの追加をする際、ゲーム毎に利用されているパラメータが違うため、管理画面からJSON形式でスキーマを定義することが出来ます。
これにより、多様な検索条件に対応することが出来ます。
また、Hadoopに対してジョブを実行させるクエリエンジンには、Prestoを利用しています。Prestoは、Hiveよりもレイテンシーが少ないのでアドホックなクエリに向いています。
Prestoクライアントは、PyHiveベースのORMを使うことで多様な検索条件に対応できるようにしました。
さらに、頻繁に参照されるジョブは、あらかじめ結果をキャッシュさせておきレスポンスタイムを短くしHadoopに対する負荷も下げるよう工夫しました。
- フロントエンド
テキストデータをテーブル形式で表示し、項目のフィルタリング&ソート、また非同期でのデータ取得が容易なjQueryのプラグインDataTablesによって実装しました。
プロダクト毎に多様な検索条件を指定することができます。
データ形式
表1 Hadoop上でのデータの形式
datetime | product_id | type | text | text_info | user_info | dt | |
---|---|---|---|---|---|---|---|
形式 | string | bitint | string | string | map | map | string |
概要 | 時間 | プロダクトID | データの種類 | 発言内容 | テキストのメタ情報 | ユーザーのメタ情報 | 日付 (パーティション用) |
例 | 2014-12-07 00:00:00 | xx(ドリランド) | アンケート | 楽しかった | {"text_length":"4", "questionnaire_no": "1"} | {"level":"1", "deck_spec":"123", "guild_level":"456"} | 2014-12-07 |
表1のようなデータ形式で、すべてのテキスト情報を保存しています。
typeには、コミュニティ、問い合わせ、アンケートのいずれかが入ります。
text_infoには、テキストの文字数、アンケート番号、コミュニティのスレッド名などのメタ情報をmap形式で保存します。
user_infoには、ゲーム毎に異なるユーザーのデッキの強さやレベルやインストール日などが保存されます。
またパーティションは、product_idとdtによって指定されています。
※なお、個人を特定できる情報は排除しています
実際作ってみて
図2 画面構成図
画面UIは、図2のようになっています。
UTDユーザーは、左のフォームからテキストの投稿期間、投稿内容、各ゲームごとのパラメーター(デッキの強さ、レベル、ギルドレベル、バトル回数、クエストプレイ回数 etc)などの条件を指定することが出来ます。
それらを指定し検索を実行すると非同期でAPIサーバーにPrestoのクエリが投げられ、右側のようなテーブル形式で(モザイクかかっていますが、、)テキスト情報を表示できます。
DataTablesの機能を利用し、項目のソートやテーブル内検索やカラムのフィルタリングが行えます。
Prestoを使っているので、ほとんどの検索は数秒で表示まで完了します。
現在、UTDでは20タイトル以上のプロダクトのテキスト情報を管理しています。
ゲーム毎の固有のパラメータで検索条件が指定できるため、ゲームの初級者から上級者まで幅広いユーザー層のご意見・ご要望をくみとることができます。
実際にUTDを利用しているディレクターの方々は、ユーザーの方からの意見に目を通しやすくなったとお褒めの言葉を頂いております。
今後の展望
コミュニティ情報には、あいさつや顔文字などの定型文が大量に書き込まれています。
それらはUTDユーザーにとって読飛ばしても問題なく、あらかじめ削ぎ落しておくことで作業効率が上がります。
今後は、テキスト情報を要約できる機能を組み込んでいきたいと思います。
まとめ
データソースごとに異なるデータ構造を、一つのフォーマットで共通のストレージに格納した。
テキスト情報を閲覧できる社内BIツールを実装した。
これにより、ディレクターのユーザーの方からのご要望・ご意見をくみとる負担が改善された。
***
明日は岩間裕和さんによる記事です、お楽しみに!