如何从写成单词的数字中读取值?

2023-11-26

众所周知,数字可以用数字来书写,也可以用名称来称呼。虽然有很多将 123 转换为 123 的示例,但我找不到如何将其反向转换的好示例。

一些注意事项:

  1. 基数/名义或序数:“一”和“第一”
  2. 常见的拼写错误:“四十”/“四十”
  3. 数百/千:2100 ->“二十一百”以及“两千一百”
  4. 分隔符:“1152”,也可以是“1152”或“1152”等等
  5. 俗语:“三十多岁”
  6. 分数:“三分之一”、“五分之二”
  7. 常用名称:“一打”、“一半”

可能还有更多尚未列出的警告。 假设算法需要非常鲁棒,甚至能够理解拼写错误。

我应该阅读哪些领域/论文/研究/算法来学习如何编写所有这些内容? 信息在哪里?

PS:我的最终解析器实际上应该理解 3 种不同的语言:英语、俄语和希伯来语。也许在稍后阶段会添加更多语言。希伯来语也有男性/女性数字,例如“一个男人”和“一个女人”有不同的“一”——“ehad”和“ahat”。俄语也有其自身的复杂性。

谷歌在这方面做得很好。例如:

http://www.google.com/search?q=two+thousand+and+one+hundred+plus+ Five+dozen+and+four+fifths+in+decimal

