parsing stanford - Как я могу использовать NLP для анализа ингредиентов рецептов?




parser online (5)

Это неполный ответ, но вы смотрите на создание анализатора свободного текста, который, как вы знаете, нетривиальный :)

Некоторые способы обмануть, используя знания, специфичные для приготовления пищи:

  1. Создавайте списки слов для «прилагательных» и «глаголов» и фильтруйте их
    1. единицы измерения образуют замкнутый набор, используя слова и сокращения, такие как {L., c, cup, t, dash}
    2. инструкции - вырезать, кубики, варить, очистить. Вещи, которые приходят после этого, почти наверняка будут ингредиентами
  2. Помните, что вы в основном ищете существительные, и вы можете взять помеченный список не-существительных (например, из WordNet) и фильтровать их.

Если вы более амбициозны, вы можете посмотреть в книге NLTK в главе о парсерах.

Удачи! Это звучит как в основном выполнимый проект!

Мне нужно разобрать ингредиенты рецепта на количество, измерение, предмет и описание, применимые к линии, такие как 1 чашка муки, кожура из 2 лимонов и 1 чашка упакованного коричневого сахара и т. Д. Каким будет лучший способ сделать это? Я заинтересован в использовании python для проекта, поэтому я предполагаю, что использование nltk - лучшая ставка, но я открыт для других языков.


Можете ли вы уточнить, что такое ваш вклад? Если у вас есть только такой ввод:

1 cup flour
2 lemon peels
1 cup packed brown sugar

Это не будет слишком сложно разобрать, не используя никакой НЛП вообще.


Я думаю, это уже несколько лет, но я думал о том, чтобы сделать что-то подобное себе и наткнулся на это, поэтому подумал, что у меня может быть удар в нем, если он будет полезен кому-либо еще в f

Несмотря на то, что вы говорите, что хотите разобрать бесплатный тест, большинство рецептов имеют довольно стандартный формат для своих списков рецептов: каждый ингредиент находится на отдельной строке, структура точного предложения редко бывает очень важна. Диапазон vocab также относительно невелик.

Одним из способов может быть проверка каждой строки для слов, которые могут быть существительными и словами / символами, которые выражают величины. Я думаю, что WordNet может помочь увидеть, что слово может быть существительным или нет, но я не использовал его раньше себя. Кроме того, вы могли бы использовать http://en.wikibooks.org/wiki/Cookbook:Ingredients в качестве списка слов, хотя, опять же, я не знаю точно, насколько он всеобъемлющий.

Другая часть - признать величины. Они представлены в нескольких разных формах, но недостаточно, чтобы создать список ключевых слов. В частности, убедитесь, что у вас хорошая отчетность об ошибках. Если программа не может полностью проанализировать строку, попросите ее сообщить вам, что это за строка, а также то, что она / не признала, поэтому вы можете соответствующим образом скорректировать списки ключевых слов.

Aaanyway, я не гарантирую, что это будет работать (и это почти наверняка не будет на 100% надежным), но вот как я начал бы подходить к проблеме



Я знаю, что это старый поток, но я просто хотел добавить код PEGjs к ответам. Этот код будет анализировать фрагмент текста и «встраивать» его в своего рода структуру «AST-ish». Он идет только один, и он выглядит уродливым, кроме того, он действительно не использует возвращаемые значения для создания правильной структуры, но сохраняет дерево в памяти вашего синтаксиса, и оно вернется в конце. Это может стать громоздким и вызвать некоторые проблемы с производительностью, но, по крайней мере, он делает то, что должен.

Примечание. Убедитесь, что у вас есть вкладки вместо пробелов!

{ 
    var indentStack = [], 
        rootScope = { 
            value: "PROGRAM",
            values: [], 
            scopes: [] 
        };

    function addToRootScope(text) {
        // Here we wiggle with the form and append the new
        // scope to the rootScope.

        if (!text) return;

        if (indentStack.length === 0) {
            rootScope.scopes.unshift({
                text: text,
                statements: []
            });
        }
        else {
            rootScope.scopes[0].statements.push(text);
        }
    }
}

/* Add some grammar */

start
  = lines: (line EOL+)*
    { 
        return rootScope;
    }


line
  = line: (samedent t:text { addToRootScope(t); }) &EOL
  / line: (indent t:text { addToRootScope(t); }) &EOL
  / line: (dedent t:text { addToRootScope(t); }) &EOL
  / line: [ \t]* &EOL
  / EOF

samedent
  = i:[\t]* &{ return i.length === indentStack.length; }
    {
        console.log("s:", i.length, " level:", indentStack.length);
    }

indent
  = i:[\t]+ &{ return i.length > indentStack.length; }
    {
        indentStack.push(""); 
        console.log("i:", i.length, " level:", indentStack.length);
    }

dedent
    = i:[\t]* &{ return i.length < indentStack.length; }
      {
          for (var j = 0; j < i.length + 1; j++) {
              indentStack.pop();
          } 
          console.log("d:", i.length + 1, " level:", indentStack.length);  
      }

text
    = numbers: number+  { return numbers.join(""); } 
    / txt: character+   { return txt.join(""); }


number
    = $[0-9] 

character 
    = $[ a-zA-Z->+]  
__
    = [ ]+

_ 
    = [ ]*

EOF 
    = !.

EOL
    = "\r\n" 
    / "\n" 
    / "\r"




parsing nlp