Анализ количества ингредиентов натурального языка для рецептов
Я создаю приложение для управления рецептами рубина, и как часть его, я хочу иметь возможность анализировать количество ингредиентов в форме, которую я могу сравнить и масштабировать. Мне интересно, какие лучшие инструменты для этого.
Я изначально планировал сложное регулярное выражение, а затем на какой-то другой код, который преобразует человекочитаемые числа, такие как two
или five
в целые числа, и, наконец, код, который преобразует say 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
в часть ингредиента. Однако, чтобы обеспечить это, я должен иметь возможность сообщить, что недействительно.
Есть ли api или драгоценный камень, который я мог бы использовать? Вольфрам Альфа выглядел многообещающим сначала, но в конечном счете, я не думаю, что это сработает, если я не смогу сказать им, что я только кормлю их количеством рецептов.
Я также не уверен, что такое "базовое" измерение, в которое я должен преобразовывать величины.
РЕДАКТИРОВАТЬ: Просто чтобы устранить любую путаницу, это мои цели.
-
Чтобы иметь возможность масштабировать рецепты. Произвольные единицы измерения, такие как
packages
не нужно масштабировать, но точно такие, как cups
или
ounces
должен быть.
-
Выясните основные ингредиенты.. В контексте этого вопроса это будет сделано в основном путем выяснения того, какой самый большой ингредиент в рецепте. В производстве должен быть какой-то модификатор, основанный на типе ингредиента, потому что, очевидно, flour
почти никогда не считается "основным" ингредиентом. Однако chocolate
можно использовать экономно, и все равно можно сказать a chocolate cake
.
-
Нормализовать ввод. Чтобы сохранить некоторую согласованность на сайте, я хочу сохранить согласованные аббревиатуры. Например, вместо pounds
он должен быть lbs
.
Я также добавил тег NLTK, потому что мне интересно, будет ли это проще в python с NLTK.
Ответы
Ответ 1
Вы задаете две проблемы, распознаете/извлеките количественные выражения (синтаксис) и выясните, какую сумму они означают (семантика).
Прежде чем вы узнаете, достаточно ли регулярных выражений для распознавать количества, вы должны составить себе хорошую схему (грамматику) того, как они выглядят. Ваши примеры выглядят следующим образом:
<amount> <unit> [of <ingredient>]
где <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)
Сумма также может быть выражена как диапазон двух простых <amount>
s:
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)
. (Для счетчиков используйте специальные единицы "штук" или что угодно, "немного" и т.д., Я буду рассматривать их как специальные единицы).
Это оставляет вопрос о преобразовании или сравнении величин. Преобразование единиц было сделано во многих местах, поэтому, по крайней мере, для официальных подразделений вам не составит труда получить таблицы преобразования. Google сделает это, если вы наберете "конвертировать 4oz в граммы", например. Обратите внимание, что Tbsp три или четыре tsp, в зависимости от страны.
Вы можете легко стандартизировать свои любимые устройства для четко определенных единиц, но неофициальные подразделения немного сложнее. Для "щепотки", "тире" и т.п. Я хотел бы предложить приблизительный вес, чтобы вы могли масштабироваться должным образом (десять пинчей = 2 грамма или что-то еще). Банки и т.п. Безнадежны, если вы не можете посмотреть размер конкретных продуктов.
С другой стороны, субъективные суммы являются самыми легкими: если вы увеличиваете "по вкусу" десять раз, все равно "по вкусу"!
Последняя мысль: какая-то база данных ингредиентов также необходима для распознавания основных ингредиентов, поскольку размер имеет значение: "Одно яйцо", вероятно, не является основным ингредиентом, но "одна маленькая коза, четверть" вполне может быть. Я бы рассмотрел его для версии 2.
Ответ 2
Регулярные выражения трудно поддаются правильному анализу на языке. NLTK, как вы уже упоминали, вероятно, будет хорошим вариантом для поиска, иначе вы обнаружите, что обойдетесь кругами, пытаясь получить правильные выражения.
Если вы хотите что-то вроде разнообразия Ruby вместо NLTK, посмотрите на Treat:
https://github.com/louismullie/treat
Кроме того, может быть хорошим вариантом также и лингвистическая структура:
http://deveiate.org/projects/Linguistics
EDIT:
Я подумал, что там уже должен быть парсер рецептов Ruby, вот еще один вариант, который вы, возможно, захотите изучить:
https://github.com/iancanderson/ingreedy
Ответ 3
Существует много бесплатных учебных материалов, если вы знаете, как написать хороший веб-скребок и инструмент разбора.
http://allrecipes.com/Recipe/Darias-Slow-Cooker-Beef-Stroganoff - Этот сайт позволяет конвертировать количество рецептов на основе метрической/имперской системы и количества посетителей.
http://www.epicurious.com/tools/conversions/common - На этом сайте, похоже, много конверсионных констант.
Некоторые систематические выскабливания существующих сайтов рецептов, в которых представлены ингредиенты, процедуры в некотором структурированном формате (которые вы можете обнаружить, читая базовый HTML-код), помогут вам создать действительно большой набор данных для обучения, который значительно затруднит принятие такой проблемы намного проще.
Когда у вас есть тонны данных, даже простые методы обучения могут быть весьма полезными. Когда у вас много данных, вы можете использовать стандартные трюки nlp (ngrams, tf-idf, наивные заливы и т.д.), Чтобы быстро сделать потрясающие вещи.
Например:
Основной ингредиент
Ингредиенты в блюде с более высоким idf (частота обратного документа) скорее всего будут основными ингредиентами. В каждом блюде упоминается соль, поэтому она должна иметь очень низкий idf. В гораздо меньшем количестве блюд упоминается масло, поэтому он должен иметь более высокий idf. Большинство блюд, вероятно, имеют только один основной белок, поэтому фразы типа "цыпленок", "тофу" и т.д. Должны быть более редкими и гораздо более вероятными основными ингредиентами, чем соль, лук, масло и т.д. Конечно, могут быть такие предметы, как "cilantro" который может быть более редким, чем "цыпленок", но если вы соскоблили некоторые соответствующие метаданные вместе с каждым блюдом, у вас появятся сигналы, которые помогут вам исправить эту проблему. Большинство шеф-поваров, возможно, не используют кинза в своих рецептах, но те, которые, вероятно, используют его довольно много. Таким образом, для любого имени ингредиента вы можете определить имя idf, сначала рассмотрев только авторов, которые упомянули ингредиент хотя бы один раз, а затем видя ингредиент idf на этом подмножестве рецептов.
Масштабирование рецептов
В большинстве сайтов рецептов упоминается, сколько людей обслуживает конкретное блюдо, а также список отдельных ингредиентов с соответствующими количествами для такого количества людей.
Для любого конкретного ингредиента вы можете собрать все рецепты, которые упоминают об этом, и посмотреть, какое количество ингредиента было предписано для какого количества людей. Это должно сказать вам, какие фразы используются для описания величин для этого ингредиента, и как шкала чисел. Также вы можете собрать все ингредиенты, количество которых было описано с использованием определенной фразы (например, "ломтики" → (хлеб, сыр, тофу,...), "чашка" → (рис, мука, орехи,...)) и посмотрите на наиболее распространенные из этих фраз и вручную запишите, как они будут масштабироваться.
Нормализовать ввод
Это не похоже на тяжелую проблему. В ручном порядке список общих сокращений и их полных форм (например, "фунты" → "килограммы" , "килограммы" → "килограммы" , "унция" → "унции" и т.д.) Должны решить 90% проблемы. Добавление новых сокращений в этот список, когда вы их видите, должно сделать этот список довольно всеобъемлющим через некоторое время.
Вкратце, я прошу вас значительно увеличить размер ваших данных и собрать множество соответствующих метаданных вместе с каждым рецептом, который вы очищаете (информация об авторе, жанр пищи и т.д.), и использовать все эти структурированные данные вместе с простыми NLP/ML, чтобы решить большинство проблем, с которыми вы столкнетесь, пытаясь построить интеллектуальный сайт рецептов.
Ответ 4
Насколько это возможно:
-
Я бы поставил их в порядок, чтобы, если вы получите больше, чем столько унций, идите в чашки, если вы получите mroe, чем столько чашек, идите к пинтам, пометам, галлонам и т.д. t знать, как вы можете избежать этого, если кто-то уже не написал код для обработки этого.
-
Если ингредиент находится в названии, это, вероятно, главный ингредиент. Однако вы столкнетесь с проблемами с "Cookies Oatmeal Raisin". Как вы заявили, мука, молоко и т.д. Не являются основным ингредиентом. Вам также нужно будет отображать бекон, свиную отбивную, свиную жареную свинину, а также стейк, гамбургер и т.д., Чтобы возможно говядина.
-
Опять же, это просто взгляд на количество чего-то, вы знаете, что люди будут иметь lbs, oz и т.д., поэтому постарайтесь упредить их и напишите как можно лучше. Вы можете пропустить некоторые, но по мере роста вашего сайта вы сможете ввести новый фильтр.
Если вы пройдете всю эту работу, подумайте о ее выпуске, чтобы другим не приходилось:)