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

2022-09-04 22:14:42

我有一组要求,我正在寻找最好的基于Java的策略/算法/软件来使用。基本上,我想采用一组真实的人用自然英语输入的食谱成分,并将元数据解析为结构化格式(请参阅下面的要求,看看我正在尝试做什么)。

我在这里和其他地方四处寻找,但没有发现任何可以就接下来的方向提供高级建议。所以,我会把它给聪明的人:-):

解决此问题的最佳/最简单的方法是什么?我应该使用自然语言解析器,dsl,lucene / solr还是其他一些工具/技术?NLP似乎可以工作,但它看起来真的很复杂。我宁愿不花很多时间进行深入研究,只是为了发现它不能做我想要的东西,或者有一个更简单的解决方案。

要求

鉴于这些食谱成分描述....

  1. “8杯混合蔬菜(约5盎司)”
  2. “八条去皮鸡腿(约11/4磅)”
  3. “6.5汤匙特级初榨橄榄油”
  4. “约 6 盎司切成薄片的烟熏三文鱼,切成条状”
  5. “2只整鸡(每只3.5磅)”
  6. “每个冷冻切碎的菠菜20盎司,解冻”
  7. “5杯帕玛森芝士,磨碎”
  8. “约.5杯山核桃,烤熟,磨碎”
  9. “.5杯迪克西晚餐面包屑混合,平原”
  10. “8 瓣大蒜,切碎(4 茶匙)”
  11. “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              | -           |
|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|

请注意描述的多样性。有些东西是缩写的,有些不是。有些数字是数字,有些是拼写出来的。

我会喜欢一些能做完美解析/翻译的东西。但是,会满足于开始做一些做得相当好的事情。

奖励问题:在建议策略/工具后,您将如何去做?

谢谢!


答案 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规则非常相似。使用它们,您可以捕获与模式匹配的文本,并为模式的每个部分(数字,成分,度量等)分配一些标签。然后提取标记的文本并将其放入单个表中。

我提到的字典可以用GATE中的地名词典来表示。

因此,GATE可以满足您的所有需求。这不是最简单的开始方式,因为您至少必须学习GATE的基础知识,JAPE规则和地名词典,但是通过这种方法,您将能够获得非常好的结果。


答案 2

它基本上是自然语言解析。(你已经把鸡肉梗了。所以基本上这是一个翻译过程。幸运的是,上下文非常有限。

您需要一个支持性翻译,您可以在其中添加字典条目,调整语法规则,然后重试。

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

如果您需要初始原型的编程手,请随时与我联系。我确实看到了,你已经很有条理了。

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


推荐