解析食谱的自然语言成分数量[关闭]

2024-01-14

我正在构建一个红宝石配方管理应用程序,作为其中的一部分,我希望能够将成分数量解析为可以比较和缩放的形式。我想知道执行此操作的最佳工具是什么。

我最初计划使用一个复杂的正则表达式,然后使用一些其他代码来转换人类可读的数字,例如two or five转换为整数,最后是转换的代码1 cup and 3 teaspoons进入一些基本测量。我控制输入,所以我将实际成分分开。然而,我注意到用户输入抽象测量值,例如to taste and 1 package。至少对于抽象的测量,我认为我可以忽略它们并缩放并刮掉它们之前的任何数字。

这里还有一些例子

1 tall can
1/4 cup
2 Leaves
1 packet
To Taste
One
Two slices
3-4 fillets
Half-bunch
2 to 3 pinches (optional)

这其中有什么技巧吗?我注意到用户似乎对数量的构成有些困惑。我可以尝试执行更严格的规则并推动诸如tall can and leaves进入配料部分。然而,为了强制执行这一点,我需要能够传达无效内容。

我也不确定我应该将数量转换成什么“基本”测量值。

这些是我的目标。

  1. 能够扩展食谱。任意测量单位,例如packages不必按比例缩放,但要精确,例如cups or ounces需要。

  2. 找出“主要”成分。在这个问题的背景下,这主要是通过弄清楚配方中最大的成分是什么来完成的。在生产中,必须根据成分类型使用某种改性剂,因为显然,flour几乎从未被视为“主要”成分。然而,chocolate可以省用一下,还是可以说是chocolate cake.

  3. 标准化输入。为了保持网站的一致性,我想保持一致的缩写。例如,代替pounds, 它应该是lbs.


您提出了两个问题,识别/提取数量表达式(语法)并弄清楚它们的含义(语义)。

在你弄清楚正则表达式是否足以认出对于数量,您应该为自己建立一个良好的架构(语法)来了解它们的外观。你的例子看起来像这样:

<amount> <unit> [of <ingredient>]

where <amount>可以采取多种形式:

whole or decimal number, in digits (250, 0.75)
common fraction (3/4)
numeral in words (half, one, ten, twenty-five, three quarters)
determiner instead of a numeral ("an onion")
subjective (some, a few, several)

金额也可以表示为两个简单的范围<amount>s:

two to three
2 to 3
2-3
five to 10

然后你就有了单位本身:

general-purpose measurements (lb, oz, kg, g; pounds, ounces, etc.)
cooking units (Tb, tsp)
informal units (a pinch, a dash)
container sizes (package, bunch, large can)
no unit at all, for countable ingredients (as in "three lemons")

最后,有一种特殊情况的表达式永远不能与金额或单位组合,因此它们有效地充当两者的组合:

a little
to taste

我建议将其视为一个小型解析器,您可以根据需要将其制作得尽可能详细或粗糙。如果这是您选择的工具,那么为所有这些编写正则表达式应该不会太难,但正如您所见,这不仅仅是文本替换的问题。将零件拉出来并将每种成分表示为三元组(amount, unit, ingredient)。 (对于可数,使用特殊单位“件”或其他单位;对于“一点”之类的,我将它们视为特殊单位)。

这就留下了一个问题转换或比较数量。很多地方都进行了单位换算,因此至少对于官方单位,您应该可以轻松获取换算表。例如,如果您输入“将 4 盎司转换为克”,Google 就会执行此操作。请注意,一汤匙是三茶匙或四茶匙 http://www.asknumbers.com/TablespoonToTeaspoon.aspx,取决于国家/地区。

对于明确定义的单位,您可以很容易地标准化为您最喜欢的单位,但非正式单位有点棘手。对于“捏”、“破折号”等,我建议找出大概的重量,以便您可以正确缩放(十捏 = 2 克,或其他)。罐头之类的东西是没有希望的,除非你能查到特定产品的尺寸。

另一方面,主观量是最简单的:如果你将“品尝”扩大十倍,它仍然是“品尝”!

