クックパッドマートの多種多様な商品名から、扱いやすい「食材キーワード」を予測する

研究開発部の山口 (@altescy) です.今回は最近開発したクックパッドマートの商品の「食材キーワード」を予測する機械学習モデルを紹介します.

商品の食材キーワード予測とは?

クックパッドマートでは日々様々な食材が多くの販売者から出品されています.出品される商品の情報は販売者によって登録されるため,多様な表記が存在します.「じゃがいも」の商品名を例に挙げると,「ジャガイモ」「じゃが芋」といった表記の揺れや,「メークイン」「インカのめざめ」といった品種名が書かれているもの,「農家直送」や「お徳用」のようなキャッチコピーがついたもの,など様々です.一方で,商品の検索や推薦を行う際にはその商品がいったい何なのかを簡潔に表す情報が欲しくなります.

そこで登場するのが「食材キーワード」です.商品名や商品説明とは別に,その商品がどんな食材なのかを表すキーワードを設定しておくことで,商品名の表記揺れによる検索精度の低下を抑えたり,その食材を利用したレシピの提案をしたりするなどの応用が可能になります.

設定すると便利な食材キーワードですが,出品されている商品は非常に多く種類も多様であるため,これまで出品されてた商品に対して手動でひとつずつ設定していく作業は大きな負担となります.そこで今回は商品の食材キーワードの設定作業を支援するために,商品名から食材キーワードの候補を予測する機械学習モデルの開発を行いました.

データセットの準備

機械学習モデルを学習・評価するために約5,000件の商品に対して食材キーワードのアノテーションを行いました.その結果,作成したデータセットに含まれるユニークな食材キーワードの数は1,300以上あり,その分布もロングテールであることがわかりました.データセットのサイズに対してキーワードの数が多く,事例が2〜3個しかないキーワードも多いため,通常の分類モデルを用いた手法で十分な精度を出すことは難しそうです.

一見難しそうな分類問題に見えますが,実際にデータを見てみると商品名の中には食材キーワードに対応する言葉が入っている場合がほとんどです.例えば,食材キーワードとして「にんじん」が設定された商品名をみると「にんじん」「人参」「キャロット」などの単語が入っていたり,「えび」がキーワードに設定されている商品名なら「エビ」「海老」あるいは「ブラックタイガー」のような単語が含まれています.

このような性質から,食材キーワードを単なるラベルとして予測するよりも,商品名と食材キーワードの類似性や対応関係を考慮して予測を行った方が良い結果が得られそうです.そこで,今回は商品名とキーワードの類似性に基づいて 距離 *1 を学習するようなモデルを試すことにしました.

食材キーワード予測モデル

モデルの仕組み

作成したモデルは以下の図のような構造です.商品名・キーワードをそれぞれニューラルネットワークを用いてベクトルに変換して,ベクトル同士の距離を商品名・キーワード間の距離として利用します.

モデルの構造
モデルの構造

処理の流れ

  1. 商品名の前処理 (全角・半角を揃える,数値やストップワードの削除など)
  2. 商品名・キーワードを単語に分割
  3. 2で分割した単語を fastText を用いて対応する単語ベクトルに変換
  4. 3で作った商品名・キーワードの単語ベクトル系列をそれぞれ LSTM を用いて変換
  5. 4で変換した商品名の単語ベクトルを,キーワードの単語ベクトル列を使って重み付け (後述)
  6. 商品名・キーワードの単語ベクトル系列をそれぞれ平均して商品名・キーワードのベクトルを作る
  7. 6で作った商品名・キーワードのベクトル同士のコサイン距離を商品名とキーワードの距離とする

fastText はクックパッドで公開されている350万レシピを用いて事前に学習したものを利用しました.

学習手法

ペアになる商品名・キーワード同士の距離が近くなるようにモデルの学習を行います.ただし,単純にペア同士の距離が近づくように学習するとすべての商品名・キーワードを同じ1点に集めれば距離を0にできてしまうため,負例サンプリングを行ってペアにならない商品・キーワード同士は距離がなるべく離れるように学習します.

商品名の単語の重み付け(注意機構)について

商品名の単語の重み付け(注意機構)について詳しく説明します.

商品名の単語に対して重み付けをする動機は,商品名に含まれている「◯◯県産」や「農家直送」など,キーワード予測においては本質的でない単語の影響をなるべく取り除きたいからです.簡単なものであれば前処理の段階でルールに基づい て取り除くことができますが,「昔ながらの...」や「肉の日限定10%オフ!」など,商品名に含まれるパターンは多様であり,事前にルールのみで対処することはなかなか困難です.

そこで,今回のモデルではキーワードとの類似度を利用して商品名の単語に対する重みを計算し,キーワードに関連のある単語の影響が強くなるようにしました.下の図が商品名の単語の重みを計算する様子です.

