— Как я могу использовать НЛП для анализа ингредиентов рецепта?
спросил
Изменено 3 года, 8 месяцев назад
Просмотрено 17 тысяч раз
Мне нужно разобрать ингредиенты рецепта по количеству, размеру, наименованию и описанию, применимому к линии, например, 1 чашка муки, цедра 2 лимонов и 1 чашка упакованного коричневого сахара и т. д. Что лучше всего сделать? это? Я заинтересован в использовании python для проекта, поэтому я предполагаю, что использование nltk — лучший выбор, но я открыт для других языков.
- разбор
- нлп
2
На самом деле я делаю это для своего веб-сайта, который теперь является частью проекта с открытым исходным кодом, который могут использовать другие.
Я написал в блоге о своих методах, наслаждайтесь!
Chef Watson
2
The New York Times столкнулась с этой проблемой, когда анализировала свой архив рецептов. Они использовали технику НЛП, называемую случайным полем условий линейной цепи (CRF). Этот пост в блоге дает хороший обзор:
- «Извлечение структурированных данных из рецептов с использованием условных случайных полей»
Они открыли свой код, но быстро отказались от него. Я поддерживаю самую последнюю его версию и немного написал о том, как я ее модернизировал.
Если вы ищете готовое решение, несколько компаний предлагают разбор ингредиентов в качестве услуги:
- Zestful (полное раскрытие: я автор)
- Ложка
- Эдамам
4
Думаю, это через несколько лет, но я подумывал сделать что-то подобное сам и наткнулся на это, так что подумал, что могу попробовать, вдруг кому-нибудь пригодится в f
Даже если вы говорите вы хотите разобрать бесплатный тест, большинство рецептов имеют довольно стандартный формат для своих списков рецептов: каждый ингредиент находится на отдельной строке, точная структура предложения редко так важна. Диапазон словарного запаса также относительно невелик.
Одним из способов может быть проверка каждой строки на наличие слов, которые могут быть существительными, и словами/символами, выражающими количества. Я думаю, что WordNet может помочь определить, является ли слово существительным или нет, но я сам не использовал его раньше. В качестве альтернативы вы можете использовать http://en.wikibooks.org/wiki/Cookbook:Ingredients в качестве списка слов, хотя, опять же, я точно не знаю, насколько он исчерпывающий.
Другая часть предназначена для распознавания количества. Они бывают нескольких разных форм, но их достаточно мало, чтобы вы, вероятно, могли создать список ключевых слов. В частности, убедитесь, что у вас есть хорошие отчеты об ошибках. Если программа не может полностью проанализировать строку, заставьте ее сообщать вам, что это за строка, а также что она распознала/не распознала, чтобы вы могли соответствующим образом скорректировать свои списки ключевых слов.
В любом случае, я не гарантирую, что что-то из этого будет работать (и почти наверняка это не будет на 100% надежным), но именно так я бы начал подходить к проблеме
Это неполный ответ, но вы хотите написать анализатор свободного текста, который, как вы знаете, нетривиален 🙂
Некоторые способы обмана, используя знания, специфичные для кулинарии:
- Construct списки слов для «прилагательных» и «глаголов» и фильтрация по ним
- единицы измерения образуют закрытый набор, используя слова и сокращения, такие как {L. , c, cup, t, dash}
- инструкций — нарезать, нарезать кубиками, приготовить, очистить. Вещи, которые идут после этого, почти наверняка будут ингредиентами
- Помните, что в основном вы ищете существительные, и вы можете взять помеченный список не-существительных (например, из WordNet) и отфильтровать их.
Если вы более амбициозны, вы можете посмотреть в книге NLTK главу о синтаксических анализаторах.
Удачи! Это звучит как в основном выполнимый проект!
Можете ли вы уточнить, что вы вводите? Если у вас просто есть такой ввод:
1 стакан муки 2 цедры лимона 1 стакан упакованного коричневого сахара
Разобрать его не составит большого труда вообще без использования НЛП.
2
Зарегистрируйтесь или войдите в систему
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
:is() — CSS: каскадные таблицы стилей список.
Это полезно для написания больших селекторов в более компактной форме. Примечание: Первоначально названный :matches()
(и :any()
), этот селектор был переименован в :is()
в выпуске CSSWG #3258.
Псевдоэлементы недопустимы в списке селекторов для :is()
.
Разница между :is() и :where()
Разница между ними в том, что :is()
учитывает специфичность всего селектора (он принимает специфичность своего наиболее конкретного аргумента), тогда как :where()
имеет значение специфичности 0. Это продемонстрировано в примере на справочной странице :where()
.
Разбор прощающего селектора
Спецификация определяет :is()
и :where()
как прием списка прощающего селектора.
В CSS при использовании списка селекторов, если какой-либо из селекторов недействителен, весь список считается недействительным.
При использовании :is()
или :where()
вместо того, чтобы весь список селекторов считался недействительным, если один из них не может быть проанализирован, неправильный или неподдерживаемый селектор будет игнорироваться, а будут использоваться другие.: есть (: действительно,: не поддерживается) { /* … */ }
Будет правильно анализировать и сопоставлять :valid
даже в браузерах, которые не поддерживают :unsupported
, тогда как:
:valid, :неподдерживаемый { /* … */ }
Будет игнорироваться в браузерах, которые не поддерживают :unsupported
, даже если они поддерживают :valid
.
Упрощение селекторов списка
Псевдокласс
может значительно упростить ваши селекторы CSS. Например, возьмите следующий CSS:
/* Ненумерованные списки с тремя (или более) глубинами используют квадрат */ ол ол ул, ол ул ул, ол меню ул, ол дир ул, ол ол меню, ол уль меню, ол меню меню, ол дир меню, ол ол дир, ол уль дир, ол меню директор, ол дир дир, ул ол ул, ул ул ул, ул меню ул, ул дир ул, ул ол меню, ул уль меню, ул меню меню, уль дир меню, ул ол дир, ул уль дир, ул меню директор, ул дир дир, меню ол ул, меню ул ул, меню меню ул, меню дир ул, меню ол меню, меню ул меню, меню меню меню, меню реж меню, меню ол дир, меню ул дир, меню меню реж, меню дир дир, дир ол ул, дир ул ул, дир меню ул, дир дир ул, дир ол меню, дир уль меню, меню меню дир, дир дир меню, дир ол дир, дир уль дир, дир меню дир, дир дир дир { тип стиля списка: квадратный; }
Вы можете заменить его на:
/* 3-глубокие (или более) неупорядоченные списки используют квадрат */ :is(ol, ul, menu, dir) :is(ol, ul, menu, dir) :is(ul, menu, dir) { тип стиля списка: квадратный; }
Упрощение селекторов разделов
Псевдокласс :is()
особенно полезен при работе с разделами и заголовками HTML. Поскольку
,
, и
обычно вложены вместе, без
:is()
, стилизовать их так, чтобы они соответствовали друг другу, может быть непросто.
Например, без :is()
стилизация всех элементов
на разной глубине может быть очень сложной:
/* Уровень 0 */ ч2 { размер шрифта: 30px; } /* 1-й уровень */ сечение h2, статья h2, в сторону h2, навигация h2 { размер шрифта: 25px; } /* Уровень 2 */ сечение сечение h2, статья раздела h2, сечение в сторону h2, раздел навигации h2, раздел статьи h2, статья статья h2, статья в сторону h2, статья навигация h2, в сторону секции h2, в сторону статьи h2, в сторону h2, в сторону навигации h2, раздел навигации h2, навигационная статья h2, навигация в сторону h2, нав нав h2 { размер шрифта: 20px; } /* Уровень 3 */ /* даже не думайте об этом! */
Используя :is()
, это гораздо проще:
/* Уровень 0 */ ч2 { размер шрифта: 30px; } /* 1-й уровень */ :is(раздел, статья, в сторону, навигация) h2 { размер шрифта: 25px; } /* Уровень 2 */ :is(раздел, статья, в стороне, навигация) :is(раздел, статья, в стороне, навигация) h2 { размер шрифта: 20px; } /* Уровень 3 */ :is(раздел, статья, в сторону, навигация) :is(раздел, статья, в сторону, навигация) :is(раздел, статья, в сторону, навигация) ч2 { размер шрифта: 15px; }
:is() не выбирает псевдоэлементы
Псевдокласс :is()
не соответствует псевдоэлементам.