将自然语言描述解析为结构化数据的策略
我有一套要求,我正在寻找最好的基于Java的策略/ algorthm /软件。 基本上,我想采用自然英语中真人输入的一组配方成分,并将元数据解析为结构化格式(请参阅下面的要求以了解我正在尝试做什么)。
我在这里和其他地方环顾四周,但没有找到任何可以提供关于方向的高级建议。 所以,我会把它交给聪明的人:-):
解决这个问题的最佳/最简单的方法是什么? 我应该使用自然语言解析器,dsl,lucene / solr或其他一些工具/技术吗? NLP似乎可能有效,但它看起来非常复杂。 我宁愿不花费大量时间深入探究,只是为了发现它不能做我正在寻找的东西,或者有一个更简单的解决方案。
要求
鉴于这些食谱成分说明….
- “8杯混合蔬菜(约5盎司)”
- “八只去皮的鸡大腿(大约1¼磅)”
- “6.5汤匙特级初榨橄榄油”
- “大约6盎司薄切片熏鲑鱼,切成条状”
- “2只整只鸡(每只3.5磅)”
- “每个冷冻切碎的菠菜20盎司,解冻”
- “.5杯帕玛森芝士,磨碎”
- “大约.5杯山核桃,烤好的地面”
- “.5杯Dixie晚餐面包屑混合,平原”
- “8个蒜瓣,切碎(4茶匙)”
- “8个葱,切成2块”
我想把它变成这个….
| ----- | --------- | ------------- | ------------------- ------ | -------- | ----------- | ---------------------- ---------- | ------------- | | | 措施| | | 重量| 重量| | | | #| 价值| 措施| 成分| 价值| 措施| 准备| 品牌名称| | ----- | --------- | ------------- | ------------------- ------ | -------- | ----------- | ---------------------- ---------- | ------------- | | 1. | 8 | 杯子| 混合蔬菜| 5 | 盎司| - | - | | 2. | 8 | - | 去皮鸡大腿| 1.5 | 磅| - | - | | 3. | 6.5 | 汤匙| 特级初榨橄榄油| - | - | - | - | | 4. | 6 | 盎司| 烟熏三文鱼| - | - | 切成薄片,切成条状 - | | 5. | 2 | - | 整鸡| 3.5 | 磅| - | - | | 6. | 20 | 盎司| forzen切碎的菠菜| - | | 解冻| - | | 7. | .5 | 杯子| parmesean cheese | - | - | 磨碎| - | | 8. | .5 | 杯子| 山核桃| - | - | 烤,精细研磨 - | | 9. | .5 | 杯子| 面包屑混合物,平原| - | - | - | Dixie Diner | | 10. | 8 | - | 大蒜丁香| 4 | 茶匙| 切碎| - | | 11. | 8 | - | 大葱| - | - | 切成2块| - | | ----- | --------- | ------------- | ------------------- ------ | -------- | ----------- | ---------------------- ---------- | ------------- |
请注意描述的多样性。 有些东西是缩写的,有些则不是。 有些数字是数字,有些数字是拼写出来的。
我会喜欢能完美解析/翻译的东西。 但是,我会满足于开始做得相当好的事情。
奖金问题:建议一个策略/工具后,你会怎么做?
谢谢!
乔
简短的回答。 使用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的基础知识,JAPE规则和Gazetteers,但是通过这种方法你将能够获得非常好的结果。
它基本上是自然语言解析。 (你确实已经扼杀了鸡肉。)所以基本上它是一个翻译过程。 幸运的是,上下文非常有限。
您需要一个支持性翻译,您可以在其中添加字典条目,调整语法规则并再次重试。
在这种情况下,简单的过程/工作流程比算法重要得多。 我对这两个方面感兴趣。
如果您需要编程手来获取初始原型,请随时与我联系。 我确实看到了,你已经完成了很有条理的工作。
不幸的是,我不知道适合框架。 你正在做的事情,Mathematica想要用它的Alpha(自然语言命令产生结果)。 数据挖掘? 但是,使用手动自适应过程进行简单的自然语言分析可以提供快速简便的结果。
你也可以试试Gexp 。 然后你必须把规则写成Java类,如
seq(Number, opt(Measure), Ingradient, opt(seq(token("("), Number, Measure, token(")")))
然后你必须添加一些组来捕获( group(String name, Matcher m)
)和extrat部分模式并将这些信息存储到表中。 对于Number,Measure你应该使用类似的Gexp模式,或者我建议使用Ingradients中的单词对名词短语检测进行一些浅解析。
您是否可以访问标记语料库来训练统计模型? 这可能是这里最富有成效的途径。 你可以使用epicurious.com建立一个; 刮掉很多他们的食谱成分列表,这些是你需要解析的散文forms,然后使用他们有用的“打印购物清单”function,它以表格格式提供相同的成分。 您可以使用此数据来训练统计语言模型,因为您将同时拥有原始未标记数据和大量示例的预期解析结果。
这可能是一个比你想象的更大的项目,但我认为最终它将产生比结构化的自顶向下解析方法更好的结果。
如果您不想接触NLP和机器学习的细节,那么有一些托管服务可以帮到您:
- Zestful (免责声明:我是作者)
- Spoonacular
- Edamam
如果你对这个细节感兴趣, 纽约时报 写了他们如何解析他们的成分档案。 他们开源了他们的代码,但很快就放弃了。 我保留了最新版本的内容,并且我写了一些关于如何对其进行现代化的文章。