単語の重み付けの仕組み
単語の重み付けの仕組み

商品名とキーワードの単語同士で類似度を計算したあと,キーワードの単語方向に平均した結果が商品名の単語の重みになります.こうすることでキーワードに含まれる単語に似た単語の重みは大きくなり,関連性の低い単語は相対的に重みが小さくなります.例えば,この図では「カラー」や「にんじん」といった単語の重みが大きくなり,「淡路島」などキーワードと関連性の低い単語の影響を小さくできそうです.

モデルの精度

アノテーションしたデータのうち,約1,500件をテストデータとしてモデルを評価した結果が以下の表になります.LSTM分類器はベースラインとして fastText + LSTM で商品名から直接食材キーワードを分類したモデル,距離学習モデルが上で述べた手法,距離学習モデル(注意機構なし)が距離学習モデルから注意機構による単語の重み付けをなくしたモデルになります.

Accuracy@1 Accuracy@5 MRR
LSTM分類器 62.5 72.5 67.1
距離学習モデル (注意機構なし) 75.2 91.3 82.3
距離学習モデル 78.5 95.5 85.7

最も精度の高い距離学習モデルの上位5件の正解率 ( Accuracy@5 ) は 95.5% でした.この結果から,最も関連があると予測されたキーワード数個を選んだ場合に高い割合で正解のキーワードを含むモデルになっていることがわかります.

距離学習モデルの結果をLSTM分類器のものと比較すると Accuracy@5 では +20% 以上の改善がみられました.これは商品名と食材キーワードの類似性を捉える距離学習の仕組みが役に立ったと言えそうです.

また,注意機構ありとなしの場合で比較してみるとそれぞれの指標で数ポイントずつですが注意機構を導入した場合の方が良い結果が得られました.

考察

今回作成したモデルの性質についてわかったことをまとめます.

まず、良いと感じた性質について述べます:

  • 表記揺れの吸収: レシピデータで学習したfastTextは,その単語が使われる文脈に含まれる他の単語との共起性に基づいて作られるため,「人参/にんじん」や「鯵/アジ/あじ」といった表記の揺れを吸収することができます.また「サンふじ/りんご」や「五郎島金時/さつまいも」のような品種名と一般名詞との関係もある程度考慮できているようです.
  • キーワードの拡張性: このモデルはキーワードを直接予測する分類モデルと異なり商品名とキーワードをそれぞれ与えて距離を測るため,再学習することなくキーワードを拡張することができます.もちろん予測したいキーワードが学習データに含まれていた方が好ましい結果が得られやすいとは思いますが,学習データに含まれていないキーワードであってもある程度妥当な距離が計算できそうです.

一方で,このモデルにはいくつかの課題があると感じています:

  • 推論速度: このモデルは商品名が与えられたときにキーワード群の全てのキーワードとペアを作って距離を計算する必要があります .そのため,キーワード数や推論対象の商品が多くなった場合には計算量が多くなり推論速度の点でボトルネックになりそうです.
  • ハブネス問題: fastTextでは多くの文脈で登場する単語ベクトル同士は互いに近くなります.そのため高頻度で現れる単語が商品名 ・キーワードに含まれていると,商品の性質に関わらず互いに近くなる傾向があります.例として「白」が含まれる単語同士は互いに近くにあるらしく「白ワイン」に対する推薦結果に「白なす」や「白玉ねぎ」が含まれたりします.このように区別したい性質を超え て多くのデータ点と近いベクトルが現れることは「ハブネス問題」と呼ばれていて,特に高次元ベクトルの近傍を利用するモデルにおいて課題になることが知られています(Radovanović+, 2010)

食材キーワード予測モデルの活用

今回作成した食材キーワード予測モデルは,現在社内向けサービスとして食材キーワードの設定を支援するために利用しています.予測結果の上位5件をキーワード設定フォームの上部にボタンとして表示し,これをクリックすると選択したキーワードが入力される,という感じです.設定者が適切な候補を考える手間が省けるため,効率的に食材キーワードの設定ができるようになったと思います.

食材キーワードの設定画面
食材キーワードの設定画面

まとめ

クックパッドマートの商品の食材キーワードを予測するタスクについて紹介しました.大量のレシピデータで学習した fastText と注意機構を活用することで,比較的小規模なデータセットであっても1,000クラス以上の分類問題をある程度の精度で解くことができるようになりました.

今回作成したモデルは現在社内向けのサービスとしてのみ利用していますが,今後は販売者向けの管理画面などにも利用できるようにモデルの計算量の削減や予測性能性能の向上を模索したいと思います.

*1:注意機構が商品名と食材キーワードで非対称なので厳密には距離ではないですね

/* */ @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;*/ /*}*/