10

ruby レシピ管理アプリケーションを構築しています。その一環として、材料の量を解析して、比較およびスケーリングできる形式にしたいと考えています。これを行うための最良のツールは何か疑問に思っています。

私は当初、複雑な正規表現を計画し、次にtwoまたはのような人間が読める数値fiveを整数に変換する他のコードを計画し、最後に1 cupおよび3 teaspoonsを何らかの基本測定値に変換するコードを計画しました。入力を制御するので、実際の成分を分けておきました。to tasteしかし、ユーザーがや などの抽象的な測定値を入力していることに気付きました1 package。少なくとも抽象的な測定値では、それらを無視してスケーリングし、それらの前の数値をスクレイピングすることができると思います。

ここにいくつかの例があります

1 tall can
1/4 cup
2 Leaves
1 packet
To Taste
One
Two slices
3-4 fillets
Half-bunch
2 to 3 pinches (optional)

これには何かトリックはありますか?私は、ユーザーが数量を構成するものについて多少混乱しているように見えることに気付きました. より厳格なルールを適用して、 や などを成分部分に押し込むこともできtall canますleaves。ただし、それを強制するためには、無効なものを伝えることができる必要があります。

また、数量を変換する必要がある「基本」測定値もわかりません。

これらが私の目標です。

  1. レシピをスケーリングできるようにするため。 のような任意の測定単位は スケーリングする必要packagesはありませんが、正確なものはスケーリングcupsする ounces必要があります。

  2. 「主な」成分を把握します。 この質問のコンテキストでは、これは主に、レシピに含まれる最大の成分を把握することによって行われます. flour生産では、明らかに、 「主な」成分と見なされることはほとんどないため、成分の種類に基づいて何らかの修飾子が必要になります。しかし、chocolate控えめに使用することができ、それはまだchocolate cake.

  3. 入力を正規化します。 サイトの一貫性を維持するために、一貫した略語を維持したいと考えています。たとえば、 ではなく、poundsにする必要がありますlbs

4

4 に答える 4

23

数量表現の認識/抽出 (構文) と、それらが意味する数量の把握 (セマンティクス) という 2 つの問題を提起します。

数量を認識するのに正規表現で十分かどうかを判断する前に、正規表現がどのように見えるかの適切なスキーマ (文法) を自分で作成する必要があります。例は次のようになります。

<amount> <unit> [of <ingredient>]

where<amount>は多くの形式を取ることができます:

whole or decimal number, in digits (250, 0.75)
common fraction (3/4)
numeral in words (half, one, ten, twenty-five, three quarters)
determiner instead of a numeral ("an onion")
subjective (some, a few, several)

金額は、2 つの単純な の範囲として表すこともできます<amount>

two to three
2 to 3
2-3
five to 10

次に、ユニット自体があります。

general-purpose measurements (lb, oz, kg, g; pounds, ounces, etc.)
cooking units (Tb, tsp)
informal units (a pinch, a dash)
container sizes (package, bunch, large can)
no unit at all, for countable ingredients (as in "three lemons")

最後に、金額または単位のいずれとも組み合わせることのできない式の特殊なケースがあるため、両方の組み合わせとして効果的に機能します。

a little
to taste

これを小さなパーサーとしてアプローチすることをお勧めします。これは、必要に応じて詳細またはラフに作成できます。これらすべての正規表現を書くのは、それがあなたの選んだツールであるなら、それほど難しいことではありません。パーツを取り出して、各成分をトリプルとして表します(amount, unit, ingredient)。(可算の場合は、「個」などの特別な単位を使用します。「少し」などの場合は、特別な単位として扱います)。

これにより、数量の変換または比較の問題が残ります。単位換算は多くの場所で行われているので、少なくとも公式の単位については換算表を入手するのに問題はないはずです。たとえば、「4オンスをグラムに変換」と入力すると、Googleがそれを行います. 大さじ 1 杯は、国によって小さじ 3 杯または 4杯であることに注意してください。

明確に定義された単位については、お気に入りの単位に非常に簡単に標準化できますが、非公式の単位は少しトリッキーです。「ピンチ」、「ダッシュ」などについては、適切にスケーリングできるように、おおよその重量を見つけることをお勧めします (10 ピンチ = 2 グラムなど)。缶などは、具体的な商品のサイズを調べないとだめです。

一方、主観的な量は最も簡単です。「味わう」を 10 倍にスケールアップしても、「味わう」ことには変わりありません。

最後に 1 つの考え: サイズが重要であるため、主要な材料を認識するために、ある種の材料データベースも必要です。「卵 1 個」はおそらく主要な材料ではありませんが、「1 匹の小さな山羊を 4 等分したもの」はおそらく主要な材料である可能性があります。バージョン 2 を検討します。

于 2012-09-18T18:09:44.073 に答える
10

正規表現は、自然言語の解析に適したものにするのが困難です。あなたが言及したように、NLTK はおそらく調べるのに良いオプションでしょう。

