将自然语言描述解析为结构化数据的策略

13

我有一组要求,正在寻找最佳的基于Java的策略/算法/软件来使用。基本上,我想采取由真实人们输入的自然英语食谱成分集并将元数据解析成结构化格式(请参见下面的要求,以了解我的意图)。

我在这里和其他地方四处寻找,但没有找到任何高级建议来确定方向。所以,我向聪明人提问:

解决这个问题的最佳/最简单方法是什么?应该使用自然语言解析器、DSL、lucene/solr还是其他工具/技术?NLP看起来可能有效,但它看起来非常复杂。我宁愿不花太多时间进行深入研究,只是为了发现它不能做到我想要的或者有更简单的解决方案。

要求

给出这些食谱成分描述……

  1. 8 杯混合生菜(约 5 盎司)
  2. 8 块去皮鸡腿肉(约 1¼ 磅)
  3. 6.5 汤匙特级初榨橄榄油
  4. 约 6 盎司切成条状的薄片熏三文鱼
  5. 2 只整鸡(每只 3.5 磅)
  6. 每袋 20 盎司冷冻菠菜末,解冻后
  7. 约 0.5 杯帕尔玛干酪,磨碎
  8. 约 0.5 杯胡桃仁,烤香并细碎
  9. 约 0.5 杯 Dixie Diner 面包屑混合物,普通口味
  10. 8 瓣大蒜,切碎(4 茶匙)
  11. 8 根青葱,切成 2 段

我想把它转化为这个...

|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------| | | 测量 | | | 重量 | 重量 | | | | # | 值 | 测量 | 食材 | 值 | 测量 | 制备 | 品牌名称 | |-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------| | 1. | 8 | 杯 | 混合生菜 | 5 | 盎司 | - | - | | 2. | 8 | - | 无皮鸡腿肉 | 1.5 | 磅 | - | - | | 3. | 6.5 | 汤匙 | 特级初榨橄榄油 | - | - | - | - | | 4. | 6 | 盎司 | 烟熏三文鱼 | - | - | 切成条状 | - | | 5. | 2 | - | 整只鸡 | 3.5 | 磅 | - | - | | 6. | 20 | 盎司 | 冷冻菠菜碎 | - | | 解冻 | - | | 7. | .5 | 杯 | 帕尔马干酪 | - | - | 磨碎 | - | | 8. | .5 | 杯 | 山核桃 | - | - | 烤香,磨细 | - | | 9. | .5 | 杯 | 普通面包屑混合物 | - | - | - | Dixie Diner | | 10. | 8 | - | 大蒜瓣 | 4 | 茶匙 | 切碎 | - | | 11. | 8 | - | 青葱 | - | - | 切成2段 | - | |-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|
请注意描述的多样性。有些事情是缩写的,有些不是。一些数字是用数字表示的,一些是拼写出来的。
我希望有一个能够进行完美解析/翻译的工具。但是,如果能开始就做得相当不错,那也是可以接受的。
奖励问题:在建议策略/工具之后,你会怎么做?
谢谢!

感谢大家的回答。听起来大多数人都推荐自然语言解析方法。我不介意尝试,但有些术语让我有点望而却步,例如用标记语料库训练统计模型。我对这一切都很新。我将从斯坦福自然语言处理工具开始,因为它似乎是最受欢迎/推荐的(http://nlp.stanford.edu/software/lex-parser.shtml)。如果有人知道关于NLP概念的好地方,请告诉我。谢谢! - Jizzoe
12年后:使用ChatGPTBard - Introspective
5个回答

7

简短回答:使用GATE

详细回答:您需要一些用于文本模式识别的工具。某种可以捕获以下模式的工具:

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

{Number}是数字,{Ingredient}取自食材字典,{Measure}则来自度量衡字典等等。

我所描述的模式与GATE的JAPE规则非常相似。使用它们可以捕捉匹配模式的文本,并为模式的每个部分(数字、食材、度量等)分配一些标签。然后提取标记文本并将其放入单个表格中。

我提到的字典可以用GATE中的Gazetteers表示。

因此,GATE可以满足您的所有需求。这不是最简单的起点,因为您将至少需要学习GATE的基础知识、JAPE规则和Gazetteers,但采用这种方法,您将能够获得真正好的结果。


1
你也可以尝试使用 Gexp。 然后,你需要编写规则,作为Java类,例如:
seq(Number, opt(Measure), Ingradient, opt(seq(token("("), Number, Measure, token(")")))

接下来,您需要添加一些组以捕获(group(String name, Matcher m))并提取模式的部分,并将此信息存储到表中。对于数字、度量单位,您应该使用类似的Gexp模式,或者我建议使用Ingradients中的词汇进行名词短语检测的浅层解析。


1

如果您不想接触NLP和机器学习的细节,有一些托管服务可以为您完成此操作:

如果你对细节感兴趣,纽约时报 写过一篇文章,介绍了他们如何解析他们的成分档案。他们公开了他们的代码,但很快就放弃了。我维护着最新版本的代码,并且我写了一些内容,介绍了我是如何现代化它的。

1

这基本上是自然语言解析。(你已经对鸡进行了词干提取。) 因此,它基本上是一个翻译过程。 幸运的是,上下文非常受限。

您需要支持性翻译,可以添加词典条目,调整语法规则并重试。

在这种情况下,简单的流程/工作流比算法更重要。 我对两个方面都很感兴趣。

如果您需要一个初始原型的编程帮手,请随时与我联系。我看到您已经相当有条理了。

不幸的是,我不知道适合的框架。您正在做一些事情,Mathematica想用其Alpha(自然语言命令产生结果)来完成。 数据挖掘?但是,通过手动适应过程进行简单的自然语言解析应该可以快速轻松地得出结果。


嗨,Joop。很想和你一起合作。虽然我没有自然语言处理的背景,但我认为斯坦福自然语言处理框架(http://nlp.stanford.edu/software/lex-parser.shtml)是一个不错的初始选择。此外,ffriend推荐的GATE也很有前途。 - Jizzoe
抱歉,我故意保持距离以让事情平息,但现在可能有点晚了。斯坦福自然语言处理看起来不错。如果我能参与其中,您可以通过 joop_ eggen at y a h oo de 联系我。 - Joop Eggen

0

你是否有访问标记语料库以训练统计模型的权限?这可能是最有成效的途径。你可以使用 epicurious.com 来构建一个语料库;爬取他们的食谱配料清单,这些清单都是你需要解析的散文形式,然后使用他们提供的“打印购物清单”功能,该功能以表格形式提供相同的配料清单。你可以使用这些数据来训练统计语言模型,因为你将拥有原始未标记的数据和大量示例的预期解析结果。

这可能比你想象中的项目更大,但我认为最终会产生比结构化自上而下解析方法更好的结果。


我认为食谱可能被结构化,以至于有限状态/启发式解决方案可能更容易完成这项任务。 - Fred Foo
更简单,但我认为使用一个好的语料库会得到更好的结果。不过这是一个很好的限制性问题 - 在自然语言中不可能更容易了。 - Mike Sokolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接