最后一个想法:还需要某种成分数据库认识主要成分,因为大小很重要:“一个鸡蛋”可能不是主要成分,但“一只小山羊,切成四等分”很可能是。我会考虑将其用于版本 2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析食谱的自然语言成分数量[关闭] 的相关文章

  • 正则表达式提取大括号之间的文本

    我正在尝试提取 PHP 中花括号之间的文本 例如 欢迎 user first name 使用 site 版本 1 5 您的用户名 是 user username 您目前的声誉是 user reputation name 我用过 在某些情况下
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • 正则表达式:如果字符串包含空格则不匹配

    仅当字符串不包含空格时 我似乎无法找出匹配字符串的正则表达式模式 例如 this has whitespace match some pattern 应该返回nil but nowhitespace match some pattern 应
  • 未签出...捆绑安装无法修复帮助!

    https github com intridea omniauth git at master is not checked out Please run bundle install Bundler GitError 那我该怎么办 捆绑
  • 默认更新嵌套属性

    我尝试更新 iProduction 这是生产中的嵌套表单 但此行出现参数错误 参数数量错误 0 代表 1 生产 update iproducts attributes cow id cow 我的创作动作制作 def create produ
  • Perl 正则表达式匹配模式的多个实例并替换

    我有一个看起来像这样的字符串 abc 1 2 3 something here foo 10 6 34 somethingelse here def 1 2 another 我想将此字符串拆分为一个数组 其中包含 abc 1 2 3 som
  • 限制正则​​表达式中的字符长度

    有没有办法限制正则表达式 http en wikipedia org wiki Regular expression最多 100 个字符with正则表达式 size size So Look at me 行不通的 我想限制数量 只允许 1
  • 如何在 Perl 中找到正则表达式匹配的位置?

    我需要编写一个接收字符串和正则表达式的函数 我需要检查是否有匹配并返回匹配的开始和结束位置 正则表达式已经由qr 该函数还可能收到一个 全局 标志 然后我需要返回所有匹配的 开始 结束 对 我无法更改正则表达式 甚至无法添加 用户可能使用的
  • 正则表达式等价

    有没有办法找出两个任意正则表达式是否等价 对我来说看起来很复杂的问题 但可能有一些 DFA 简化机制之类的 要测试等价性 您可以计算的表达式并进行比较
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • 在 Rails 中强制内联渲染 PDF 文档

    我正在编写一个从一组 XML 文件生成 PDF 文件的服务 正在正确生成 PDF 但是 每次我单击 查看 PDF 链接时 浏览器都会要求用户下载 PDF 文件 我需要 PDF 内联显示 就像任何常规 HTML 页面一样 我虽然我写的代码是正
  • 优化正则表达式以过滤数千个 HTML 选择选项

    背景 我开发了一个基于 jQuery 的穿梭小部件 https stackoverflow com a 13557000 59087对于 HTMLselect元素 因为我找不到一个经过最低限度编码并提供正则表达式过滤器来补偿的元素变音符号
  • R正则表达式获取第二个下划线之前的所有文本

    s lt 1 343 43Hello 2 323 14 fdh 99H 在 R 中 我想使用正则表达式来获取第二个下划线之前的子字符串 如何使用一个正则表达式来完成此操作 另一种方法是用 分割 然后粘贴前两个 一些东西 paste sapp
  • 所有语言中特殊字符的 Java 正则表达式

    在我的用户输入字段中 我想允许某些特殊字符 字母和数字的组合 我应该确保正则表达式模式在输入时允许此设置任何语言 基本上我构建的这个正则表达式也应该支持 unicode 表示 如何使用 Java 中的 Pattern 类来实现这一点 这里给
  • 标点符号的Javascript正则表达式(国际)?

    我需要一个正则表达式来匹配所有标点符号 例如标准的 但包括国际标记 例如颠倒的西班牙语问号 中文句点等 我的 google fu 即将到来 有谁手头有这样一个与Javascript兼容的正则表达式吗 添加到 stema的答案 https s
  • Rails 中的 plusDomains.circles.addPeople 的 Google API 产生 403 Forbidden

    Using Google API Ruby 客户端 https github com google google api ruby client class GooglePlus def self follow contact contac
  • PCRE 匹配 C 中的所有组

    我想使用 PCRE C 库递归地匹配一个组 e g pattern d subject 5 6 3 2 OVECCOUNT 30 pcrePtr pcre compile pattern 0 error erroffset NULL rc
  • 了解 Ruby 的加载路径

    我有点困惑为什么我的项目无法加载它需要的文件 这是一个非常简单的项目树 processor bin lib processor rb processor mapper rb reducer rb and my processor rb文件看
  • 检查 Float 是否等于 Ruby 中的整数值

    假设我有以下代码 x 0 8 y 1 0 最好的检查方法是什么y相当于Integer 目前我正在做 y to int y 这可行 但我觉得应该有更好的方法 You mod值为 1 并检查该值是否等于 0 if y 1 0
  • 是否可以使用 Eclipse 的正则表达式搜索和替换转换为小写?

    我已经尝试过 L 但它似乎不是其语法的一部分 并且它的帮助没有提及任何可用的转换 我知道我可以并且知道如何从命令行执行此操作 但是 是否可以使用 Eclipse 的正则表达式搜索和替换进行大小写转换 您可以分两步完成 首先插入小写字母 那么

随机推荐