我有一套要求,我正在寻找最好的基于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 | - | |-----|---------|-------------|-------------------------|--------|-----------|--------------------------------|-------------|
请注意描述的多样性。有些东西是缩写的,有些则不是。有些数字是数字,有些数字是拼写出来的。
我会喜欢能完美解析/翻译的东西。但是,我会满足于开始时做得相当好的事情。
奖金问题:在提出策略/工具之后,你会怎么做呢?
谢谢!
乔
简短的回答。使用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中的单词对名词短语检测进行一些浅解析。
如果您不想接触NLP和机器学习的细节,那么有一些托管服务可以为您执行此操作:
如果你对细节感兴趣,纽约时报wrote about如何解析他们的成分档案。他们开源他们的代码,但很快就放弃了。我保持它的the most up-to-date version和我wrote a bit关于我如何现代化它。
您是否可以访问标记语料库来训练统计模型?这可能是这里最富有成效的途径。你可以使用epicurious.com建立一个;刮掉很多他们的食谱成分列表,这些是你需要解析的散文形式,然后使用他们有用的“打印购物清单”功能,它以表格格式提供相同的成分。您可以使用此数据来训练统计语言模型,因为您将同时拥有原始未标记数据和大量示例的预期解析结果。
这可能是一个比你想象的更大的项目,但我认为最终它会产生比结构化的自上而下解析方法更好的结果。