Стратегия разбора описания естественного языка в структурированные данные - PullRequest
12 голосов
/ 08 октября 2011

У меня есть набор требований, и я ищу лучшее основанное на Java стратегическое / программное обеспечение / программное обеспечение для использования.По сути, я хочу взять набор ингредиентов рецепта, введенных реальными людьми на естественном английском языке, и проанализировать метаданные в структурированном формате (см. Требования ниже, чтобы узнать, что я пытаюсь сделать).

Я осмотрелся здесь и в других местах, но не нашел ничего, что дало бы совет высокого уровня о том, в каком направлении следоватьИтак, я скажу это умным людям: -):

Какой самый лучший / самый простой способ решить эту проблему?Должен ли я использовать синтаксический анализатор естественного языка, dsl, lucene / solr или какой-либо другой инструмент / технологию?НЛП, кажется, может работать, но выглядит действительно сложно.Я бы предпочел не тратить много времени на глубокое погружение, просто чтобы узнать, что он не может сделать то, что я ищу, или что есть более простое решение.

Требования

С учетом этих рецептурных описаний ингредиентов ....

  1. "8 чашек смешанной зелени (около 5 унций)"
  2. "Восемь куриных бедер без кожи (около 1¼ фунтов)"
  3. "6,5 столовых ложек оливкового масла экстра-класса"
  4. "примерно 6 унций тонко нарезанного копченого лосося, нарезанного полосками"
  5. "2 целых курицы (по 3,5 фунта каждая)«
  6. » 20 унций каждого замороженного нарезанного шпината, оттаявшего «
  7. ». 5 стаканов сыра пармезан, тертого «
  8. » около 0,5 стакана пекана, поджаренного и мелко нарезанного »
  9. ". 5 чашек Dixie Diner Хлебная крошка микс, обычная"
  10. "8 зубчиков чеснока, фарш (4 ч. Ложки)"
  11. "8 зеленых луковиц, нарезанных на 2 части"

Я хочу превратить это в это ...

|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|
|     | Measure |             |                         | weight | weight    |                                |             |
| #   | value   | Measure     | ingredient              | value  | measure   | preparation                    | Brand Name  |
|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|
| 1.  | 8       | cups        | mixed greens            | 5      | ounces    | -                              | -           |
| 2.  | 8       | -           | skinless chicken thigh  | 1.5    | pounds    | -                              | -           |
| 3.  | 6.5     | tablespoons | extra-virgin olive oil  | -      | -         | -                              | -           |
| 4.  | 6       | ounces      | smoked salmon           | -      | -         | thinly sliced, cut into strips | -           |
| 5.  | 2       | -           | whole chicken           | 3.5    | pounds    | -                              | -           |
| 6.  | 20      | ounces      | forzen chopped spinach  | -      |           | thawed                         | -           |
| 7.  | .5      | cup         | parmesean cheese        | -      | -         | grated                         | -           |
| 8.  | .5      | cup         | pecans                  | -      | -         | toasted, finely ground         | -           |
| 9.  | .5      | cup         | Bread Crumb Mix, plain  | -      | -         | -                              | Dixie Diner |
| 10. | 8       | -           | garlic clove            | 4      | teaspoons | minced                         | -           |
| 11. | 8       | -           | green onions            | -      | -         | cut into 2 pieces              | -           |
|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|

Обратите внимание на разнообразие описаний.Некоторые вещи сокращены, некоторые нет.Некоторые числа являются числами, некоторые прописаны.

Я хотел бы что-то, что делает идеальный анализ / перевод.Но согласился бы на что-то, что достаточно хорошо для начала.

Бонусный вопрос: после предложения стратегии / инструмента, как бы вы это сделали?

Спасибо!

Джо

Ответы [ 5 ]

7 голосов
/ 08 октября 2011

Краткий ответ.Используйте GATE .

Длинный ответ.Вам нужен инструмент для распознавания образов в тексте.Что-то, что может поймать шаблоны, такие как:

{Number}{Space}{Ingredient}
{Number}{Space}{Measure}{Space}{"of"}{Space}{Ingredient}
{Number}{Space}{Measure}{Space}{"of"}{Space}{Ingredient}{"("}{Value}{")"}
...

Где {Number} - это число, {Ingredient} взято из словаря ингредиентов, {Measure} - из словарных мер и так далее.

Шаблоны, которые я описал, очень похожи на правила JAPE GATE .С их помощью вы ловите текст, который соответствует шаблону, и присваиваете метки каждой части шаблона (число, ингредиент, мера и т. Д.).Затем вы извлекаете помеченный текст и помещаете его в одну таблицу.

Упомянутые мной словари могут быть представлены Gazetteers в GATE.

Итак, GATE покрывает все ваши потребности.Это не самый простой способ начать, так как вам придется изучить хотя бы основы GATE, правила JAPE и Бюллетени, но с таким подходом вы сможете получить действительно хорошие результаты.

1 голос
/ 13 сентября 2018

Если вы не хотите, чтобы вас подвергали мелочам НЛП и машинного обучения, есть несколько хостинговых сервисов, которые делают это для вас:

Если вы заинтересованы в* * * * * * * * * * * * * * * * * * * * * * * * * * * * '' Нью-Йорк Таймс ''], о том, как они проанализировали архив своих ингредиентов.Они открыли свой код, но вскоре отказались от него.Я поддерживаю самую последнюю версию и я написал немного о том, как я его модернизировал.

1 голос
/ 08 октября 2011

Вы также можете попробовать Gexp .Затем вы должны написать правила как класс Java, такие как

seq(Number, opt(Measure), Ingradient, opt(seq(token("("), Number, Measure, token(")")))

Затем вам нужно добавить некоторую группу для захвата (group(String name, Matcher m)) и извлечь части шаблона и сохранить эту информацию в таблице.Для Number, Measure вы должны использовать аналогичную модель Gexp, или я бы порекомендовал какой-нибудь неглубокий разбор для определения имен существительных со словами из Ingradients.

1 голос
/ 08 октября 2011

Это в основном разбор естественного языка. (Вы уже остановили курицу [с].) Так что в основном это процесс перевода. К счастью, контекст очень ограничен.

Вам необходим вспомогательный перевод, в который можно добавлять словарные записи, адаптировать правила грамматики и повторить попытку.

Простой процесс / рабочий процесс в этом случае гораздо важнее, чем алгоритмы. Я заинтересован в обоих аспектах.

Если вам нужна рука для программирования для первоначального прототипа, не стесняйтесь связаться со мной. Я видел, вы уже работаете достаточно структурировано.

К сожалению, я не знаю подходящих каркасов. Вы делаете что-то, что Mathematica хочет сделать со своей Альфой (команды на естественном языке, дающие результаты). Сбор данных? Но простой синтаксический анализ естественного языка с процессом ручной адаптации должен дать быстрые и простые результаты.

0 голосов
/ 08 октября 2011

Есть ли у вас доступ к помеченному корпусу для обучения статистической модели?Это, наверное, самый плодотворный проспект здесь.Вы можете создать его с помощью epicurious.com;Вычистите множество списков ингредиентов их рецептов, которые представлены в виде прозаической формы, которую необходимо проанализировать, а затем воспользуйтесь полезной функцией «распечатать список покупок», которая предоставляет те же ингредиенты в табличном формате.Вы можете использовать эти данные для обучения статистической языковой модели, поскольку у вас будут как необработанные непомеченные данные, так и ожидаемые результаты анализа для большого числа примеров.

Это может быть более масштабный проект, чем у вас ввозражаю, но я думаю, что в конечном итоге это даст лучшие результаты, чем структурированный нисходящий подход.

...