Code Monkey home page Code Monkey logo

chinese2digits's Introduction

也许是最好的汉字数字(中文数字)-阿拉伯数字转换工具

The Best Tool of Chinese Number to Digits

Chinese2digits 是一个将中文数字(大写数字) 转化为阿拉伯数字的工具。这个工具是自然语言处理系统(NLP)中非常重要的组件。常见的应用场景有:聊天机器人,知识图谱,OCR(光学字符识别)系统,等等。

Chinese2digits is tool that transfer the Numbers writen in Capital Chinese to digits number. This tool is a vital component of NLP system such as: chat robot, knowledge graph, and OCR system etc.

用例: example:

输入: 啊啦啦啦300十万你好我20万.3%万你好啊300咯咯咯-.34%啦啦啦300万
输出: takeNumberFromString 方法
{
	'inputText': '啊啦啦啦300十万你好我20万.3%万你好啊300咯咯咯-.34%啦啦啦300万', 
	'replacedText': '啊啦啦啦300.0.0100000.0你好我200000.030.0你好啊300.0.0咯咯咯-0.0034啦啦啦300.0.00000.0', 
	'CHNumberStringList': ['300', '十万', '20万', '.3%万', '300', '-.34%', '300万'], 
	'digitsStringList': ['300.0', '100000.0', '200000.0', '30.0', '300.0', '-0.0034', '3000000.0']
}

输入:伍亿柒仟万拾柒今天天气不错百分之三亿二百万五啦啦啦啦负百分之点二八你好啊三万二
输出:TakeChineseNumberFromString 方法
{
    'inputText': '伍亿柒仟万拾柒今天天气不错百分之三亿二百万五啦啦啦啦负百分之点二八你好啊三万二',
    'replacedText': '570000017今天天气不错3020050.0啦啦啦啦-0.0028你好啊32000',
    'CHNumberStringList': ['五亿七千万十七', '百分之三亿二百万五', '负百分之点二八', '三万二'],
    'digitsStringList': ['570000017', '3020050.0', '-0.0028', '32000']
}

takeNumberFromString 方法和 takeChineseNumberFromString (go 语言第一个字母大写)的主要不同在于:

takeNumberFromString会将"300三十二" 识别成2个数字"300" 和"32"; 但是 takeChineseNumberFromString 会将该数字只提取"32"。 因为纯罗马数字提取。

但是,2个方法"都会"将 300万 提取成 3000000, 因为这个只是中文数字表达的变种模式!

Pyhon 语言代码示例

Pyhon Example

安装

setup

pip install chinese2digits

使用

usage

import chinese2digits as c2d

#混合提取
print(c2d.takeNumberFromString('啊啦啦啦300十万你好我20万.3%万你好啊300咯咯咯-.34%啦啦啦300万'))
print(c2d.takeChineseNumberFromString('负百分之点二八你好啊百分之三五是不是点伍零百分之负六十五点二八'))

#将百分比转为小数
print(c2d.takeDigitsNumberFromString('234%lalalal-%nidaye+2.34%',percentConvert=True))


#案例

{'inputText': '啊啦啦啦300十万你好我20万.3%万你好啊300咯咯咯-.34%啦啦啦300万', 'replacedText': '啊啦啦啦300.0.0100000.0你好我200000.030.0你好啊300.0.0咯咯咯-0.0034啦啦啦300.0.00000.0', 'CHNumberStringList': ['300', '十万', '20万', '.3%万', '300', '-.34%', '300万'], 'digitsStringList': ['300.0', '100000.0', '200000.0', '30.0', '300.0', '-0.0034', '3000000.0']}

{'inputText': '234%lalalal-%nidaye+2.34%', 'digitsNumberStringList': ['2.34', '0.0234']}

{'inputText': '百分之四百三十二万分之四三千分之五', 'replacedText': '4.320.00430.005', 'CHNumberStringList': ['百分之四百三十二', '万分之四三', '千分之五'], 'digitsStringList': ['4.32', '0.0043', '0.005']}

{'inputText': '伍亿柒仟万拾柒今天天气不错百分之三亿二百万五啦啦啦啦负百分之点二八你好啊三万二', 'replacedText': '570000017今天天气不错3020050.0啦啦啦啦-0.0028你好啊32000', 'CHNumberStringList': ['五亿七千万十七', '百分之三亿二百万五', '负百分之点二八', '三万二'], 'digitsStringList': ['570000017', '3020050.0', '-0.0028', '32000']}

