[CCLab21秋] Text2TextでText2Tasteをする意義を模索する
※ Computational Creativity Lab(慶應義塾大学 徳井直生研究室)の2021年度秋学期最終レポートとして、今学期の成果をまとめています。
取り組みの概要
私は現在、レシピ文章から新しいレシピ文章を生成する取り組みを行っています。
本研究では、国立情報学研究所のIDRデータセット提供サービスによりクックパッド株式会社から提供を受けた「クックパッドデータセット」を利用しております。cookpadは料理レシピのコミュニティウェブサイトです。データセットにはレシピの材料や調理手順、料理カテゴリに加えて、料理を作ったユーザのコメントの情報、が含まれています。
クックパッドのデータセットを元に、自然言語処理を用いた新しいレシピの生成を試しています。
機械と味
そもそも、機械と味の関わりは直感的に捉えられるものではないでしょう。しかし現在、 食のIT革命と言われる「フードテック」が注目される中で、機械と味の結びつきは味をセンサーで数値化する研究など様々な形で起きています。
機械学習を用いたレシピに関するアプローチも多く存在しています。料理画像からレシピを提供するAI(image2recipe)、料理画像から材料を推定するAI(image2ingredients)、手元の材料から最適なレシピを提案してくれるAI、材料同士の組み合わせを提案するAI、…etc
テキストからレシピを生成するという私の取り組む問題についても、Googleによる取り組みがなされています。
取り組みの結果
そんな中で今学期は、冒頭でも紹介したcookpadのレシピデータの中の”料理カテゴリ”に着目して、カレーレシピの生成を行いました。T5(Text-To-Text Transfer Transformer)を用いた日本語事前学習済みモデルを転移学習させており、タイトルからレシピ本文を生成しています。
味を文字を介して間接的にしか学習できない機械と、その中で発せられるユニークな材料の組み合わせから人間が調理過程で工夫して新しいレシピを開発することを目的としています。
まず、“カレー”のカテゴリがついたレシピ1415件をデータベースから抽出しました。同じカレーとは言っても日本の家庭で一般的に食べられているようなカレーのレシピから、エスニックなカレー のレシピ、また、使用する肉の種類や、スープ状、ドライなのかといった分類を含めて、10の分類がカレーカテゴリ内に内包されています。
結果として以下の通りの出力になっています。
【絶品カレー】
大きめの鍋にサラダ油を入れ、しょうが・にんにくを炒め、香りが出たら玉ねぎを加え、しんなりするまで炒める。(中火)ひき肉を加え、色が変 わったらカレー粉を加え、塩コショウをする。水とコンソメを入れて煮込み、アクが出れば取り除く。ケチャップ・ソースを加えて味を整える。ご飯と一緒 にどうぞ。
オーソドックスな家庭のカレーのレシピが生成されます。
【エスニックカレー】
材料を準備します。にんにくとしょうがはすりおろします、玉ねぎもすりおろします(油は引かない)オリーブオイルを熱しニンニク・しょうがを入れ香りを出します。たまねぎを加えしんなりするまで炒めます水2カップを加えて強火で沸騰させます。アクが出たらとる程度に煮込みます。カレールーを加え溶かしたら弱火にしてナンプラーを加えます。味を見て塩加減を調整して出来上がり。お好みで粉チーズをかけてくださいませ^^
タイのカレーとして学習された要素(ナンプラー)が使われるようになっています。
【コンソメスープ】
まず初めにコンソメスープを作ります。(コンソメスープは煮込み用です)次に具材を切ります、にんにくとしょうがのみじん切りを炒めます。そ こにコンソメスープとカレー粉を入れます。全体に油が回ったらコンソメスープの素を入れます。少し煮込んだら仕上げにバターを入れて完成です。ご飯と 一緒にどうぞ!
タイトルとして学習されていない、かつ、レシピ中に出てくるワードをタイトルに用いる。学習にカレーのレシピしか用いていないために、カレーのレシピとして出力されている。
以上、カレーだけのデータで学習させたところ、料理の具材としてバリエーションが出なかったために、同データの中から”まぜご飯”421件、”リゾット”298件のデータを加えて再度学習、生成を行いました。
【鶏肉と白菜のカレー】
【下準備】鶏肉は一口大に、白菜と胡麻は粗みじん切りにする。フライパンを熱し、サラダ油をひいて鶏肉を炒める。鶏肉の色が変わっ たら玉葱を加え、しんなりするまでしっかり炒める。2「カレー鍋」に水・白菜・ローリエを入れ、煮立ったら弱火にして蓋をして15分煮込む。その後ル ーを入れて溶かし、再び弱火で10分煮込んだら完成。
鶏肉と白菜の処理に加えて、鍋に投入するところまでがレシピとして記載されている。
【ひじきのカレー】
パターン1
オクラの塩茹で汁とカレー粉を鍋に入れて火にかけ、ひじきも加えて炒める。水を加えて煮立たせ、ローリエとセロリを加えてひと煮立ちさせる( そのままでもおいしい)。カレールーを加え、少しづつ味を足しながら煮詰める。好みのとろ加減になるまでじっくり煮込んで出来上がり。
パターン2
ひじきは水で戻しておき、玉ねぎは粗みじん切りにする。鍋にサラダ油とにんにくのみじん切りを入れ、弱火で炒める。香りがしてきたらたまねぎ を入れてしんなりするまで炒め、カレー粉を加えてさらに炒める。カレー粉の濃度が変わってきたら、豚ひき肉を加え、色が変わるまで炒める。トマト缶を 加え、煮立てて完成♪
同じタイトルでも異なるレシピが生成される。精度が高くデータ内のレシピ文に生成結果が混じっている可能性も考えたが、ひじきを使ったカレーレシピはデータには含まれていない。
【生姜とゴボウのカレー】
生姜、玉ねぎはみじん切りにする。ゴボウも一口大の大きさに切る。鍋に油を熱し、1の材料を炒める。2に生姜、ゴボウ、水を加え、煮立ったら 弱火にして蓋をして10分煮込む。一度火を止め、カレールーを入れ溶かし、再び弱火で10分煮込む。仕上げにガラムマサラを振り入れて完成!
以上の通り、具材名をタイトルに含む生成は、カレーのレシピとしても、材料の処理としても不自然ではない生成がなされる。
【和風カレー】
じゃがいも、にんじんは皮をむき2センチ角に切る。しめじは石づきをとり、ほぐす。鍋にサラダ油を熱し、豚ひき肉の色が白くなるまで炒める。 じゃがいもとにんじんを加え、軽く炒めたら水を入れ、煮立ったらアクを取りながら煮込む。じゃがいも以外の材料が柔らかくなったら、カレールウを加え る。ルウが溶けたら弱火にして、10分ほど煮込んで出来上がり♪
【イタリア風カレー】
玉ねぎをみじん切りにして、オリーブオイルで炒める。しんなりしたらトマト缶を加えて、煮立たせる。1に水500mlとブイヨンペーストを入 れて、沸騰したら弱火にして20分煮込む。2の煮込み時間30分ほど置いて、ルーを溶かしてから再度煮込む。出来上がり30分後…。冷蔵庫から出 したてのご飯にかけ、パセリを振ったら、出来上がり♪お好みで、ゆで卵を乗っけてもよさそうです(笑)
フィーリングの入力でもそれなりの出力が得られる。
カレーというジャンルに絞ること、また、タイトルという少ない制約からの出力になることで、レシピの文章としてはそれなりに美味しいレシピの出力がなされた。
反省・これから
今回は料理カテゴリ区分を意識した生成を行いましたが、先学期扱ったつくれぽの評価はコミュニティアプリのデータならではのユニークなデータだったと感じました。カテゴリという客観的なデータと、つくれぽという主観的なデータの両者を含めたレシピ生成の手法を模索しようと思いました。
実際に、カレーを作っての反省が以下になります。生成したカレーただただ美味しい。というのも、レシピに制約が少ないため、あまりにも人為的な操作が加えられすぎるからです。
材料の分量については、データの表記が例えば漢字ひらがなで異なっていたり、記号が加えられていたり、カッコつきの補足説明がされていたりする為に、正規化の難度が高く、材料を避けてレシピ本文の生成を進めていました。実際、生成に使ったレシピ本文についても、レシピとは合い入れない文章もまだ含まれていますが、生成には幸い影響を及ぼしていないだけになっている。春休みは、材料表記の正規化と、材料のデータをどう学習に組み込むのかを中心に調査していきたいと思います。また個人的な興味によるところも大きいですが、XAI(説明可能なAI)についても学んでいきたいと思っています。
今年の4月から自炊は生成したレシピのみで行っていきます。実際自分でレシピを作る、料理を作る、食べる中で自身の研究の知見を深めていこうと思います。また、ブラックボックスとしてそのままにしている部分が未だ多くあります。来年、卒業論文としてふさわしい成果を出せるように、生成結果とのにらめっこだけではなく、真摯に技術に向き合いながら制作を行っていきたいと思います。