Merge branch 'master' of woodyfolsom.net:/opt/git/cs6601p2
This commit is contained in:
Binary file not shown.
@@ -452,7 +452,7 @@ on high speed until foamy.</step>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Breaded Veal Cutlet ( Weinerschnitzel )</title>
|
||||
<title>Weinerschnitzel</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Veal</cat>
|
||||
@@ -673,7 +673,7 @@ baking powder and salt.</step>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Chinese: Cashew Chicken 1</title>
|
||||
<title>Cashew Chicken</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Cashews</cat>
|
||||
@@ -1796,7 +1796,7 @@ with crunbled bacon and grated cheese to taste.</step>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Tabasco Classic - Perfect Seared Steaks ****</title>
|
||||
<title>Tabasco Classic Seared Steaks</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Tabasco</cat>
|
||||
@@ -2152,14 +2152,15 @@ couple inches margin around for sauce --- see above). VEGAN/OVO.
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Black Bean Soup</title>
|
||||
<title>Lemon Pork Chops</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Appetizers</cat>
|
||||
<cat>Vegetarian</cat>
|
||||
<cat>Soups</cat>
|
||||
<cat>Easy</cat>
|
||||
<cat>Low-cal</cat>
|
||||
<cat>Main dish</cat>
|
||||
<cat>Pork</cat>
|
||||
</categories>
|
||||
<yield>6<unit>servings</unit>
|
||||
<yield>4<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
@@ -2171,82 +2172,18 @@ couple inches margin around for sauce --- see above). VEGAN/OVO.
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>Black beans</item>
|
||||
<prep>soaked</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>8</qty>
|
||||
<unit>cups</unit>
|
||||
</amt>
|
||||
<item>water</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>onion</item>
|
||||
<prep>chopped</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>green pepper</item>
|
||||
<prep>chopped</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>celery</item>
|
||||
<prep>chopped</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>carrots</item>
|
||||
<prep>chopped</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>8</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>olive oil</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<qty>4</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>garlic cloves</item>
|
||||
<prep></prep>
|
||||
<item>Pork Loin Or Rib Chops</item>
|
||||
<prep>3/4"</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
<qty>0</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>cumin</item>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
@@ -2254,32 +2191,41 @@ couple inches margin around for sauce --- see above). VEGAN/OVO.
|
||||
<qty>4</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>white vinegar</item>
|
||||
<item>Thin onion slices</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
<qty>4</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>soy sauce</item>
|
||||
<item>Thin lemon slices</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>4</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>Packed brown sugar</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>4</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>ketchup</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Simmer beans in water till soft.
|
||||
|
||||
Saute onions, pepper, celery & carrots in olive oil til the onions
|
||||
turn golden brown. Add garlic, cumin, vinegar & soy sauce. Cook,
|
||||
stirring for 3 minutes.
|
||||
|
||||
Drain about 1/2 c water from beans & add it to the saute. Cook over
|
||||
a low heat for 30 minutes.
|
||||
|
||||
Combine vegetables with beans. Cook for another 30 minutes, adding
|
||||
more water if necessary.
|
||||
|
||||
Joel Rapp, "Mother Nature's Vegetarian Feasts"</step>
|
||||
<step>Heat oven to 350F. Sprinkle both sides of pork chops with salt.
|
||||
Place pork in ungreased shallow baking pan or dish. Top each with
|
||||
onion slice, lemon slice, 1 Tbsp brown sugar and 1 Tbsp ketchup.
|
||||
Cover and bake for 30 minutes. Uncover and bake for about 30 minutes
|
||||
longer, spooning sauce onto pork occasionally, until done. 4
|
||||
Servings, 410 calories per serving.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
@@ -2643,7 +2589,7 @@ California Beach Recipe" by Joan and Carl Stromquist ISBN:
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>EGGPLANT LASAGNE</title>
|
||||
<title>Eggplant Lasagna</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Vegan</cat>
|
||||
@@ -2829,4 +2775,329 @@ Carbs 36 g.
|
||||
FROM: MADELINE HIMY (NFBH49A)</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Hamburger Steak</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Beef</cat>
|
||||
<cat>Penndutch</cat>
|
||||
</categories>
|
||||
<yield>1<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>Beef</item>
|
||||
<prep>ground</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>onion</item>
|
||||
<prep>minced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>egg</item>
|
||||
<prep>well beaten</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>dash</unit>
|
||||
</amt>
|
||||
<item>pepper</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>bread crumbs</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Mix in order given and shape into round cakes. Fry in butter until
|
||||
nicely browned. Source: Pennsylvania Dutch Cook Book - Fine Old
|
||||
Recipes, Culinary Arts Press, 1936.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Potatoes in a Thick Sauce</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Main dish</cat>
|
||||
<cat>Potatoes</cat>
|
||||
<cat>Indian</cat>
|
||||
<cat>Vegetarian</cat>
|
||||
</categories>
|
||||
<yield>6<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>5</qty>
|
||||
<unit>medium</unit>
|
||||
</amt>
|
||||
<item>potatoes</item>
|
||||
<prep>cubed & cooked</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>slice</unit>
|
||||
</amt>
|
||||
<item>ginger</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>Coriander</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>cumin</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>tomato sauce</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>vegetable oil</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Fennel</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Fenugreek</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Black mustard seeds</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>Whole dried red chilies</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1.5</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>lemon juice</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Garam masala</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Place ginger, coriander, cumin, tomato sauce & 3 tb water in a
|
||||
blender & blend till smooth.
|
||||
|
||||
Break potatoes into bite sized pieces.
|
||||
|
||||
Heat oil (I use ghee) in a large pot. When hot, throw in fennel,
|
||||
fenugreek & mustard seeds. After 20 seconds, add red chilies. As
|
||||
they darken, put in paste from blender. Fry for 5 minutes, stirring
|
||||
frequently. Put in the potato pieces & fry for 3 to 5 minutes. Add 1
|
||||
1/2 c warm water. Bring to a boil. Add salt & lemon juice. Simmer
|
||||
for 20 minutes.
|
||||
|
||||
Before serving, sprinkle with garam masala.
|
||||
|
||||
Madhur Jaffrey, "An Invitation to Indian Cooking.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Tomato-Zucchini Casserole</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Vegetarian</cat>
|
||||
<cat>Casseroles</cat>
|
||||
</categories>
|
||||
<yield>4<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1.5</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>chili powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>parsley flakes</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>garlic powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>onion powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.125</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.125</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>black pepper</item>
|
||||
<prep>ground</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit>cups</unit>
|
||||
</amt>
|
||||
<item>zucchini</item>
|
||||
<prep>thinly sliced,fresh</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>tomatoes</item>
|
||||
<prep>fresh,sliced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>bread crumbs</item>
|
||||
<prep>white,fresh</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>vegetable oil</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>1. Combine chili powder, 1 1/2 teaspooons parsley flakes, garlic and
|
||||
onion powders, salt and pepper in a small bowl.~ 2. Place half the
|
||||
zucchini in a lightly greased 6-cup casserole, or layer with half the
|
||||
tomatoes.~ 3. Sprinkle with half the seasoning mixture.~ 4. Repeat
|
||||
the layers.~ 5. Combine bread crumbs, oil and remaining parsley
|
||||
flakes; sprinkle over vegetables.~ 6. Bake, uncovered, in preheated
|
||||
375'F. oven, until vegetables are tender, about 40 minutes.~</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
</recipeml>
|
||||
@@ -3,202 +3,213 @@
|
||||
<dishes>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<string>Honey cake</string>
|
||||
<string>Hamburger Steak</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<string>Kahlua Cake</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<string>Ice Cream, Lowfat</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<string>Southwest Smoothie</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>2</int>
|
||||
<string>Margarita Sunrise</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<string>Breaded Veal Cutlet ( Weinerschnitzel )</string>
|
||||
<int>3</int>
|
||||
<string>Weinerschnitzel</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>4</int>
|
||||
<string>Blender Double Fudge Cake</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<string>Chinese: Cashew Chicken 1</string>
|
||||
<int>5</int>
|
||||
<string>Cashew Chicken</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<string>Bayou Shrimp Creole</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<string>Crab Burgers</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<string>Broiled Flounder</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>6</int>
|
||||
<string>Coconut Beer Batter Shrimp</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>7</int>
|
||||
<string>Coconut Fish Curry</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>8</int>
|
||||
<string>Catalan Rice</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<string>Tomato-Zucchini Casserole</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<string>Tabasco Classic Seared Steaks</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<string>Honey cake</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<string>Southwest Smoothie</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<string>Bayou Shrimp Creole</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<string>Baked Steak And Lima Beans</string>
|
||||
<string>Crab Burgers</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<string>Tabasco Classic - Perfect Seared Steaks ****</string>
|
||||
<string>Broiled Flounder</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<string>Salisbury Steak with Mushroom Sauce</string>
|
||||
<string>Baked Steak And Lima Beans</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<string>Meatless Loaf</string>
|
||||
<string>Eggplant Lasagna</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<string>Black Bean Soup</string>
|
||||
<string>Salisbury Steak with Mushroom Sauce</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>29</int>
|
||||
<string>Fava Bean Burgers</string>
|
||||
<int>19</int>
|
||||
<string>Meatless Loaf</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<string>Angel Hair Pesto Primavera</string>
|
||||
<string>Lemon Pork Chops</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>21</int>
|
||||
<string>EGGPLANT LASAGNE</string>
|
||||
<string>Fava Bean Burgers</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>22</int>
|
||||
<string>Angel Hair Pesto Primavera</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>23</int>
|
||||
<string>Kahlua Cake</string>
|
||||
</entry>
|
||||
</dishes>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<string>
|
||||
chocolate
|
||||
</string>
|
||||
<string>vegetarian</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<string>
|
||||
nuts
|
||||
</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<string>
|
||||
shellfish
|
||||
</string>
|
||||
<string>allergic-nuts</string>
|
||||
</entry>
|
||||
</categories>
|
||||
<diner>
|
||||
<description>No allergies, prefers all dishes equally (5)</description>
|
||||
<id>0</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>19</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>21</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>22</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>23</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
@@ -207,410 +218,334 @@
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
<diner>
|
||||
<description>Vegetarian, all meat is (1) everything else is (9)</description>
|
||||
<id>1</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>19</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<int>10</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>21</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>22</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>23</int>
|
||||
<int>1</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
<boolean>true</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
<diner>
|
||||
<description>Nut Alleregy, prefers meat (6) to vegetarian (4) to desert (3)</description>
|
||||
<id>2</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<int>10</int>
|
||||
<int>4</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>10</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<int>10</int>
|
||||
<int>4</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>19</int>
|
||||
<int>10</int>
|
||||
<int>4</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<int>10</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>21</int>
|
||||
<int>4</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>22</int>
|
||||
<int>4</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>23</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
<boolean>true</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
<diner>
|
||||
<description>No allergies, only prefers Pork and Desserts(9) everything else is (3)</description>
|
||||
<id>3</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>19</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</diner>
|
||||
<diner>
|
||||
<id>4</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>4</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>5</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>6</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>7</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>8</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>9</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>10</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>11</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>12</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>13</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>14</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>15</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>16</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>17</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>18</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>19</int>
|
||||
<int>10</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>20</int>
|
||||
<int>10</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>21</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>22</int>
|
||||
<int>3</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>23</int>
|
||||
<int>9</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
@@ -619,10 +554,6 @@
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
</survey>
|
||||
521
data/medium_recipebook.xml
Normal file
521
data/medium_recipebook.xml
Normal file
@@ -0,0 +1,521 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE recipeml PUBLIC "-//FormatData//DTD RecipeML 0.5//EN" "http://www.formatdata.com/recipeml/recipeml.dtd"><recipeml version="0.5" generator="Krecipes v2.0-beta1">
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Catalan Rice</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Fish</cat>
|
||||
<cat>Casserole</cat>
|
||||
<cat>Main dish</cat>
|
||||
<cat>Pork</cat>
|
||||
<cat>Clams</cat>
|
||||
</categories>
|
||||
<yield>6<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2.5</qty>
|
||||
<unit>cups</unit>
|
||||
</amt>
|
||||
<item>Fish stock</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Saffron Threads</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Dry white wine</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>Lard</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>Chorizo</item>
|
||||
<prep>Sliced 1/4"</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1.5</qty>
|
||||
<unit>pounds</unit>
|
||||
</amt>
|
||||
<item>Pork Loin</item>
|
||||
<prep>1" Cubes</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>onion</item>
|
||||
<prep>thinly sliced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>Bell peppers</item>
|
||||
<prep>julienned</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>tomatoes</item>
|
||||
<prep>peeled,seeded</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>Large Squid</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2</qty>
|
||||
<unit>cups</unit>
|
||||
</amt>
|
||||
<item>Long-Grained Rice</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.75</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Blanched almonds</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.333333</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Pine Nuts</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>garlic cloves</item>
|
||||
<prep>minced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Artichoke hearts</item>
|
||||
<prep>drained</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>18</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>Clams Or Mussels</item>
|
||||
<prep>scrubbed</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Peas</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>Pimientos</item>
|
||||
<prep>julienned</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>2</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>Fresh parsley</item>
|
||||
<prep>minced</prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Clean squid and cut body sacs into rings. Cut tentacles in half. In
|
||||
a small saucepan, bring stock to a bare simmer. Crush saffron and
|
||||
combine it with wine in a small bowl. In a flameproof casserole or
|
||||
paella pan, heat the lard over moderately high heat. Saute the
|
||||
chorizo and pork, turning them until they are browned. Add the
|
||||
onion, bell peppers, tomatoes, and squid and cook the mixture over
|
||||
moderate heat, stirring, for 15 minutes. Stir in the rice and cook
|
||||
for 1 minute, stirring. Stir in almonds, pine nuts, garlic, saffron
|
||||
mixture, and artichoke hearts. Ladle in enough stock to just cover
|
||||
the rice mixture. Bring to a boil and simmer it, covered, for 20
|
||||
minutes. Arrange the clams in the rice, add the peas, and simmer for
|
||||
10-15 minutes, or until the rice is just tender and the clams open.
|
||||
Discard any clams that do not open. Garnish with pimientos and
|
||||
parsley. This is a recipe by Elizabeth David, appearing in an article
|
||||
in 1972 by James Beard. It originated on Spain's Costa Brava. "not a
|
||||
true paella, but it is quite good." A 1972 Gourmet Magazine Favorite.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Hamburger Steak</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Beef</cat>
|
||||
<cat>Penndutch</cat>
|
||||
</categories>
|
||||
<yield>1<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>Beef</item>
|
||||
<prep>ground</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>onion</item>
|
||||
<prep>minced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>egg</item>
|
||||
<prep>well beaten</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>dash</unit>
|
||||
</amt>
|
||||
<item>pepper</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>bread crumbs</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Mix in order given and shape into round cakes. Fry in butter until
|
||||
nicely browned. Source: Pennsylvania Dutch Cook Book - Fine Old
|
||||
Recipes, Culinary Arts Press, 1936.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Potatoes in a Thick Sauce</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Main dish</cat>
|
||||
<cat>Potatoes</cat>
|
||||
<cat>Indian</cat>
|
||||
<cat>Vegetarian</cat>
|
||||
</categories>
|
||||
<yield>6<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>5</qty>
|
||||
<unit>medium</unit>
|
||||
</amt>
|
||||
<item>potatoes</item>
|
||||
<prep>cubed & cooked</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>slice</unit>
|
||||
</amt>
|
||||
<item>ginger</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>Coriander</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>cumin</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>tomato sauce</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>6</qty>
|
||||
<unit>tablespoons</unit>
|
||||
</amt>
|
||||
<item>vegetable oil</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Fennel</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Fenugreek</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Black mustard seeds</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit></unit>
|
||||
</amt>
|
||||
<item>Whole dried red chilies</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1.5</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>lemon juice</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>Garam masala</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>Place ginger, coriander, cumin, tomato sauce & 3 tb water in a
|
||||
blender & blend till smooth.
|
||||
|
||||
Break potatoes into bite sized pieces.
|
||||
|
||||
Heat oil (I use ghee) in a large pot. When hot, throw in fennel,
|
||||
fenugreek & mustard seeds. After 20 seconds, add red chilies. As
|
||||
they darken, put in paste from blender. Fry for 5 minutes, stirring
|
||||
frequently. Put in the potato pieces & fry for 3 to 5 minutes. Add 1
|
||||
1/2 c warm water. Bring to a boil. Add salt & lemon juice. Simmer
|
||||
for 20 minutes.
|
||||
|
||||
Before serving, sprinkle with garam masala.
|
||||
|
||||
Madhur Jaffrey, "An Invitation to Indian Cooking.</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
<recipe>
|
||||
<head>
|
||||
<title>Tomato-Zucchini Casserole</title>
|
||||
<source/>
|
||||
<categories>
|
||||
<cat>Vegetarian</cat>
|
||||
<cat>Casseroles</cat>
|
||||
</categories>
|
||||
<yield>4<unit>servings</unit>
|
||||
</yield>
|
||||
<preptime type="Total">
|
||||
<time>
|
||||
<qty>0</qty>
|
||||
<timeunit>minutes</timeunit>
|
||||
</time>
|
||||
</preptime>
|
||||
</head>
|
||||
<ingredients>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1.5</qty>
|
||||
<unit>teaspoons</unit>
|
||||
</amt>
|
||||
<item>chili powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>parsley flakes</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>garlic powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.5</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>onion powder</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.125</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>salt</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.125</qty>
|
||||
<unit>teaspoon</unit>
|
||||
</amt>
|
||||
<item>black pepper</item>
|
||||
<prep>ground</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>3</qty>
|
||||
<unit>cups</unit>
|
||||
</amt>
|
||||
<item>zucchini</item>
|
||||
<prep>thinly sliced,fresh</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>pound</unit>
|
||||
</amt>
|
||||
<item>tomatoes</item>
|
||||
<prep>fresh,sliced</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>0.25</qty>
|
||||
<unit>cup</unit>
|
||||
</amt>
|
||||
<item>bread crumbs</item>
|
||||
<prep>white,fresh</prep>
|
||||
</ing>
|
||||
<ing>
|
||||
<amt>
|
||||
<qty>1</qty>
|
||||
<unit>tablespoon</unit>
|
||||
</amt>
|
||||
<item>vegetable oil</item>
|
||||
<prep></prep>
|
||||
</ing>
|
||||
</ingredients>
|
||||
<directions>
|
||||
<step>1. Combine chili powder, 1 1/2 teaspooons parsley flakes, garlic and
|
||||
onion powders, salt and pepper in a small bowl.~ 2. Place half the
|
||||
zucchini in a lightly greased 6-cup casserole, or layer with half the
|
||||
tomatoes.~ 3. Sprinkle with half the seasoning mixture.~ 4. Repeat
|
||||
the layers.~ 5. Combine bread crumbs, oil and remaining parsley
|
||||
flakes; sprinkle over vegetables.~ 6. Bake, uncovered, in preheated
|
||||
375'F. oven, until vegetables are tender, about 40 minutes.~</step>
|
||||
</directions>
|
||||
</recipe>
|
||||
</recipeml>
|
||||
81
data/medium_survey.xml
Normal file
81
data/medium_survey.xml
Normal file
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<survey>
|
||||
<dishes>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<string>Catalan Rice</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<string>Hamburger Steak</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<string>Potatoes in a Thick Sauce</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<string>Tomato-Zucchini Casserole</string>
|
||||
</entry>
|
||||
</dishes>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<string>vegan</string>
|
||||
</entry>
|
||||
</categories>
|
||||
<diner>
|
||||
<id>0</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>10</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>2</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</categories>
|
||||
</diner>
|
||||
<diner>
|
||||
<id>1</id>
|
||||
<ratings>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<int>0</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<int>0</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<int>5</int>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>3</int>
|
||||
<int>6</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>true</boolean>
|
||||
</entry>
|
||||
</categories>
|
||||
</diner>
|
||||
</survey>
|
||||
@@ -21,19 +21,7 @@
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<string>
|
||||
chocolate
|
||||
</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<string>
|
||||
nuts
|
||||
</string>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<string>shellfish</string>
|
||||
<string>vegan</string>
|
||||
</entry>
|
||||
</categories>
|
||||
<diner>
|
||||
@@ -56,20 +44,12 @@
|
||||
<int>5</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
<diner>
|
||||
<id>1</id>
|
||||
@@ -91,19 +71,11 @@
|
||||
<int>5</int>
|
||||
</entry>
|
||||
</ratings>
|
||||
<allergies>
|
||||
<categories>
|
||||
<entry>
|
||||
<int>0</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>1</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
<entry>
|
||||
<int>2</int>
|
||||
<boolean>false</boolean>
|
||||
</entry>
|
||||
</allergies>
|
||||
</categories>
|
||||
</diner>
|
||||
</survey>
|
||||
@@ -23,13 +23,18 @@ import dkohl.onthology.Ontology;
|
||||
|
||||
public class FoodNetBuilder {
|
||||
public static final String TASTE = "Taste";
|
||||
public static final String SOMEONE_VEGETARIAN = "Vegetarian";
|
||||
|
||||
public static final String SOMEONE_VEGETARIAN = "vegetarian";
|
||||
public static final String SOMEONE_ALLERGIC_NUTS = "allergic-nuts";
|
||||
|
||||
public static final String CONTAINS_MEAT = "Meat";
|
||||
public static final String CONTAINS_VEGETABLE = "Vegetable";
|
||||
public static final String CONTAINS_BEEF = TYPE.BEEF.toString();
|
||||
public static final String CONTAINS_PORK = TYPE.PORK.toString();
|
||||
public static final String CONTAINS_TOMATOS = TYPE.TOMATO.toString();
|
||||
public static final String CONTAINS_POTATOS = TYPE.POTATO.toString();
|
||||
public static final String CONTAINS_NUTS = "Nuts";
|
||||
public static final String CONTAINS_GENERIC_NUTS = TYPE.GENERIC_NUTS.toString();
|
||||
|
||||
public static final String TRUE_VALUE = "true";
|
||||
public static final String FALSE_VALUE = "false";
|
||||
@@ -39,27 +44,30 @@ public class FoodNetBuilder {
|
||||
public static final String RATING_DOMAIN[] = { "1", "2", "3", "4", "5",
|
||||
"6", "7", "8", "9", "10" };
|
||||
|
||||
private static final String[] VARIABLES = { SOMEONE_VEGETARIAN,
|
||||
private static final String[] VARIABLES = { SOMEONE_VEGETARIAN, SOMEONE_ALLERGIC_NUTS,
|
||||
CONTAINS_BEEF, CONTAINS_MEAT, CONTAINS_PORK, CONTAINS_POTATOS,
|
||||
CONTAINS_TOMATOS, CONTAINS_VEGETABLE, TASTE };
|
||||
CONTAINS_TOMATOS, CONTAINS_VEGETABLE, CONTAINS_NUTS, CONTAINS_GENERIC_NUTS, TASTE };
|
||||
|
||||
private static final String[] OBSERVED = { CONTAINS_BEEF, CONTAINS_PORK,
|
||||
CONTAINS_POTATOS, CONTAINS_TOMATOS, };
|
||||
CONTAINS_POTATOS, CONTAINS_TOMATOS, CONTAINS_GENERIC_NUTS};
|
||||
|
||||
public static Ontology createOntology() {
|
||||
HashSet<String> classes = new HashSet<String>();
|
||||
|
||||
classes.add(CONTAINS_MEAT);
|
||||
classes.add(CONTAINS_NUTS);
|
||||
classes.add(CONTAINS_VEGETABLE);
|
||||
|
||||
Ontology onthology = new Ontology(classes);
|
||||
Ontology ontology = new Ontology(classes);
|
||||
|
||||
onthology.define(CONTAINS_PORK, CONTAINS_MEAT);
|
||||
onthology.define(CONTAINS_BEEF, CONTAINS_MEAT);
|
||||
ontology.define(CONTAINS_PORK, CONTAINS_MEAT);
|
||||
ontology.define(CONTAINS_BEEF, CONTAINS_MEAT);
|
||||
|
||||
onthology.define(CONTAINS_TOMATOS, CONTAINS_VEGETABLE);
|
||||
onthology.define(CONTAINS_POTATOS, CONTAINS_VEGETABLE);
|
||||
return onthology;
|
||||
ontology.define(CONTAINS_GENERIC_NUTS, CONTAINS_NUTS);
|
||||
|
||||
ontology.define(CONTAINS_TOMATOS, CONTAINS_VEGETABLE);
|
||||
ontology.define(CONTAINS_POTATOS, CONTAINS_VEGETABLE);
|
||||
return ontology;
|
||||
}
|
||||
|
||||
private static Assignment build(String varible, String value) {
|
||||
@@ -86,14 +94,13 @@ public class FoodNetBuilder {
|
||||
return normPoint;
|
||||
}
|
||||
|
||||
public static DataSet getSurveyDataSet(Survey survey, RecipeBook recipeBook) {
|
||||
public static DataSet getSurveyDataSet(Survey survey, RecipeBook recipeBook, int startIndex, int endIndex) {
|
||||
DataSet data = FoodExampleBuilder.examples();
|
||||
Ontology onto = createOntology();
|
||||
|
||||
int nDishes = survey.getDishCount();
|
||||
for (int dinerIndex = 0; dinerIndex < survey.getDinerCount(); dinerIndex++) {
|
||||
Diner diner = survey.getDiner(dinerIndex);
|
||||
for (int dishIndex = 0; dishIndex < nDishes; dishIndex++) {
|
||||
for (int dishIndex = startIndex; dishIndex < endIndex; dishIndex++) {
|
||||
data.add(normalize(createDataPoint(recipeBook, survey.getDish(dishIndex), diner.getRating(dishIndex)),onto));
|
||||
}
|
||||
}
|
||||
@@ -118,17 +125,38 @@ public class FoodNetBuilder {
|
||||
if (ingredients.contains(TYPE.TOMATO)) {
|
||||
point.add(build(CONTAINS_TOMATOS, TRUE_VALUE));
|
||||
}
|
||||
if (ingredients.contains(TYPE.GENERIC_NUTS)) {
|
||||
point.add(build(CONTAINS_GENERIC_NUTS, TRUE_VALUE));
|
||||
}
|
||||
|
||||
point.add(build(TASTE, "" + weight));
|
||||
|
||||
return point;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution vegi() {
|
||||
public static ProbabilityDistribution vegi(Survey survey) {
|
||||
String names[] = { SOMEONE_VEGETARIAN };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
if (survey.isDiner("vegetarian")) {
|
||||
table.setProbabilityForAssignment("true;", new Probability(1));
|
||||
table.setProbabilityForAssignment("false;", new Probability(0));
|
||||
} else {
|
||||
table.setProbabilityForAssignment("true;", new Probability(0));
|
||||
table.setProbabilityForAssignment("false;", new Probability(1));
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution allergicNuts(Survey survey) {
|
||||
String names[] = { SOMEONE_ALLERGIC_NUTS };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
if (survey.isDiner("allergic-nuts")) {
|
||||
table.setProbabilityForAssignment("true;", new Probability(1));
|
||||
table.setProbabilityForAssignment("false;", new Probability(0));
|
||||
} else {
|
||||
table.setProbabilityForAssignment("true;", new Probability(0));
|
||||
table.setProbabilityForAssignment("false;", new Probability(1));
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
@@ -144,12 +172,24 @@ public class FoodNetBuilder {
|
||||
return table;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution meet() {
|
||||
public static ProbabilityDistribution meat() {
|
||||
String names[] = { SOMEONE_VEGETARIAN, CONTAINS_MEAT };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
return table;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution genericNuts() {
|
||||
String names[] = { CONTAINS_NUTS, CONTAINS_GENERIC_NUTS };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
return table;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution nuts() {
|
||||
String names[] = { SOMEONE_ALLERGIC_NUTS, CONTAINS_NUTS };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
return table;
|
||||
}
|
||||
|
||||
public static ProbabilityDistribution tomatos() {
|
||||
String names[] = { CONTAINS_VEGETABLE, CONTAINS_TOMATOS };
|
||||
ProbabilityTable table = new ProbabilityTable(names);
|
||||
@@ -170,27 +210,34 @@ public class FoodNetBuilder {
|
||||
|
||||
public static ProbabilityDistribution taste() {
|
||||
String names[] = { TASTE, CONTAINS_BEEF, CONTAINS_PORK,
|
||||
CONTAINS_POTATOS, CONTAINS_TOMATOS };
|
||||
CONTAINS_POTATOS, CONTAINS_TOMATOS, CONTAINS_GENERIC_NUTS };
|
||||
ContinousDistribution distribution = new ContinousDistribution(names, 0);
|
||||
return distribution;
|
||||
}
|
||||
|
||||
public static BayesNet createDishNet(Survey survey, RecipeBook recipeBook) {
|
||||
public static BayesNet createDishNet(Survey survey, RecipeBook recipeBook, int startIndex, int endIndex) {
|
||||
BayesNet net = new BayesNet(VARIABLES);
|
||||
|
||||
net.setDistribution(new Variable(SOMEONE_VEGETARIAN, DOMAIN), vegi());
|
||||
net.setDistribution(new Variable(CONTAINS_MEAT, DOMAIN), meet());
|
||||
net.setDistribution(new Variable(SOMEONE_VEGETARIAN, DOMAIN), vegi(survey));
|
||||
net.setDistribution(new Variable(SOMEONE_ALLERGIC_NUTS, DOMAIN), allergicNuts(survey));
|
||||
|
||||
net.setDistribution(new Variable(CONTAINS_MEAT, DOMAIN), meat());
|
||||
net.setDistribution(new Variable(CONTAINS_NUTS, DOMAIN), nuts());
|
||||
|
||||
net.setDistribution(new Variable(CONTAINS_VEGETABLE, DOMAIN),
|
||||
vegetables());
|
||||
net.setDistribution(new Variable(CONTAINS_BEEF, DOMAIN), beef());
|
||||
net.setDistribution(new Variable(CONTAINS_PORK, DOMAIN), pork());
|
||||
net.setDistribution(new Variable(CONTAINS_POTATOS, DOMAIN), potatos());
|
||||
net.setDistribution(new Variable(CONTAINS_TOMATOS, DOMAIN), tomatos());
|
||||
net.setDistribution(new Variable(CONTAINS_GENERIC_NUTS, DOMAIN), genericNuts());
|
||||
|
||||
net.setDistribution(new Variable(TASTE, RATING_DOMAIN), taste());
|
||||
|
||||
Ontology ontology = createOntology();
|
||||
for (String category : ontology.getClasses()) {
|
||||
net.connect(category, SOMEONE_VEGETARIAN);
|
||||
net.connect(category, SOMEONE_ALLERGIC_NUTS);
|
||||
}
|
||||
|
||||
for (String thing : OBSERVED) {
|
||||
@@ -198,7 +245,7 @@ public class FoodNetBuilder {
|
||||
net.connect(TASTE, thing);
|
||||
}
|
||||
|
||||
DataSet dataSet = getSurveyDataSet(survey, recipeBook);
|
||||
DataSet dataSet = getSurveyDataSet(survey, recipeBook, startIndex, endIndex);
|
||||
|
||||
for (String category : ontology.getClasses()) {
|
||||
MaximumLikelihoodEstimation.estimate(dataSet, net, category);
|
||||
|
||||
@@ -19,17 +19,12 @@ public class RootMeanSquareError {
|
||||
|
||||
public double error() {
|
||||
double mean = 0.0;
|
||||
for(Double val : groundTruth) {
|
||||
mean += val;
|
||||
for (int i = 0; i < expected.size(); i++){
|
||||
mean += Math.pow(expected.get(i) - groundTruth.get(i), 2);
|
||||
}
|
||||
mean /= groundTruth.size();
|
||||
|
||||
double err = 0.0;
|
||||
for(Double val : expected) {
|
||||
err += Math.pow(mean - val, 2);
|
||||
}
|
||||
return Math.sqrt(err);
|
||||
return Math.sqrt(mean);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -6,24 +6,22 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.woodyfolsom.cs6601.p2.Ingredient.TYPE;
|
||||
|
||||
import org.apache.commons.math3.stat.regression.SimpleRegression;
|
||||
|
||||
import dkohl.bayes.bayesnet.BayesNet;
|
||||
import dkohl.bayes.builders.FoodNetBuilder;
|
||||
import dkohl.bayes.inference.EnumerateAll;
|
||||
import dkohl.bayes.probability.Assignment;
|
||||
import dkohl.bayes.probability.ProbabilityAssignment;
|
||||
import dkohl.bayes.probability.Variable;
|
||||
import dkohl.util.RootMeanSquareError;
|
||||
|
||||
public class BayesChef {
|
||||
|
||||
public static void main(String... args) {
|
||||
System.out.println("Reading recipe book.");
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/short_recipebook.xml"));
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/long_recipebook.xml"));
|
||||
|
||||
System.out.println("Reading survey data.");
|
||||
Survey survey = SurveyReader.readSurvey(new File("data/short_survey.xml"));
|
||||
Survey survey = SurveyReader.readSurvey(new File("data/long_survey.xml"));
|
||||
|
||||
new BayesChef().reportBestMeal(recipeBook,survey);
|
||||
}
|
||||
@@ -36,29 +34,39 @@ public class BayesChef {
|
||||
System.out.println("Read data for " + numDiners + " diner(s).");
|
||||
|
||||
System.out.println("Creating Bayes net for survey dataset...");
|
||||
BayesNet net = FoodNetBuilder.createDishNet(survey, recipeBook);
|
||||
|
||||
System.out.println("Querying Bayes net for individual flavor preferences: ");
|
||||
double[][] flavorPrefs = new double[4][];
|
||||
int numSurveyDishes = survey.getDishCount();
|
||||
int bayesNetIndexStart = 0;
|
||||
int bayesNetIndexEnd = numSurveyDishes / 2;
|
||||
|
||||
flavorPrefs[0] = new double[] {0.0,printPreference(net, TYPE.PORK)};
|
||||
flavorPrefs[1] = new double[] {1.0,printPreference(net, TYPE.BEEF)};
|
||||
flavorPrefs[2] = new double[] {2.0,printPreference(net, TYPE.POTATO)};
|
||||
flavorPrefs[3] = new double[] {3.0,printPreference(net, TYPE.TOMATO)};
|
||||
int comparisonIndexStart = bayesNetIndexEnd;
|
||||
int comparisonIndexEnd = numSurveyDishes;
|
||||
|
||||
SimpleRegression simpleRegression = new SimpleRegression();
|
||||
simpleRegression.addData(flavorPrefs);
|
||||
//TODO change this to include min/max recipe indices for building the net
|
||||
BayesNet net = FoodNetBuilder.createDishNet(survey, recipeBook, bayesNetIndexStart, bayesNetIndexEnd);
|
||||
|
||||
System.out.println("Individual flavor pref MSE: " + Math.sqrt(simpleRegression.getMeanSquareError()));
|
||||
simpleRegression.clear();
|
||||
System.out.println("Querying Bayes net for predicted flavor preferences: ");
|
||||
//TODO change this to query actual flavor combos from latter half of survey
|
||||
double[] predictedRating = new double[numSurveyDishes - bayesNetIndexEnd];
|
||||
|
||||
System.out.println("Querying Bayes net for recipe flavor preferences: ");
|
||||
flavorPrefs = new double[recipeBook.getSize()][];
|
||||
|
||||
for (int i = 0; i < recipeBook.getSize(); i++) {
|
||||
simpleRegression.addData(i, printPreference(net, recipeBook.getRecipe(i)));
|
||||
for (int i = comparisonIndexStart; i < comparisonIndexEnd; i++) {
|
||||
predictedRating[i - comparisonIndexStart] = printPreference(net, recipeBook.getRecipe(survey.getDish(i)));
|
||||
}
|
||||
System.out.println("Recipe flavor pref MSE: " + Math.sqrt(simpleRegression.getMeanSquareError()));
|
||||
|
||||
System.out.println("Querying survey dataset for actual recipe flavor preferences: ");
|
||||
double[] actualRating = new double[predictedRating.length];
|
||||
|
||||
for (int i = comparisonIndexStart; i < comparisonIndexEnd; i++) {
|
||||
actualRating[i - comparisonIndexStart] = survey.getAverageRating(i);
|
||||
System.out.println("Actual average rating for " + survey.getDish(i) + ": " + actualRating[i - comparisonIndexStart]);
|
||||
}
|
||||
|
||||
RootMeanSquareError rmse = new RootMeanSquareError();
|
||||
for (int i = 0; i < actualRating.length; i++) {
|
||||
rmse.push(predictedRating[i], actualRating[i]);
|
||||
}
|
||||
|
||||
System.out.println("Root Mean Squared Error (predicted vs. actual): " + rmse.error());
|
||||
}
|
||||
|
||||
int printPreference(BayesNet net, Recipe recipe) {
|
||||
@@ -69,7 +77,7 @@ public class BayesChef {
|
||||
net, createQuery(ingredientTypes.toArray(new TYPE[ingredientTypes.size()])));
|
||||
|
||||
double max_val = 0.0;
|
||||
String max_arg = "N/A";
|
||||
String max_arg = "0";
|
||||
for (ProbabilityAssignment p : probs) {
|
||||
if (p.getProbability() > max_val) {
|
||||
max_val = p.getProbability();
|
||||
@@ -106,6 +114,7 @@ public class BayesChef {
|
||||
case BEEF:
|
||||
case POTATO:
|
||||
case TOMATO:
|
||||
case GENERIC_NUTS:
|
||||
assignment.add(new Assignment(new Variable(type.toString(), FoodNetBuilder.DOMAIN),
|
||||
FoodNetBuilder.TRUE_VALUE));
|
||||
break;
|
||||
|
||||
@@ -9,7 +9,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
public class Diner {
|
||||
private int id;
|
||||
private Map<Integer,Integer> ratings = new HashMap<Integer,Integer>();
|
||||
private Map<Integer,Boolean> allergies = new HashMap<Integer,Boolean>();
|
||||
private Map<Integer,Boolean> categories = new HashMap<Integer,Boolean>();
|
||||
private String description;
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
@@ -19,7 +24,7 @@ public class Diner {
|
||||
return ratings.get(dishId);
|
||||
}
|
||||
|
||||
public boolean isAllergic(int categoryId) {
|
||||
return allergies.get(categoryId);
|
||||
public boolean isCategory(int categoryId) {
|
||||
return categories.get(categoryId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
package net.woodyfolsom.cs6601.p2;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
@XStreamAlias("ing")
|
||||
public class Ingredient {
|
||||
public enum TYPE { ALCOHOL, BEEF, DAIRY, EGGS, FISH, GLUTEN, GRAIN, NUTS, PORK, POULTRY, POTATO, SHELLFISH, SPICE, SUGAR, TOMATO}
|
||||
public enum TYPE { ALCOHOL, BEEF, DAIRY, EGGS, FISH, GENERIC_NUTS, GLUTEN, GRAIN, PORK, POULTRY, POTATO, SHELLFISH, SPICE, SUGAR, TOMATO}
|
||||
|
||||
private String item;
|
||||
|
||||
@@ -30,11 +28,15 @@ public class Ingredient {
|
||||
public boolean isType(TYPE type) {
|
||||
switch (type) {
|
||||
case BEEF :
|
||||
return item.contains("beef");
|
||||
//For our purposes, veal is just expensive beef
|
||||
return item.contains("beef") || item.contains("veal");
|
||||
case DAIRY :
|
||||
return item.contains("margarine");
|
||||
return item.contains("margarine") || item.contains("milk");
|
||||
case EGGS :
|
||||
return item.equals("egg") || item.equals("eggs");
|
||||
case GENERIC_NUTS :
|
||||
//cashews, peanuts or generic nuts
|
||||
return item.contains("cashew") || item.contains("peanut") || item.contains("nuts");
|
||||
case GLUTEN :
|
||||
return item.contains("flour");
|
||||
case PORK :
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
import com.thoughtworks.xstream.annotations.XStreamImplicit;
|
||||
@@ -16,6 +17,32 @@ public class Survey {
|
||||
@XStreamImplicit(itemFieldName="diner")
|
||||
private List<Diner> diners = new ArrayList<Diner>();
|
||||
|
||||
public double getAverageRating(int recipeIndex) {
|
||||
double total = 0.0;
|
||||
for (Diner diner : diners) {
|
||||
total += diner.getRating(recipeIndex);
|
||||
}
|
||||
return total/diners.size();
|
||||
}
|
||||
|
||||
public boolean isDiner(String category) {
|
||||
for (int i = 0; i < diners.size(); i++) {
|
||||
if (isCategory(i,category)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isCategory(int dinerIndex, String category) {
|
||||
for (Entry<Integer,String> entry : categories.entrySet()) {
|
||||
if (entry.getValue().equals(category)) {
|
||||
return diners.get(dinerIndex).isCategory(entry.getKey());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Diner getDiner(int dinerIndex) {
|
||||
return diners.get(dinerIndex);
|
||||
}
|
||||
|
||||
@@ -18,13 +18,12 @@ import org.junit.Test;
|
||||
public class RecipeBookReaderTest {
|
||||
|
||||
@Test
|
||||
public void testReadSurveyDataset() {
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/survey_recipes.xml"));
|
||||
public void testReadLongRecipeBook() {
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/long_recipebook.xml"));
|
||||
assertNotNull(recipeBook);
|
||||
assertThat(recipeBook.getSize(), is(equalTo(22)));
|
||||
assertThat(recipeBook.getSize(), is(equalTo(25)));
|
||||
|
||||
Recipe recipe = recipeBook.getRecipe(0);
|
||||
System.out.println(recipe.getHead().getTitle());
|
||||
assertThat(recipe.getHead().getTitle(), is(equalTo("Honey cake")));
|
||||
assertTrue(recipe.getIngredients().contains(TYPE.EGGS));
|
||||
assertTrue(recipe.getIngredients().contains(TYPE.GLUTEN));
|
||||
@@ -39,7 +38,28 @@ public class RecipeBookReaderTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadShortSurveyDataset() {
|
||||
public void testReadMediumRecipeBook() {
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/medium_recipebook.xml"));
|
||||
assertNotNull(recipeBook);
|
||||
assertThat(recipeBook.getSize(), is(equalTo(4)));
|
||||
|
||||
Recipe recipe = recipeBook.getRecipe(0);
|
||||
System.out.println(recipe.getHead().getTitle());
|
||||
assertThat(recipe.getHead().getTitle(), is(equalTo("Catalan Rice")));
|
||||
assertFalse(recipe.getIngredients().contains(TYPE.EGGS));
|
||||
assertFalse(recipe.getIngredients().contains(TYPE.GLUTEN));
|
||||
assertTrue(recipe.getIngredients().contains(TYPE.SPICE));
|
||||
assertFalse(recipe.getIngredients().contains(TYPE.BEEF));
|
||||
assertFalse(recipe.getIngredients().contains(TYPE.POULTRY));
|
||||
assertFalse(recipe.getIngredients().contains(TYPE.SHELLFISH));
|
||||
|
||||
for (int rIndex = 0; rIndex < recipeBook.getSize(); rIndex++) {
|
||||
System.out.println(recipeBook.getRecipe(rIndex).getHead().getTitle());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadShortRecipeBook() {
|
||||
RecipeBook recipeBook = RecipeBookReader.readRecipeBook(new File("data/short_recipebook.xml"));
|
||||
assertNotNull(recipeBook);
|
||||
assertThat(recipeBook.getSize(), is(equalTo(4)));
|
||||
|
||||
@@ -12,13 +12,49 @@ import org.junit.Test;
|
||||
public class SurveyReaderTest {
|
||||
|
||||
@Test
|
||||
public void testReadSurveyDataset() {
|
||||
Survey survey = SurveyReader.readSurvey(new File("data/survey.xml"));
|
||||
public void testReadLongSurveyDataset() {
|
||||
Survey survey = SurveyReader.readSurvey(new File("data/long_survey.xml"));
|
||||
assertNotNull(survey);
|
||||
|
||||
assertThat(survey.getDinerCount(), equalTo(5));
|
||||
assertThat(survey.getDishCount(), equalTo(24));
|
||||
assertThat(survey.getDinerCount(), equalTo(4));
|
||||
|
||||
assertThat(survey.isCategory(0,"vegetarian"), is(false));
|
||||
assertThat(survey.isCategory(0,"allergic-nuts"), is(false));
|
||||
|
||||
assertThat(survey.isCategory(1,"vegetarian"), is(true));
|
||||
assertThat(survey.isCategory(1,"allergic-nuts"), is(false));
|
||||
|
||||
assertThat(survey.isCategory(2,"vegan"), is(false));
|
||||
assertThat(survey.isCategory(2,"allergic-nuts"), is(true));
|
||||
|
||||
assertThat(survey.isCategory(3,"vegan"), is(false));
|
||||
assertThat(survey.isCategory(3,"allergic-nuts"), is(false));
|
||||
|
||||
assertThat(survey.isDiner("vegetarian"), is(true));
|
||||
assertThat(survey.isDiner("allergic-nuts"), is(true));
|
||||
assertThat(survey.isDiner("rastafarian"), is(false));
|
||||
|
||||
for (int i=0;i<survey.getDinerCount();i++) {
|
||||
Diner diner = survey.getDiner(i);
|
||||
System.out.println("\n");
|
||||
System.out.println("Diner " + i + " (" + diner.getDescription() + ")");
|
||||
for (int j=0;j<survey.getDishCount();j++) {
|
||||
System.out.println(j +") " +survey.getDish(j) + ": " + diner.getRating(j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadMediumSurveyDataset() {
|
||||
Survey survey = SurveyReader.readSurvey(new File("data/medium_survey.xml"));
|
||||
assertNotNull(survey);
|
||||
|
||||
assertThat(survey.getDinerCount(), equalTo(2));
|
||||
|
||||
Diner diner = survey.getDiner(0);
|
||||
assertThat(diner.isAllergic(0), is(false));
|
||||
assertThat(diner.isCategory(0), is(false));
|
||||
diner = survey.getDiner(1);
|
||||
assertThat(diner.isCategory(0), is(true));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user