{'inputText': 'llalala万三威风威风千四五', 'replacedText': 'llalala0.0003威风威风0.045', 'CHNumberStringList': ['万三', '千四五'], 'digitsStringList': ['0.0003', '0.045']}

{'inputText': '哥两好', 'replacedText': '哥两好', 'CHNumberStringList': [], 'digitsStringList': []}

{'inputText': '伍亿柒仟万拾柒百分之', 'replacedText': '570000017百分之', 'CHNumberStringList': ['五亿七千万十七'], 'digitsStringList': ['570000017']}

{'inputText': '负百分之点二八你好啊百分之三五是不是点五零百分之负六十五点二八', 'replacedText': '-0.0028你好啊0.35是不是0.50-0.6528', 'CHNumberStringList': ['负百分之点二八', '百分之三五', '点五零', '百分之负六十五点二八'], 'digitsStringList': ['-0.0028', '0.35', '0.50', '-0.6528']}

Go 语言代码示例

GoLang Example

package main

import (
	"fmt"
	"./chinese2digits"
)

func main() {
	fmt.Println(chinese2digits.TakeNumberFromString("伍亿柒仟万拾柒今天天气不错百分之三亿二百万五啦啦啦啦负百分之点二八你好啊三万二"))
	fmt.Println("输入:伍亿柒仟万拾柒今天天气不错百分之三亿二百万五啦啦啦啦负百分之点二八你好啊三万二")
	fmt.Println("输出:TakeChineseNumberFromString 方法")
}

Rust 语言代码示例

Rust Example

安装

Setup

添加如下代码到

Add this to your Cargo.toml:

[dependencies]
chinese2digits = "1"

使用

Usage

use chinese2digits::take_number_from_string;

//混合提取
let string_example = "百分之5负千分之15".to_string();
//第二个开关为 百分比转换开关,是否把百分号转换为小鼠  第三个开关为繁体转简体强制开关,是否强制转换
let test_result = take_number_from_string(&string_example, true, true);
assert_eq!(test_result.replaced_text, "0.05-0.015");
assert_eq!(test_result.ch_number_string_list, vec!["百分之5", "负千分之15"]);
assert_eq!(test_result.digits_string_list, vec!["0.05", "-0.015"]);

更新时间

Update Time

2023-03-26

  • 修复 一兆韦德 bug "兆" 不做普通 单位识别,
  • 修复 二〇二三 bug 可以正确识别为2023

2021-11-22

  • RUST 版本上线!!
  • 重大优化:重构一些核心算法,提升计算效率

2021-11-10

  • 修复小数点右边出现零零三四的情况,可以正确转换 三百十四点零零三四 为 340.0034
  • 增加单元测试用例

2020-11-19

  • 修复Bug:无法处理 1.55万这种

2020-11-02

  • 重大更新及接口更新
  • 不再需要simpilify 规则 可以识别更加复杂的混合 四百三十儿分之43 30万2千这种
  • 修复bug: 判断当前的汉字 与后一个提取的汉子数字 是否是连续的在原始字符串出现的,如果非连续 就出现了问题 比如 7分之前三四五
  • 4分之三 4百分之一 混合识别及减少误识别
  • 升级正则, 提供一个混合提取的正则表达式
  • 七点十分之前 不会误识别
  • 最后的.0 去掉 精确地展示整数
  • Go语言精简接口
  • 增加单元测试方法 方便开发

2020-05-31

  • 升级可以识别万分之10 这种汉字数字混合
  • Go语言正则升级

2019-12-25

  • 升级可以识别300万 .3千 .50%万 数字汉字混合识别
  • 将所有汉字数字与罗马数字提取
  • 新增方法 takeNumberFromString,一次性地将所有罗马,中文,罗马中文混合数字全部提取

2019-12-9

  • 更新正则引擎,采用RE2规则,不会出现长文本的递归炸弹
  • go语言也有正则引擎
  • 完成万三,千四五这种简称识别

2019-11-27

  • 修复 四千三  五亿七千万十七 等简写单位的识别
  • 增加 繁体简体转换
  • 解决 两,俩识别问题

2019-10-07

  • 解决 一千八百万的识别问题 即多个单位的组合和跨越组合

2019-06-02

  • 提交到PIP 可以使用pip 安装

