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

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(使用前将#替换为@)

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

  • Python:如何检索每年的谷歌学术引用?

    我正在尝试从 Google Scholar 个人资料中检索信息 我有url from bs4 import SoupStrainer BeautifulSoup from urllib2 import Request urlopen url
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 导入数据期间解析日期格式的最佳方法

    我创建了在数据导入 400 K 记录 期间解析视图不同日期格式的方法 我的方法捕获 ParseException 并尝试在不同时使用下一种格式解析日期 问题 在数据导入期间设置正确的日期格式是更好的方法 更快 吗 private stati
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 无痛“算法分析”培训? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学时曾有过一次关于 算法分析 课程的痛苦经历 但最近发现在大学中需要它真实世界 无论如何 我正在
  • 添加一个新列,其中标签附加到新月形数字

    我想添加一个新列 给出一个常量标签 并逐行附加新月数字逻辑 我的输入 position work chr1 jil2001 chr4 jil2001 chr3 kou2009 chr9 nai2012 chr7 fandis2005 我的预
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • Android 软键盘先显示数字视图

    我的应用程序上有一个登录屏幕 它接受 CPF 作为登录名 CPF 是每个巴西公民都有的唯一号码标识 例如 10546819546 但它也可以接受护照号码作为登录名 并且上面可能有字母 我的问题是我希望键盘在弹出时在默认字母表之前显示数字 符
  • 将聊天文本中的成对符号替换为 html 标签,以设置粗体、斜体和删除线样式

    我正在尝试制作 Whatsapp 风格的文本帖子 当用户创建这样的文本时 Hi how are you where are you 然后这个文本会像这样自动改变 Hi你好吗你在哪 我知道我可以使用 php 正则表达式来做到这一点 如下所示
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • VBA:访问 JSON

    我正在处理 VBA 投影 但不确定如何访问此 JSON 中的 id 应该将 players 设置为什么才能在循环中获取 id 我已经用更多代码更新了问题 JSON event games players id 182759 Code Pri
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3

随机推荐

  • 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 二十一