機械学習を用いてユーザーのご意見分類業務を効率化した話

こんにちは。研究開発部の @vanhuyz です。機械学習・自然言語処理を中心に研究開発しています。 今回は機械学習を活用してユーザーからのご意見を 81 のカテゴリーに自動分類し、ユーザーサポートスタッフによる手動分類の工数を半分にできた話を紹介したいと思います。

背景

クックパッドは現在約 5,500 万人の国内月間ユーザーがあり、日々ユーザーからたくさんのご意見やご要望を頂いています。創業してからユーザーの声を大事に扱う文化があり、どのご意見も一度目を通すようにユーザーサポートスタッフが努力しています。ご意見はスタッフによってさらに分類され、必要に応じてディレクターやエンジニアに振り分けられています。

例えば、こんな感じのご意見が来ています。「このレシピは簡単なので、子供とやってみました。楽しかったです」や「機種変更して、ログイン出来ません」や「もっと具体的な内容でも検索できるようにしてほしいです。例えば、冷蔵庫の余りもので作りたいときに何種類かの食材でも検索できると助かります。」などです。

現在、ご意見に対して 100 以上のカテゴリーが登録されています。例えば、ポジティブ・ネガティブ・検索関連・ログイン関連・つくれぽ・不具合などです。

f:id:vanhuyz:20180808154458p:plain

ユーザーサポートスタッフが社内システムを使い、ご意見を読んでカテゴリーリストから適切なカテゴリーを選んだ上で、システムが Slack の適切なチャネルに転送してくれます。これにより、関係するディレクター・エンジニアはご意見を読むことができ、すぐその場で議論します。 ただし、ご意見の数が多く、カテゴリーも多いため、毎日の分類作業が大変で、ボトルネックとなっていました。そこで、自動分類の仕組みを導入したいと考えました。

ご意見分類におけるチャレンジ

ご意見分類をパッと見ると簡単そうかもしれませんが、実はそうではありません。

  • まず、カテゴリー数が多いです。現在は 100 カテゴリー以上があり、今後もどんどん増えていきます (open set problem)。

  • 次に、1つのご意見が複数カテゴリーに所属することがあります (multi-label problem)。例えば、「つくれぽを投稿するのは楽しいし、もらえるのも嬉しいですね。」というご意見は「ポジティブ」と「つくれぽ」に入っています。

  • また、蓄積されたデータは不均衡 (imbalanced data) です。汎用的なカテゴリー(例えば、ポジティブなご意見・不具合報告)のご意見が非常に多いのに対し、最近リリースしたばかりのサービス(Amazon Echo Skill, storeTV など)のご意見はまだ多くはありません。また、クローズされたサービスも多数存在し、それらに関するカテゴリーはいらなくなります。

取り組みについて

以上の3つのチャレンジに向けて、どのように解決したのかを簡単に説明します。今回は Google の Rules of Machine Learning を参考にしながらプロジェクトを進めました。43 ルールもありますが、その中で以下の 3 つを気にして進めました。

1. Don’t be afraid to launch a product without machine learning.
(機械学習を使わないことを恐れるな!)

辞書ベースの手法を試しました。例えば、「探、調べ、検索、キーワード」という単語が含まれるご意見は「検索関連」と判断されます。この方法だと、かなり高い精度が得られますが、再現率が低いです。そして、100 以上のカテゴリーの一つずつに辞書を作るのがあまり現実的ではないので、他の方法を試すことになりました。

2. Choose machine learning over a complex heuristic.
(複雑なルールになってきたら機械学習を選択!)

multi-label problem 対応で、1つのカテゴリーに相応する1つのバイナリ分類器を作りました。例えば、「ポジティブ」カテゴリーは ポジティブ-or-not 分類器になります。最終的にデータが少なすぎるカテゴリーを除いて合計 81 の分類器を作成しました。将来もしカテゴリーが増えたら、そのカテゴリーに相応する分類器を作れば良いので、open set problem も対処できます。 imbalanced data problem (負例が正例より圧倒的に多い)に関しては、正例はそのままにし、負例は正例と同数になるように無作為に選びました。

f:id:vanhuyz:20180808154522p:plain

3. Keep the first model simple and get the infrastructure right.
(シンプルなモデルを保ち、インフラを適切に保つ)

今回はサポートベクターマシン (SVM) を採用し、scikit-learn で実装しました。F1 Score を 85% 以上になるまでチューニングしました。このぐらいの精度でも十分なので、早い段階でインフラを整備し、本番環境に導入しました。もちろん100% の性能を達成することは難しいため、完全に自動分類で手作業をなくすことではなく、分類業務へサポートという形で導入しています。

以下は導入後の管理画面のイメージで、結果的にご意見サジェストという形で導入しています。

f:id:vanhuyz:20180808154629p:plain

導入前はスタッフが 100 以上のカテゴリーの中から探さないといけないのに対し、導入後は数少ない「もしかしてカテゴリー」の中だけ選択すれば良いので、非常に楽になりました。(「もしかしてカテゴリー」になかった場合は、従来通り、全カテゴリーの中から探すことです。)実際に計測したら工数を半分まで減らすことができたという結果になりました。 また、分類するスタッフに聞いたところ、昔はメンバーによって判断のばらつきがありましたが、今は直感的に分類精度が上がったという話もありました。

また、学習モデルの精度を上げるために、再学習の仕組みを導入しました。選択されていない「もしかしてカテゴリー」は学習の負例となり、Rundeck/Jenkins で毎週定期的に training コンテナを起動し、モデルを再学習しています。新しいモデルができたら、inference コンテナがそのモデルに切り替えるように設定します。仕組みは以下のイメージです。

f:id:vanhuyz:20180808154645p:plain

これによって、状況が変わっても、モデルを劣化なく長期的に使うことができます。これからしばらく運用し、いつか完全に自動分類できるかもしれません。

最後に

今回は機械学習を用いてご意見分類業務を効率化した話を紹介しました。 クックパッドでは機械学習を活用したくさんの問題を解決しています。 このエントリを読んでご興味をお持ちいただけた方は、ぜひとも採用ページからご応募ください。

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/