2019-02-22

  • 用Python3 重写了算法 并增加了 正则切割引擎

2018-07-26

  • 增加千千万万  万科 这种不合法词汇的校验

2018-07-07

  • 首次提交

TODO

  • 两千二,三千十四 非标准表述
  • 繁体简体转换
  • 万三,千四五词汇的理解和转换
  • 正则引擎升级,使用顺序逻辑引擎,使用GO语言默认的正则库
  • 数字汉字混合模式:300万
  • 将所有汉字数字与罗马数字提取
  • 新增方法 takeNumberFromString,一次性地将所有罗马,中文,罗马中文混合数字全部提取
  • RUST 版本上线

好用记得Fork and Star。

If you need the code in JavaScript,just send me message, fork and star~~

License

chinese2digits is licensed under the Apache License 2.0.

chinese2digits's People

Contributors

wall-ee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

chinese2digits's Issues

有内存泄露的问题和一些BUG

您好!您的工具非常好用 ,但是我在用的时候会出现内存泄露(一直往上涨)的问题。另一方面,如果出现“X(中文)分之X(阿拉伯)(如十分之3,百分之3)”会报错,代码会报错来着...

无法识别300万

digits+chinese混合的情况还是挺常见的,这种数字暂时还不能识别。

互转功能

您好!希望能够提供数字和中文的互转功能。谢谢!

无法导入chinese2digits.c2d,应该怎样解决?

Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from chinese2digits import c2d

ImportError Traceback (most recent call last)
in
----> 1 from chinese2digits import c2d

ImportError: cannot import name 'c2d' from 'chinese2digits' (c:\python\lib\site-packages\chinese2digits_init_.py)

安装后不能导入

D:\>pip show chinese2digits
Name: chinese2digits
Version: 1.0
Summary: 最好的汉字数字(中文数字)-阿拉伯数字转换工具。包含"点二八""负百分之四十"等众多汉语表达方法。NLP,机器人工程必 备! The Best Tool of Chinese Number to Digits
Home-page: https://github.com/Wall-ee/chinese2digits
Author: Wa-llee
Author-email: [email protected]
License: Apache License 2.0
Location: d:\python\lib\site-packages
Requires:
You are using pip version 9.0.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

D:\>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import chinese2digits as c2d
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'chinese2digits'
>>>

关于Go版本的异常处理问题

你好~
floatResult, err := strconv.ParseFloat(convertResult, 32)
if err != nil {
panic(err)
}

go版本这一段代码如果超出范围会稳定抛出panic

用户的输入不太好控制 这块是否可以改为返回err或者做出其他异常处理

测试输入为:
10000000000000000000000000000000000000000000连

结果:
panic: strconv.ParseFloat: parsing "10000000000000000000000000000000000000000000": value out of range

github.com/Wall-ee/chinese2digits/chinese2digits.convertDigitsStringToFloat(0xc000028900, 0x2c, 0x2c)
1|main | /root/go/pkg/mod/github.com/!wall-ee/[email protected]/chinese2digits/chinese2digits.go:298 +0x283
1|main | github.com/Wall-ee/chinese2digits/chinese2digits.ChineseToDigits(0xc000028900, 0x2c, 0x1, 0x832a80, 0x9688b0, 0x1, 0x1)
1|main | /root/go/pkg/mod/github.com/!wall-ee/[email protected]/chinese2digits/chinese2digits.go:336 +0xc6f
1|main | github.com/Wall-ee/chinese2digits/chinese2digits.TakeChineseNumberFromString(0xc0000288d0, 0x2c, 0xc001c5f570, 0x4, 0x4, 0xc001c5f588, 0x4)
1|main | /root/go/pkg/mod/github.com/!wall-ee/[email protected]/chinese2digits/chinese2digits.go:793 +0x5d2
1|main | github.com/Wall-ee/chinese2digits/chinese2digits.TakeNumberFromString(0xc0000288d0, 0x2c, 0x0, 0x0, 0x0, 0x2, 0x0)
1|main | /root/go/pkg/mod/github.com/!wall-ee/[email protected]/chinese2digits/chinese2digits.go:860 +0xff

繁体字转换拾时有bug

放截图:
image
这个报错了,感觉可能是因为将拾转换只是当作了一个数值计量单位,并没有处理只有一个它的时候的情况,感觉这里的繁体字替换可能太灵活了,不知道在转换前直接一对一将繁体字直接转换为简体字再处理可不可行。
略述愚见,如果不正确,还请见谅。

