レシピ生成システムの開発

前回、レシピ構造化について考えをまとめました。 これについてより深く考えるため、自分でシステムを作ってみたいと思います。 こちらの記事で大まかな目的やアーキテクチャを説明します。

Issues

一応ターゲットを決めたいと思います。自分です。

レシピ通りに作れない人です。

私が料理を作るとき:

レシピを探して、

「あこれ作りたいな」

買い物に行くと、

「あこれ安いな」

「あ冷蔵庫にあったあれも使い切りたいな」

作り始めると、

「この調味料量るのめんどくさいな」

「ちょっと余るより全部入れちゃえ」

私はよくこんな感じになります。

最終的にレシピ通り作れたことがない。 こうなる理由は2つあると考えています。

  • 料理が好き(料理の科学が好き)

料理が上手な人ではなく、好きな人です。 また、手間をかけてレシピ通りに作りたい人ではありません。

むしろ逆で、新しい組み合わせを試したくなったりするために、レシピ通りに作れない人です。

  • 一人暮らしなど作る人前が少ない

一人前だと、複数品目作るのは大変なので、一品に栄養を詰め込みたくなります。 また、冷蔵庫の食材を使い切ることが重要なので、レシピの分量よりも、残っている分量を優先してしまいます。

食材の分量が変わると調味料の分量も変わる。 全部k倍したわけじゃないので、もはや調味料の分量は計算できません。 そこで、適当になっちゃいます。

Purpose

自由にカスタマイズできるレシピを生成するシステムを目指します。

  • レシピ構造化

まずレシピを構造化する必要があります。

材料を食材の栄養成分や風味成分に紐づけたり、レシピ特徴を抽出したり。

  • 栄養・好み・食在庫をもとにパーソナライズ

次に、ユーザデータと紐づけてパーソナライズしたいと思っています。

ただ、これはユーザがいないと実証ができないので、追々です。

食事管理ツールとか作れれば。

System

開発するシステムのアーキテクチャを描いてみました。

f:id:harukary7518:20210831215406p:plain

食材データベース

まずは、食材に関するデータを統合します。

調べたところ、食材の栄養成分や風味成分などがまとまっている日本語データベースはありませんでした。

そのため、複数DBを統合する必要がありそうです。 そのためにはデータベース間で同一食材の認識(Entity Recognition)が必要です。

また、実は英語なら食材の全てと言っていいほどの情報を持つデータベースがあり、これを部分的に使うことも考えています。その場合は翻訳も。。

FooDBというデータベースなんですが、データが大きすぎて単純なテーブルじゃなく、使うのも難しそうです。 誰か使ったことある人いれば教えてほしい。。

レシピデータベース

次に、レシピデータの収集、食材データと紐づけたり、レシピ特徴を抽出します。

レシピデータは、研究室単位じゃないとダウンロードできないものが多いです。 なので、スクレイピングで集めることにします。

食材データの紐づけは、食材データベース間と同様の処理が必要です。 また、レシピから主食材や主手順などを抽出することで、レシピ特徴を表現します。

このような構造化をすることで、レシピのカスタマイズなどが可能になります。

レシピ生成

最後に、構造化レシピをもとに、カスタマイズしたレシピを生成します。

栄養素をもとに代替食材提案をしたり、2つのレシピを融合したりする予定です。

ここで、

「鶏むね肉 → 鶏もも肉+豆腐」

のように2つ以上の食材で代替できたらおもしろいですね。 サブグラフマッチングとか使えないかな。

レシピの融合については、あるレシピフレームワークを別のレシピに適用する感じをイメージしています。

例えば、生姜焼きのフレームワーク(豚薄切り・玉ねぎ×しょうが・甘辛×炒め)をジャーマンポテト(ベーコン・じゃがいも・玉ねぎの炒め)に適用します。

バランスをとるために肉じゃがっぽくにんじん追加、彩りのスナップエンドウ追加、みたいな。

イメージ画像です。

f:id:harukary7518:20210831215345j:plain

実は実際に自分で作ってみた料理なんですが、おいしかった。。

こういう提案をしてくれたら選ぶ楽しさとか、どうやったらおいしく調理できるかを考える楽しさがあっていいかもなと思うんです。

最終的には、ユーザインタラクションにつながるんですが、ユーザデータに基づく自動提案とかできたらいいですね。 上の提案を、食在庫、栄養、好み情報をもとにさらにパーソナライズする感じです。

ユーザインタラクション

ユーザデータを収集し、そこから好みや癖を推定します。

また、Entity Recognitionやレシピ生成をユーザインタラクションを利用するハイブリッドシステムにできたらいいなと思います。

ユーザが入力した材料のエンティティ候補を出し、選択されたエンティティにユーザ入力のメンションを追加する、みたいな。

Conclusion

「自由にカスタマイズできるレシピを生成するシステム」のコンポーネントを説明しました。 現状はミニマルなシステムと、半分夢見たいものが入った計画があります。 ここからミニマルシステムについて何回かに分けて紹介していこうと思います。

harukary7518.hatenablog.com

上の記事に「自然言語処理ではレシピ構造化は解けない」みたいなこと書いているんですけど、実際作っていて自然言語処理が必要な部分が多そうです。

なので勉強していこうと思い、GiNZAやWord2Vecを試しています。

harukary7518.hatenablog.com

harukary7518.hatenablog.com

でも、まだまだ理想は書ききれていなくて。

直観的・プログラミング的にレシピ構築できるツールを作ってデータを集めたい、とかね。

例えば、炒め物という入れ物に冷蔵庫にある食材を入れると、それに合う食材・調味料が候補として出てくる。 その中から選んでレシピ、買い物リスト生成する。

最近それに近いアプリみつけて、うおおってなってた。これもブログに書こう。

とにかく、自分の頭が回るものを作って勉強していこうと思います。

Link

今回開発するシステムのソースコードはこのリポジトリにあります。

github.com

また、この中で使われている処理について、勉強がてらまとめているリポジトリがこちらです。

github.com