(反过来也是可以的http://www.google.com/search?q=999999999999+in+english)


我正在使用 PEG 解析器来完成您想要的操作(稍后可能会将其作为单独的答案发布),当时我注意到有一个非常简单的算法,可以很好地处理英语、西班牙语和阿拉伯语中常见的数字形式。至少是德语。

例如,使用英语时,您需要一个字典,以明显的方式将单词映射到值:

"one" -> 1, "two" -> 2, ... "twenty" -> 20,
"dozen" -> 12, "score" -> 20, ...
"hundred" -> 100, "thousand" -> 1000, "million" -> 1000000

...等等

算法就是:

total = 0
prior = null
for each word w
    v <- value(w) or next if no value defined
    prior <- case
        when prior is null:       v
        when prior > v:     prior+v
        else                prior*v
        else
    if w in {thousand,million,billion,trillion...}
        total <- total + prior
        prior <- null
total = total + prior unless prior is null

例如,其进展如下:

total    prior      v     unconsumed string
    0      _              four score and seven 
                    4     score and seven 
    0      4              
                   20     and seven 
    0     80      
                    _     seven 
    0     80      
                    7 
    0     87      
   87

total    prior      v     unconsumed string
    0        _            two million four hundred twelve thousand eight hundred seven
                    2     million four hundred twelve thousand eight hundred seven
    0        2
                  1000000 four hundred twelve thousand eight hundred seven
2000000      _
                    4     hundred twelve thousand eight hundred seven
2000000      4
                    100   twelve thousand eight hundred seven
2000000    400
                    12    thousand eight hundred seven
2000000    412
                    1000  eight hundred seven
2000000  412000
                    1000  eight hundred seven
2412000     _
                      8   hundred seven
2412000     8
                     100  seven
2412000   800
                     7
2412000   807
2412807

等等。我并不是说它是完美的,但对于快速和肮脏的情况来说,它做得相当好。


在编辑时处理您的特定列表:

  1. 基数/名义或序数:“一”和“第一”--只需将它们放入字典中即可
  2. 英语/英国语:“四十”/“四十”--ditto
  3. 数百/数千: 2100 -> “二十一百”还有“两千一百”——按原样工作
  4. 分隔符:“1152”,也可以是“1152”或“1152”等等——只需将“下一个单词”定义为与已定义单词匹配的最长前缀,或者如果没有,则定义为下一个非单词,作为开始
  5. 口语:“三十多岁”——works
  6. 片段:“三分之一”、“五分之二”--呃,还没……
  7. 通用名称:“一打”、“一半”——作品;你甚至可以做“六打”之类的事情

数字 6 是唯一一个我没有现成答案的问题,这是因为序数词和分数之间的歧义(至少在英语中),再加上我最后一杯咖啡是many几个小时前。

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

如何从写成单词的数字中读取值? 的相关文章

  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • 使用 PEG.js 忽略空格

    我想忽略空格 and 新线路按照我的语法 所以它们在PEG js http pegjs majda cz online输出 此外 括号内的文字应在新数组中返回 Grammar start a sep cat dog sep sep stmt
  • 直观地执行不同的排序算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 数组中最远的相等元素

    假设你有一个未排序的数组 你如何找到两个相等的元素 使它们成为数组中最远的元素 例如8 7 3 4 7 5 3 9 3 7 9 0ans 将是7 9 7 1 8 我想到了以下几点 initialise max 0 using hashing
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 池化与随时间池化

    我从概念上理解最大 总和池中发生的情况作为 CNN 层操作 但我看到这个术语 随时间变化的最大池 或 随时间变化的总和池 例如 用于句子分类的卷积神经网络 https arxiv org pdf 1408 5882 pdfYoon Kim
  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 尝试解解析 json 字符串,但得到 Expected start of the object '{', but had 'EOF' 相反

    我正在尝试使用 kotlin 可序列化将 json 文件解析为列表 这是我的数据类 Serializable data class Book val epub String val fb2 String val mobi String va
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • 如何在 JavaScript 中构建树模式匹配算法?

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • JavaScript 中的正则表达式用于验证十进制数字

    我想要 JavaScript 中的正则表达式来验证十进制数字 它最多只允许两位小数 例如 它应该允许10 89但不是10 899 它还应该只允许一个句点 例如 它应该允许10 89但不是10 8 9 尝试使用以下表达式 d d 0 2 如果
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现

随机推荐

  • Tensorflow:如何在新图中使用预训练权重?

    我正在尝试使用 CNN 和 python 框架使用张量流构建一个对象检测器 我想首先训练我的模型仅进行对象识别 分类 然后使用预训练模型的几个卷积层训练它来预测边界框 我需要替换全连接层 可能还需要替换一些最后的卷积层 所以 出于这个原因
  • Windows 上出现“OverflowError:Python int 太大,无法转换为 C long”,但 Mac 上则不然

    我在 Windows 和 Mac 上运行完全相同的代码 使用 python 3 5 64 位 在 Windows 上 它看起来像这样 gt gt gt import numpy as np gt gt gt preds np zeros 1
  • C++ #ifndef 用于包含文件,为什么头文件全部大写?

    我想知道为什么后面的名字 ifndef指令始终全部大写并且似乎与实际头文件的名称不匹配 与此相关的规则是什么 我一直在网上查找 但没有找到任何解释 如果我的头文件名为 myheader h 就可以使用 ifndef MYHEADER 如果是
  • 显示/隐藏 div 并带有向左\向右滑动动画

    我在这里尝试过 http jsfiddle net 92HXT 1 但它不起作用 仅当我使用时才有效show slow hide slow Thanks 虽然不是最清晰的动画 但我通过找到父级并隐藏所有兄弟姐妹 使其能够按照我认为您想要的方
  • 如何判断对象是否在 NSArray 中?

    有没有办法判断某个对象是否在 NSArray 中 我向数组添加对象的方式使得可以多次添加同一个对象 我想看看是否有办法查看它是否已经存在于该数组中 任何位置 NSArraycontainsObject 方法正是为了这个目的 它的完整签名是
  • 如何自定义UIActivityViewController共享菜单的示例?

    有没有例子说明如何定制UIActivityViewController用我自己的图标分享菜单IBAction 我见过这个 id initWithActivityItems NSArray activityItems applicationA
  • Spark Streaming:StreamingContext不读取数据文件

    我是 Spark Streaming 的新手 我正在尝试使用 Spark shell 开始使用它 假设我在spark 1 2 0 bin hadoop2 4的根目录下放置了一个名为 dataTest 的目录 我想在 shell 中测试的简单
  • Service Worker 中的 XMLHttpRequest

    我正在尝试在 chrome 上创建一个推送通知系统 我有一个从 mysql 获取数据并回显 JSON 的 php 现在我想调用一个函数 getJsonCode 当推送通知到达时它会被激活并读取 JSON 数据 在我的 Service Wor
  • 如何手动将 Angular 表单字段设置为无效?

    我正在处理登录表单 如果用户输入无效凭据 我们希望将电子邮件和密码字段标记为无效 并显示一条消息 提示登录失败 如何从可观察的回调中将这些字段设置为无效 模板
  • Hibernate 忽略 fetchgraph

    这是我的实体 public class PersonItem implements Serializable Id Column name col1 private String guid Column name col2 private
  • 如何通过将值与公共键相加来从字典列表创建单个Python字典?

    我有一个字典列表 例如 dictList a 3 b 9 c 4 a 9 b 24 c 99 a 10 b 23 c 88 所有字典都有相同的键 例如a b c 我希望创建一个具有相同键的字典 其中的值是原始列表中所有字典中具有相同键的值的
  • 如果没有输入,一定时间后退出循环

    我只是想知道是否可能以及如何实现此功能 如果没有用户输入 我们将退出循环 例如 如果用户在 1 分钟后没有输入任何内容 我想退出循环 这是我的 C 代码 include
  • 如何直接链接到应用商店应用更新页面?

    我正在完成一个 iPhone 应用程序 我使用外部服务器通知用户我的应用程序何时有可用更新 并允许他们从应用程序内单击以直接转到应用程序商店中的更新 问题是 我似乎无法弄清楚直接转到更新的链接格式 我发现了一种旧的使用方法查看软件更新 在另
  • 在 javascript 中使用另一个 fetch 中的 fetch

    我想获取一个 api 然后调用另一个 api 在 javascript 中使用这样的代码是否明智 fetch url method get then function response response json then function
  • 新 Twitter API 1.1 的身份验证

    我有一个应用程序需要显示关注者和关注者的数量 users show json 对于公共页面上的随机用户 不需要身份验证 使用 Twitter API 1 0 这非常容易 因为请求不需要身份验证 使用新的 Twitter API 1 1 不再
  • Sql Server FILESTREAM 总文件大小

    是否有一个查询可以获取磁盘上 FILESTREAM 文件夹中文件的总文件大小 以下查询将返回以字节为单位的长度filestreamcolumn column SELECT SUM DATALENGTH filestreamcolumn FR
  • 使用另一个对象更新 javascript 对象,但仅更新现有的键

    Javascript 或 Lodash 中是否有一个函数 我可以在其中使用另一个对象的值 更新 一个对象 但是无需添加新密钥 var foo a 0 b 1 var bar b 2 c 3 像 update foo bar 一样 覆盖 更新
  • JAX-RS - 没有根节点的 JSON

    我有一个宁静的网络服务 响应是 cities id 1 name City 01 state A1 id 2 name City 02 state A1 但我想要这个 id 1 name City 01 state A1 id 2 name
  • JOptionPane 输入到 int

    我试图让 JOptionPane 获取输入并将其分配给 int 但我遇到了变量类型的一些问题 我正在尝试这样的事情 Int ans Integer JOptionPane showInputDialog frame Text JOption
  • 如何从写成单词的数字中读取值?

    众所周知 数字可以用数字来书写 也可以用名称来称呼 虽然有很多将 123 转换为 123 的示例 但我找不到如何将其反向转换的好示例 一些注意事项 基数 名义或序数 一 和 第一 常见的拼写错误 四十 四十 数百 千 2100 gt 二十一