Подтвердить что ты не робот

Стратегия анализа описаний естественного языка в структурированных данных

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

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

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

Требования

Учитывая эти описания ингредиентов рецепта....

  • "8 чашек смешанной зелени (около 5 унций)"
  • "Восемь кусатых куриных бедер (около 1¼ фунта)"
  • "6.5 столовые ложки оливкового масла экстра-оливкового масла"
  • "приблизительно 6 унций. тонко нарезанный копченый лосось, разрезанный на полоски"
  • "2 целых цыплят (по 3 фунта каждый)"
  • "20 унций каждого замороженного рубленого шпината, оттаявшего"
  • ". 5 чашек сыра пармезан, тертого"
  • "около 0,5 чашки орехов пекан, поджаренных и тонко измельченных".
  • ". 5 чашек Dixie Diner Bread Crumb Mix, простой"
  • "8 зубчиков чеснока, фарш (4 чайных ложки)"
  • "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              | -           |
|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|

Обратите внимание на разнообразие описаний. Некоторые вещи сокращены, некоторые - нет. Некоторые цифры - цифры, некоторые из них указаны.

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

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

Спасибо!

Джо

4b9b3361

Ответ 1

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

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

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

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

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

Словарь, о котором я упоминал, может быть представлен Gazetteers в GATE.

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

Ответ 2

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

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

Легкий процесс/рабочий процесс в этом случае гораздо важнее алгоритмов. Меня интересуют оба аспекта.

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

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

Ответ 3

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

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

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

Ответ 4

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

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