NLTK の代わりに Ruby のようなものが必要な場合は、Treat をご覧ください。

https://github.com/louismullie/treat

また、言語学のフレームワークも良い選択肢かもしれません:

http://deveiate.org/projects/Linguistics

編集:

すでに Ruby レシピ パーサーが存在している必要があると考えました。検討したい別のオプションを次に示します。

https://github.com/iancanderson/ingreedy

于 2012-09-14T13:56:05.103 に答える
6

優れた Web スクレイパーと解析ツールの書き方を知っていれば、無料で利用できるトレーニング データがたくさんあります。

http://allrecipes.com/Recipe/Darias-Slow-Cooker-Beef-Stroganoff - このサイトでは、メトリック/インペリアル システムとダイナーの数に基づいてレシピの量を変換できるようです。

http://www.epicurious.com/tools/conversions/common - このサイトには多くの変換定数があるようです。

構造化された形式 (基礎となる html を読むことで発見できます) で食材や手順を提示している既存のレシピ サイトを体系的にスクレイピングすると、このような問題をはるかに簡単に解決できる非常に大きなトレーニング データ セットを構築するのに役立ちます。

大量のデータがある場合、単純な学習手法でも非常に役立ちます。大量のデータを取得したら、標準の nlp トリック (ngrams、tf-idf、naive bayes など) を使用して、素晴らしいことをすばやく行うことができます。

例:
主な成分-ネス
idf (逆ドキュメント頻度) が高い料理の食材は、主な食材である可能性が高くなります。すべての料理には塩が含まれているため、IDF は非常に低くする必要があります。油に言及する料理ははるかに少ないため、IDF を高くする必要があります。ほとんどの料理にはおそらく主要なタンパク質が 1 つしかないため、「チキン」、「豆腐」などのフレーズは、塩、玉ねぎ、油などよりもまれであり、主な食材である可能性がはるかに高いはずです.これは「鶏肉」よりもまれかもしれませんが、すべての料理に関連するメタデータをかき集めていれば、この問題を解決するのに役立つシグナルも得られます。ほとんどのシェフはレシピでコリアンダーを使用していないかもしれませんが、使用しているシェフはおそらくかなり多く使用しています. ですから、どの成分名でも、その名前を把握できます」

レシピのスケーリング
ほとんどのレシピ サイトでは、特定の料理を何人で提供するかについて言及しており、その人数に適した分量を記載した別の材料リストを用意しています。
特定の材料について、その材料に言及しているすべてのレシピを収集し、何人の人にどの量の材料が処方されたかを確認できます。これにより、その成分の量を説明するためにどのフレーズが使用されているか、および数値がどのようにスケーリングされるかがわかります。また、特定のフレーズを使用して量が記述されているすべての材料を収集できるようになりました (例: 'スライス' -> (パン、チーズ、豆腐など)、'カップ' -> (米、小麦粉、ナッツなど)。 .)) これらのフレーズの最も一般的なものを見て、それらがどのようにスケールするかを手動で書き留めます。

入力の正規化
これは難しい問題ではないようです。一般的な略語とその完全な形式のリストを手動で作成すると (例: 'lbs' -> 'pounds'、'kgs' -> 'kgs'、'oz' -> 'ounces' など)、問題の 90% が解決するはずです。新しい短縮形をこのリストに追加すると、しばらくするとこのリストがかなり包括的になるはずです。

要約すると、データのサイズを大幅に増やし、スクレイピングする各レシピ (著者情報、食品ジャンルなど) とともに関連するメタデータを大量に収集し、このすべての構造化データを単純な NLP/ML トリックと共に使用するようお願いしています。インテリジェントなレシピ サイトを構築しようとしているときに直面するほとんどの問題を解決します。

于 2012-09-22T22:59:05.097 に答える
0

これらに関する限り:

  1. これらをハードコーディングして、オンス以上の場合はカップに、カップの数を超える場合はパイント、リッター、ガロンなどに移動します.どうすれば回避できるかわかりませんこれは、誰かがこれを処理するコードを既に書いていない限りです。

  2. タイトルに材料があれば、おそらく主な材料です。ただし、「オートミール レーズン クッキー」では問題が発生します。おっしゃる通り、小麦粉や牛乳などは主原料ではありません。また、ベーコン、ポーク チョップ、ポーク ローストをすべて豚肉に、ステーキ、ハンバーガーなどを牛肉にマッピングする必要があります。

  3. 繰り返しますが、これは何かの量を調べるだけです。人々はポンド、オンスなどを持っていることを知っているので、それらを先取りして、できる限りこれを書いてみてください. 見落としがあるかもしれませんが、サイトが成長するにつれて、新しいフィルターを導入できるようになります。

このすべての作業を行った場合は、リリースすることを検討してください。他の人がそうする必要はありません:)

于 2012-09-14T13:35:11.560 に答える