To Mispell Is Only Human
Since launch, I’ve been logging natural language ingredient queries within the KitchenPC UI. There are two places where the NLP engine is exposed; the search by ingredient mechanism, which allows users to include or exclude specific ingredients in their searches, and the What Can I Make? feature, which allows users to enter an ingredient with an optional amount.
During development, my initial design was to simply ignore anything I didn’t understand. I would silently log it so I could improve the NLP vocabulary later, but I didn’t want to bother the user with silly errors messages. Unfortunately, this totally bombed during usability testing. Users typed in all sorts of randomness, and then couldn’t complete the tasks as they weren’t sure if the feature was working or not. Ultimately, I decided to popup a message when I encountered something I didn’t understand, with a link to a video showing the user how to properly use the feature (those videos are quite popular, by the way!)
After a few weeks of use, I’d like to share the list of failed NLP queries with you, which will hopefully shed some light on the way users interact with the site. This shows how incredibly difficult it is to teach computers to understand user intentions based on human language. If nothing else, you’ll probably chuckle over a few of the queries.
beans garbonzo beans chick peas 1 pound of chicken 1 pd of chicken capsicum capsicum cucmber brussel sprouts brussel sprout brussel sprout palak obergine Pasta noodles roast beef beef cooked pork cooked pork left over pork left over cooked pork left over cooked pork cooked pork boiled green beans small beans moong pulled pork pasta a pound of pasta lake trout lake trout wheatberries annisette grilled pork tenderloin pork tenderloin cooked water chestnuts Tuna fish Canned tuna 2 heads of celery dairy brussel sprouts broccoli, pasta, olive oil pasta pasta noodles Mozarella Bred Beef Grou d beef beef meat beef red meat pile of lettuce 16 ounce can of kidney beans 14.5 ounces reduced sodium chicken stock asparagas asparagas linseed oil Linseed oil meat loaf noodles chicken, lentils pureed jalapenos "jethro tull" and "new haven" AND collection:etree mac nuts butter eggs flour hamburger eggs flour eggs flour butter hamburger meyer lemon meyer lemon meyer lemon greek salad beans garbenzo beans garbenzo beans chick peas melbourne cricket ground brioche brioche brioche noodles noodles noodles noodles sun dries tomatoes pasta sun dried tomatos makarel tomatos tomatos Canned tomatoe wheal chocolote chocolate chocolate chocolate chocolate pasta pasta full milk fruit fruit flouer bakeing soda bakeing soda peppers peppers chiles cooked rice cooked rice cooked rice cooked rice cooked rice CARAMEL CARMEL CHOCOLATE 8 OZ COOKED CHICKEN COOKED CHICKEN COOKED HAM Bambi rice chile pepper cheese Bamba rice cannelini beans Risotto French radish meatloaf chicken fingers meatloaf meatloaf meatloaf meat loaf meatloaf squash meatloaf cherry cherri3es jello, marshmallows, fruit cocktail c fruit cocktail, marshmallows soja beef beef Tao sauce General tao mayonaise pound of ground beef Red curly kale tomatos brats brats brats bratwarts portabello malt malt crackers monosodium agave molassas Potatoe potaoes wasabi wasabi gluten free peacon maladextren chocolate aged cheese chedder honey chicken honey grilled chicken pasta noodles a bag of noodles a bag of rice ground turken meat avacodo avacodo top round steak top round steak top round round rump roast sirloin tip roast potatos calliflour califlour culiflour pasta Mozarella Mozarela grilled chicken cornstart corn surup fresh spinanch aparagus fetta cheese fetta glurten corn starcfh fetta chicken corn potatoes black beans cooked chicken cooked chicken cooked chicken 1 cooked chicken thai basel blachan Noodles Pasta Pasta pasta chicken, pasta, scallions meatloaf brussel sprout greens greens chili lamb chop fried tofu lamb chop Zuchini 1 LB. GROUND BEEF sweet peppers sweet peppers sweet peppers peppers braising greens, parsnips braising greens tomatoe leftover pork beans lentils,beans, bacon, peas pound of split peas ice cream hot dog pasta parsley root squash squash squash squash kiwitcha farro garbanzo pumplkin lunch meat, apples, lettuce, tomato, chinese noodles pasta pasta parmesaen squash squash sguash meatloaf 1 instant noodle meat ball meat butter/oil margerine margerin canola canola chocolate chocolate chicked ganulated sugar brocoli candy corn meat bell papper mushroom soup can of cream of mushroom soup chicken potatoes squash tom meat pasta noodles noodles noodles black eyed peas black eyed pea blackeyed peas caper chili peeppers chili pepper cornstartch corn startch crackers cracker soy beans soy bean splendda tartar sauce veggie burgeer Ricotta,spaghetti,gark Ricotta,spaghetti,ragu Chicken, pasta, garlic, tomato paste canned salmon canned salmon canned salmon tin of salmon can of salmon salmon tin mexican corn canned corn salsa verde black eyed peas refried black beans sliced chiles canned jalapenos chipotle peppers canned beef frozen scallops frozen scallops Bowie pasta,ricotta, frox Rotisserie chicken rotisserie chicken Leftover chicken chicken piccata fish filets whole tomatoes tomatoes whole tomatoes canned refried black beans chicken corden blu coocke chicken cooked chicken dry pasta milk cheese tortalini pasta frozen vegetables can of chili a can of chili chili noodles pasta minced beef pasta pasta left over turkey pasta roast pasta crab seafood shellfish fish refrigerated biscuits wheate beans red peper bell peper brocolli cooked pork chops pumpkin 2 cups beans beans beans potatos
This list can be divided into the following categories:
Misspellings:
Entries such as “garbenzo beans” instead of “garbanzo beans” and “tomatos” instead of “tomatoes” are difficult to fix. I would either have to list common misspellings of these ingredients in the database as ingredient synonyms, or I would have to implement some sort of on-the-fly spelling checking algorithm to actually correct potentially misspelled words. The former might be a good solution in the short term, especially for very common misspellings, or correct spellings in other dialects of English, however this won’t be of much use to people who are simply really bad spellers. You know who you are.
Integrating NLP with standard spell checking algorithms is an approach, but both complicates and slows down already extremely complex code. Plus, it would be no easy task and difficult to prioritize very high with all the things I have on my plate.
Generic Ingredients
Queries such as “chocolate”, “pasta”, “ice cream” and “squash” are very generic. There’s many types of species of squash in the database, and from a culinary point of view, they can’t be treated as the same ingredient. However, it’s obvious that users are hoping to include or exclude all varieties of squash from their queries. I could easily see someone wanting to figure out what to do with a bunch of left over ice cream by searching for recipes that use any type of ice cream. Unfortunately, the current KitchenPC database design doesn’t support this concept.
This is a limitation that has been on my mind for quite some time, especially for grouping ingredients that could pose issues with certain allergies (such as nuts.) It could also be used for substitutions on the fly, such as “2% milk” and “1%” milk are quite often interchangeable between recipes.
I think the solution is to introduce a concept of an abstract ingredient into KitchenPC. This ingredient would help relate similar ingredients together, and could be tied into NLP, searching, etc. However, this is most likely a huge undertaking and would affect almost every aspect of the code and database. In fact, when I think about it for more than ten seconds, I start to shudder at all the stuff I’d have to re-write.
People Still Don’t Read The Instructions
There are still queries such as “lentils,beans, bacon, peas” and “mac nuts butter eggs flour hamburger” even though the instructions explicitly say to type in one ingredient at at time. The help video even shows this very clearly. Apparently, no matter what you do, there will always be some users who just ignore this and want it to work in a certain way.
There is the possibility of either supporting multiple ingredients at once, or at least detecting when this is done and providing a clearer error message – not that these people are likely to read error messages.
Hopefully this is something that doesn’t happen a lot, and can be ignored as user error.
What The???
Lastly, there are a few queries that just make you scratch your head. For example, “left over pork”. Who cares if it’s left over or not? Just type in pork!
Then of course there’s:
"jethro tull" and "new haven" AND collection:etree
I won’t even ask.
Fixing Valid Queries
It’s also obvious there’s a bunch of queries that should work but don’t. I’m spending some time this week going through these and fixing as many as possible, or at least the most common ones. Hopefully, over time, the interface will get harder and harder to fool. However, that’s going to take a while.