不同场景下的中文汉字转阿拉伯数字

不同场景下的中文汉字转阿拉伯数字

在上一期[DLdigest-19] 不同场景下文本中的阿拉伯数字转中文汉字中,我写了如何在不同场景下将一个句子中的阿拉伯数字转化成中文汉字,如果说那个转换是为了在语音识别中更好地训练声学模型的话,那么今天要讲的将一个句子中的中文汉字转化成阿拉伯数字则是为了在语音识别解码的时候更好地方便读者阅读。

我们今天要转换的样本句子如下:

二零一八年十二月

我今年十八岁

苹果二十点五八斤

五亿四千万

五亿零二十

五亿四千万三千

一千零一

五岁

可以看到,这里我们遇到了三种不同的情景,一种是简单的字符直接朗读,一种是浮点数,还有一种是整数,这三种都是非常常见的使用场景。

对于第一种情景,具体情况比较容易想到的有两种,一种是用于表示年份,另外一种则是浮点数小数点后面数字的读法,都是直接读数字的方式。用代码写出来如下:

 

而对于整数和浮点数,处理方法类似,我们需要找出它们的共同规律,如对于整数或者浮点数的整数部分,通常有十百千万亿这几个数量单位,而万和亿又可以被十百千来修饰,因此,我们可以发现,亿前面的修饰数和万前面的修饰数与万后面的数的转化方法是一样的,也就是转化小于10000的数。

首先,我们写出转化小于10000的数的算法,即获取该数的个位、十位、百位和千位,这部分算法的代码如下:

 

获取完每个位上的数字以后,我们直接把它们拼接起来即可:

 

把转换小于10000的数的算法写好以后,剩下来的任务就是处理包含亿或包含万的数了。我们从单位比较大的开始,首先提取亿前面的修饰数并利用上面的算法转换成数字,对于亿后面的汉字,如果为空字符串,那么直接加上8个0即可;如果不是空字符串,再看看是否包含万,而对于万的处理,也是和对于亿的处理方法完全一致。需要注意的是,亿后面必须有8位数字,万后面必须有四位数字,如果转换的数字位数没有达到这个要求,需要中间用0去补充。这部分代码如下:

 

另外,上面有一个函数_check_whether_special,这个函数的作用有两个,一个是转换个位数,另一个作用是转换像2018年这种情况,即直接朗读的数。

最后我们写好运行示例句子的测试代码,并得到运行结果:

 

程序运行结果如下:

原句子: 二零一八年十二月

新句子: 2018年12月

原句子: 我今年十八岁

新句子: 我今年18岁

原句子: 苹果二十点五八斤

新句子: 苹果20.58斤

原句子: 一千零一

新句子: 1001

原句子: 五岁

新句子: 5岁

深度学习每日摘要|坚持技术,追求原创

微信ID:deeplearningdigest

  • 发表于: 2018-03-04
  • 原文链接:http://kuaibao.qq.com/s/20180304G0Q3LF00?refer=cp_1026
posted @ 2021-01-04 17:36  CharyGao  阅读(269)  评论(0编辑  收藏  举报