特殊字符『〇』识别错误

输入: 国家主席发表二〇二三年新年贺词

期望输出:国家主席发表2023年新年贺词

实际输出:{'inputText': '国家主席发表二〇二三年新年贺词', 'replacedText': '国家主席发表2〇23年新年贺词', 'CHNumberStringList': ['二', '二三'], 'digitsStringList': ['2', '23'], 'errorWordList': [], 'errorMsgList': []}

takeNumberFromString('百/千/万/百万/千万')

{'inputText': '百/千/万/百万/千万',
'replacedText': '百/千/万/百万/千万',
'CHNumberStringList': [],
'digitsStringList': [],
'errorWordList': [],
'errorMsgList': []}

提取出来100/1000/10000/1000000/10000000更好吧?

需要单独点一份沙茶酱/点两份沙茶酱的错误识别说明

使用takeChineseNumberFromStr 的默认参数,
“需要单独点一份沙茶酱”会被识别为“需要单独0.1份沙茶酱”
“点两份沙茶酱”的“两”不能被识别成数字,即使将traditional convert 开为true,也还是不能被识别为数字。

事实上,我想将“点一份”识别为“点1份”,“点两份”识别为“点2份”

有个识别的BUG,会报错

在识别“我想打电话我要陆兆显” 这句话时,就会报错,只要里面带了人名,人名包含中文数字就报错

一些不合理case反馈

假设我有一个标准的文本:

明天见 我的车牌号是7G02D 白色的INSPIRE

如果使用:takeChineseNumberFromString,这个方法,会先提取文本中的数字,转成中文。

CHNumberStringListTemp = takingChineseDigitsMixRERules.findall(convertedCHString)
['7', '02']
['七', '零二']

会被转换成

[('02', '2', 2), ('7', '7', 1)]

最终转换的结果变成,

明天见 我的车牌号是7G2D 白色的INSPIRE 

你看看这块要不要加一个判断,如果是字母和数字共同出现,不需要转换。如果是\d+[wk],可以转换

convertedCHString = traditionalTextConvertFunc(chText,traditionalConvert)
    """
    字符串 汉字数字字符串切割提取
    正则表达式方法
    """
    # TODO  check digits-alphabet-mixed, skip
    
    CHNumberStringListTemp = takingChineseDigitsMixRERules.findall(convertedCHString)
    print(CHNumberStringListTemp)
    #检查是不是  分之 切割不完整问题
    CHNumberStringListTemp = checkNumberSeg(CHNumberStringListTemp,convertedCHString)
    print(CHNumberStringListTemp)
    #检查末位是不是正负号
    CHNumberStringListTemp = checkSignSeg(CHNumberStringListTemp)
    print(CHNumberStringListTemp)
    #备份一个原始的提取,后期处结果的时候显示用
    OriginCHNumberTake = CHNumberStringListTemp.copy()

还是说建议自己在使用前做好替换,跳过转换,而不是交给这个包做决策

阿拉伯和中文混合的情况识别问题:”5万3“、”六千7“

阿拉伯和中文混合的情况识别问题:
”5万3“ 识别成了 ['50000', '3'],实际上想要的是 53000
”六千7“ 识别成了 ['6000', '7'],实际上想要的是 6700

但是有时候也能出来想要的结果:

'6千七' 识别成 6700

感觉有点不一致,这种情况是如何控制的呢?

字典BUG

代码:
import chinese2digits as c2d
q = "一兆韦德"
q = c2d.takeChineseNumberFromString(q)["replacedText"]

会报错:
File "/Users/chinese2digits.py", line 64, in coreCHToDigits
if val >= 10 and i == 0: #应对 十三 十四 十*之类,说明为十以上的数字,看是不是十三这种
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

似乎是因为识别到了一兆但是字典common_used_ch_numerals中没有转换兆的key,希望尽快修改

小数部分的转换有bug

放截图:
image
点后面前几位如果都是零的话将不会处理,猜测应该是不小心将小数部分的匹配和整数部分的匹配一样了,导致开头的零被省略。

bugs report

issues with some abbreviated statements

  • takeChineseNumberFromString('二千十七')--> 2007
    should be 2017
  • takeChineseNumberFromString('二千七')--> 2007
    should be 2700
  • takeChineseNumberFromString('两千') --> None
    should be 2000

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.