義理といえば?クックパッドのレシピをword2vecで料理してみた

会員事業部の有賀 (@chezou) です。

クックパッドは、先日学術機関向けにレシピと献立のデータを公開しました。 研究者の方々にクックパッドのレシピ・献立を使っていただくことで、料理に関する研究の発展に貢献できればと思いデータ公開に至りました。

今回は、その中でもクックパッドのレシピデータを使った分析事例として、word2vec を使ったテキスト分析を行ったのでご紹介します。

なお、 3 / 7 (土) に日経新聞電子版さんと共催で、このデータを含む各種データを使った学生向けデータハッカソンを開催します。締め切りは 2 / 27 (金) と間近ですが、興味がある方はぜひご参加ください。

word2vec とは

word2vec は単語を意味を含んだベクトルで表現できるようにするツールです。Tomas Mikolov らが提案し、その実装を公開しています。

CBOW (Continuous Bag-of-Words) や skip-gram といった Neural Network のモデルを用いて単語のベクトル表現を学習することで、異なる単語間の類似度を計算できるのはもちろん、意味的な足し算引き算ができるようになったという点で画期的だと言われています。

日本では、形態素解析器MeCabで有名な工藤拓さんの解説で広まり、あんちべさんが記事にしたことで一躍有名になりました。また、オライリーからもとてもわかりやすい解説書が出ています。薄い本ですのでこちらを読むと良いと思います。

義理といえば?

2月はバレンタインデーがありました。バレンタインデーは、クックパッドの1年の中で最もアクセスが集中する日です。

その主役の「チョコ」に類似する単語を見てみましょう。

順位 単語 類似度
1 チョコレート 0.938
2 ガナッシュ 0.757
3 マシュマロ 0.746
4 ビターチョコ 0.744
5 クランチ 0.730

f:id:chezou:20150224110143p:plain

グラフは「チョコ」に類似する語のベクトルを主成分分析で可視化したものです。

マシュマロのように、バレンタインに送られるお菓子として出てくるものや、生チョコを作るときに使うガナッシュのように更に別のチョコを作るためのものも出てきています。

では、「義理チョコ」といえばなんでしょうか?

順位 フレーズ 類似度
1 友_チョコ 0.781
2 バレンタイン 0.718
3 バレンタインデー 0.688
4 本命_チョコ 0.682
5 本命 0.676

f:id:chezou:20150224110435p:plain

義理チョコといえば、どうやら友チョコが多いようです。 作る量としては友チョコの方が多いそうなので、やはり需要が多いのでしょうね。

義理チョコではバレンタインに関連したものばかりでしたが、試しに「義理」だけだとどういう関連性が見られるか調べてみましょう。

順位 フレーズ 類似度
1 0.670
2 料理_上手_な 0.667
3 義母 0.651
4 お母さん 0.634
5 お母様 0.623

f:id:chezou:20150224110503p:plain

そう、クックパッドの世界で「義理」だけだと、義理のお姉さんや義母といった方々がよく登場するようです。

バレンタインの要素はどこへいってしまったのでしょうか? word2vec の面白いところは、単語をベクトルで表現することで意味的に足したり引いたりできることでしたね。それでは、「義理」から「母」を引いてみましょう。

順位 単語 類似度
1 デコペンレシピ 0.295
2 マンディアン 0.291
3 チョコカップケーキ 0.287
4 小枝 0.286
5 本命 0.281

このように、バレンタインっぽい単語が増えてきました。

擬態語の獲得の可能性

レシピの中には、「アツアツ」のように擬態語が良く出てきます。 このような擬態語は、人間なら似たイメージを持つ別の語を容易に思い浮かべることができます。しかし、機械がそれをするのは一苦労でした。

では、 word2vec で似た擬態語を捉えることはできるのでしょうか?「アツアツ」に類似した単語を見てみましょう。

順位 単語 類似度
1 熱々 0.961
2 あつあつ 0.946
3 あったかい 0.745
4 ホカホカ 0.712
5 ハフハフ 0.685
6 温かい 0.682
7 アッツ 0.673
8 あたたかい 0.647
9 ふうふう 0.645
10 フウフウ 0.631

f:id:chezou:20150224110527p:plain

word2vec を使うことで、「アツアツ」のような擬態語からも似たような文脈で用いられる擬態語が獲得できるようです。似た擬態語を持つレシピを集めることで、冬に食べたい体があたたまるレシピ、なんてものも見つけやすくできるかもしれませんね。

足し算、引き算

私は名古屋出身なのですが、名古屋といえば赤味噌です。一家に一本チューブ型味噌を持っているのは本当です。

まずは、赤味噌の類似フレーズを見てみます。

順位 フレーズ 類似度
1 八丁_味噌 0.824
2 味噌 0.809
3 赤_みそ 0.805
4 八_丁_味噌 0.767
5 信州_味噌 0.741

f:id:chezou:20150224110548p:plain

なるほど、名古屋で赤味噌といえば八丁味噌ですね。納得です。

では、1世帯あたりの味噌の消費量日本一の長野はどうでしょうか? 赤味噌 - 名古屋 + 長野をみてみましょう

順位 フレーズ 類似度
1 信州 0.509
2 味噌 0.503
3 麦_味噌 0.503
4 信州_味噌 0.499
5 赤味噌_白味噌 0.481

おお!確かに長野といえば信州味噌ですね。見事に引き算ができているのがわかります。

でも、これはたまたまなのではないでしょうか?それでは、赤味噌 - 名古屋 + 京都も見てみましょう。

順位 フレーズ 類似度
1 白味噌 0.567
2 麦_味噌 0.547
3 顆粒_だし 0.507
4 だし汁 0.496
5 出し汁 0.488

確かに、京都では白味噌が使われています。 このように、クックパッドでは「名古屋」や「京都」というと「味噌」の意味合いが含まれているようです。

word2vec の可能性

word2vec は単語をベクトルとして表現するところが新しいと書きましたが、クックパッドで使うとしたら辞書の整備 (同義語・類義語の拡張) に使えるのではないか、と考えています。

ですが、現状の word2vec を単純に使う場合、それが本当に同義語なのか、辞書に追加して悪影響が出ないのか、という検証が必要になってくるため方法を模索しています。

また、来月開催される言語処理学会の年次大会でも、単語のベクトル表現を用いた同義語獲得の発表があるようですので、様々な研究成果を応用していきたいと思います。

なお、今回のグラフは、前述のオライリー本の付録の可視化ツールiPython notebook で使えるようにしたものを利用しました。(notebook)

iPython notebook は試行錯誤的にグラフを描画するのに最適ですし、 @ryot_a_rai さんに立てていただいた社内 nbviewer で、手軽に可視化したグラフを共有することができました。

参考文献