我有一系列要求,我正在寻找最好的基于Java的策略/ algorthm /软件。基本上,我想采用自然英语中真实人物输入的一组配方成分,并将元数据解析为结构化格式(请参阅下面的要求以了解我正在尝试做什么)。
我在这里和其他地方环顾四周,但没有找到任何可以提供关于后续方向的高级建议。所以,我会把它交给聪明的人: - ):
解决此问题的最佳/最简单方法是什么?我应该使用自然语言解析器,dsl,lucene / solr或其他一些工具/技术吗? NLP似乎可能有效,但它看起来非常复杂。我宁愿不花费大量时间进行深度潜水,只是为了发现它不能做我正在寻找的东西或者有一个更简单的解决方案。
鉴于这些食谱成分说明......
我想把它变成这个......
|-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------| | | 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 | - | |-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|
请注意描述的多样性。有些东西是缩写的,有些则不是。有些数字是数字,有些数字是拼写出来的。
我会喜欢能完美解析/翻译的东西。但是,我会满足于开始做得相当好的事情。
奖金问题:在提出策略/工具之后,你会怎么做呢?
谢谢!
乔
答案 0 :(得分: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 :(得分:1)
它基本上是自然语言解析。 (你确实已经遏制了鸡肉。) 所以基本上它是一个翻译过程。 幸运的是,背景非常有限。
您需要一个支持性翻译,您可以在其中添加字典条目,调整语法规则并重新尝试。
在这种情况下,简单的流程/工作流程比算法重要得多。 我对这两方面都很感兴趣。
如果您需要编程手来获取初始原型,请随时与我联系。我确实看到了,你已经完成了相当有条理的工作。
不幸的是我不知道适合框架。你正在做一些事情,Mathematica想要用它的Alpha(自然语言命令产生结果)。 数据挖掘?但是,使用手动自适应过程进行简单的自然语言分析可以提供快速简便的结果。
答案 2 :(得分:1)
您也可以尝试Gexp。 然后你必须把规则写成Java类,如
seq(Number, opt(Measure), Ingradient, opt(seq(token("("), Number, Measure, token(")")))
然后你必须添加一些组来捕获(group(String name, Matcher m)
)和extrat部分模式并将这些信息存储到表中。
对于Number,Measure你应该使用类似的Gexp模式,或者我建议用Ingradients中的单词对名词短语检测进行一些Shallow解析。
答案 3 :(得分:1)
如果您不想接触NLP和机器学习的本质,有一些托管服务可以为您做到这一点:
如果您对具体内容感兴趣,那么纽约时报 wrote about他们将如何解析其成分档案。他们开源了代码,但不久后就放弃了。我维护the most up-to-date version,并wrote a bit进行现代化改造。
答案 4 :(得分:0)
您是否可以访问标记语料库来训练统计模型?这可能是这里最富有成效的途径。你可以使用epicurious.com建立一个;刮掉很多他们的食谱成分列表,这些是你需要解析的散文形式,然后使用他们有用的“打印购物清单”功能,它以表格格式提供相同的成分。您可以使用此数据来训练统计语言模型,因为您将同时拥有原始未标记数据和大量示例的预期解析结果。
这可能是一个比你想象的更大的项目,但我认为最终它会产生比结构化的自上而下解析方法更好的结果。