草庐IT

regex - 解析食谱的自然语言成分数量

coder 2025-05-11 原文

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

去年关闭。




Improve this question




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

我最初计划使用复杂的正则表达式,然后使用其他一些代码来转换人类可读的数字,例如 twofive转换成整数,最后的代码将转换为 1 cup3 teaspoons进入一些基础测量。我控制输入,所以我将实际成分分开。但是,我注意到用户输入了抽象测量值,例如 to taste1 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 之类的事情。和 leaves进入成分部分。但是,为了强制执行,我需要能够传达无效的内容。

我也不确定我应该将数量转换成什么“基础”度量。

这些是我的目标。
  • 能够扩展食谱。 任意测量单位,如packages不必缩放,而是精确的,如 cups或者ounces需要。
  • 找出“主要”成分。 在这个问题的背景下,这主要是通过弄清楚配方中最大的成分是什么来完成的。在生产中,必须有某种基于成分类型的修饰符,因为很明显,flour几乎从未被认为是“主要”成分。然而,chocolate可以少用,还可以说是chocolate cake .
  • 标准化输入。 为了在网站上保持一些一致性,我想保持一致的缩写。例如,代替 pounds ,应该是 lbs .
  • 最佳答案

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

    在弄清楚正则表达式是否足以 之前认识 数量,你应该让自己对它们的样子有一个很好的模式(语法)。您的示例如下所示:

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

    哪里<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 就会执行此操作。请注意,一汤匙是 either three or four tsp ,取决于国家。

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

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

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

    关于regex - 解析食谱的自然语言成分数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12413705/

    有关regex - 解析食谱的自然语言成分数量的更多相关文章

    1. Ruby 解析字符串 - 2

      我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

    2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    4. ruby - 用逗号、双引号和编码解析 csv - 2

      我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

    5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

      几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

    6. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

      简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

    7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

      ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

    8. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

      嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

    9. HBase Region 简介和建议数量&大小 - 2

      Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

    10. ruby - 用 YAML.load 解析 json 安全吗? - 2

      我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

    随机推荐