以自由文本形式给出一个食谱(成分列表,步骤等),我怎么能以这样的方式解析它,我可以提取成分(例如数量,测量单位,成分名称,等)用PHP?
假设自由文本有些格式化。
答案 0 :(得分:7)
要“正确”执行此操作,您需要定义某种语法,然后使用LALR解析器或某些工具(如yacc,bison或Lex)来构建解析器。假设你不想这样做,它的strpos()ftw!
答案 1 :(得分:3)
java中有openNlp用于名称实体提取,它可以提取你所看到的内容:http://opennlp.sourceforge.net/models-1.5/
然后你可以使用php-java连接器将结果导入php。
答案 2 :(得分:1)
Java的question非常相似。简而言之,您需要词典(例如,成分)和类似于正则表达式的语言(注释)。您可以在Java中执行此操作并通过Web服务从PHP调用它,或者您可以尝试在PHP中重新实现它(注意,在第二种情况下,您可能会显着减速)。
答案 3 :(得分:0)
如果没有大量的语言建模,我认为唯一的方法就是拥有大量的成分并在食谱中搜索它们。数量应该是成分之前的单词。
答案 4 :(得分:0)
如果你想快速做到这一点,并且收集最少量的资源收集,你可能会想出一些好的启发式和一些正则表达式。
既然你说列表是“格式化的”,我会假设每行有一个成分指令。
我首先提出一个测量名称列表,这是一个相对封闭的类(我们称之为语言学),如$measurements=['cup', 'tablespoon', 'teaspoon', 'pinch', 'dash', 'to taste', ...]
。你甚至可能想出一个字典,将几个项目映射到一个标准化值(所以$measurements={cup:['cup', 'c'], tablespoon:['tablespoon', 'tbsp', 'tablesp', ...], ...}
或其他什么。)
然后在每一行上,您可以找到测量单位,如果它在您的字典中。接下来,查找数字(可以格式化为小数 - 例如1.5 - 或复杂分数 - 例如2 1/2或2-1 / 2),并假设这是您需要的单位数。如果没有数字,那么你可以假设单位是一个(可能是“尝试”之类的情况)。
最后,您可以假设任何剩余的是实际成分。
我认为这种启发式方法可以覆盖75-80%的案例。你仍然会遇到很多极端情况,例如当食谱要求“2个橙子”时,或者 - 更糟! - “2个橘子汁”。在这些情况下,您可能希望将它们(在某种类型的离线管理期间)添加为例外,或者让自己“没事”,因为它们没有被正确对待。