From c40e2082d3c8ea291eb29049ee49214181b9bc5c Mon Sep 17 00:00:00 2001 From: xingchensong Date: Sun, 10 Sep 2023 15:21:00 +0800 Subject: [PATCH] fix(itn): set 0to9 for measure & money --- itn/chinese/inverse_normalizer.py | 14 ++-- itn/chinese/rules/cardinal.py | 24 +++++-- itn/chinese/rules/date.py | 18 +++-- itn/chinese/rules/measure.py | 11 ++- itn/chinese/rules/money.py | 6 +- itn/chinese/test/data/date.txt | 2 +- itn/chinese/test/data/measure.txt | 6 +- itn/chinese/test/data/normalizer.txt | 3 +- .../normalizer_disable_standalone_number.txt | 29 -------- ...sable_standalone_number_disable_0_to_9.txt | 32 +++++++++ ...isable_standalone_number_enable_0_to_9.txt | 1 + ...nable_standalone_number_disable_0_to_9.txt | 32 +++++++++ itn/chinese/test/data/time.txt | 2 +- itn/chinese/test/normalizer_test.py | 67 +++++++++++++++++++ ...rmalizer_test_disable_standalone_number.py | 42 ------------ itn/main.py | 2 +- 16 files changed, 187 insertions(+), 104 deletions(-) delete mode 100644 itn/chinese/test/data/normalizer_disable_standalone_number.txt create mode 100644 itn/chinese/test/data/normalizer_disable_standalone_number_disable_0_to_9.txt create mode 100644 itn/chinese/test/data/normalizer_disable_standalone_number_enable_0_to_9.txt create mode 100644 itn/chinese/test/data/normalizer_enable_standalone_number_disable_0_to_9.txt delete mode 100644 itn/chinese/test/normalizer_test_disable_standalone_number.py diff --git a/itn/chinese/inverse_normalizer.py b/itn/chinese/inverse_normalizer.py index 3b7e235b..793079fe 100644 --- a/itn/chinese/inverse_normalizer.py +++ b/itn/chinese/inverse_normalizer.py @@ -32,7 +32,7 @@ class InverseNormalizer(Processor): def __init__(self, cache_dir=None, overwrite_cache=False, enable_standalone_number=True, - enable_0_to_9=True): + enable_0_to_9=False): super().__init__(name='inverse_normalizer', ordertype='itn') self.convert_number = enable_standalone_number self.enable_0_to_9 = enable_0_to_9 @@ -44,10 +44,10 @@ def build_tagger(self): tagger = (add_weight(Date().tagger, 1.02) | add_weight(Whitelist().tagger, 1.01) | add_weight(Fraction().tagger, 1.05) - | add_weight(Measure().tagger, 1.05) - | add_weight(Money().tagger, 1.04) + | add_weight(Measure(enable_0_to_9=self.enable_0_to_9).tagger, 1.05) # noqa + | add_weight(Money(enable_0_to_9=self.enable_0_to_9).tagger, 1.04) # noqa | add_weight(Time().tagger, 1.05) - | add_weight(Cardinal(self.convert_number, self.enable_0_to_9).tagger, 1.06) + | add_weight(Cardinal(self.convert_number, self.enable_0_to_9).tagger, 1.06) # noqa | add_weight(Math().tagger, 1.10) | add_weight(Char().tagger, 100)).optimize() @@ -56,13 +56,13 @@ def build_tagger(self): self.tagger = tagger @ self.build_rule(delete(' '), '', '[EOS]') def build_verbalizer(self): - verbalizer = (Cardinal(self.convert_number, self.enable_0_to_9).verbalizer + verbalizer = (Cardinal(self.convert_number, self.enable_0_to_9).verbalizer # noqa | Char().verbalizer | Date().verbalizer | Fraction().verbalizer | Math().verbalizer - | Measure().verbalizer - | Money().verbalizer + | Measure(enable_0_to_9=self.enable_0_to_9).verbalizer + | Money(enable_0_to_9=self.enable_0_to_9).verbalizer | Time().verbalizer | Whitelist().verbalizer).optimize() postprocessor = PostProcessor(remove_interjections=True).processor diff --git a/itn/chinese/rules/cardinal.py b/itn/chinese/rules/cardinal.py index 9cbda7db..967ab22a 100644 --- a/itn/chinese/rules/cardinal.py +++ b/itn/chinese/rules/cardinal.py @@ -23,6 +23,7 @@ class Cardinal(Processor): def __init__(self, enable_standalone_number=True, enable_0_to_9=True): super().__init__('cardinal') self.number = None + self.number_exclude_0_to_9 = None self.enable_standalone_number = enable_standalone_number self.enable_0_to_9 = enable_0_to_9 self.build_tagger() @@ -64,15 +65,29 @@ def build_tagger(self): | add_weight(addzero + addzero + zero + digit, 0.5) | add_weight(digit + addzero**3, 0.8) | add_weight(addzero**4, 1.0))) - - # 1.11, 1.01 + # 个/十/百/千/万 number = digits | teen | tens | hundred | thousand | ten_thousand # 兆/亿 number = ((number + accep('兆') + delete('零').ques).ques + (number + accep('亿') + delete('零').ques).ques + number) + # 负的xxx 1.11, 1.01 number = sign.ques + number + (dot + digits.plus).ques self.number = number.optimize() - self.digits = digits.optimize() + + # 十/百/千/万 + number_exclude_0_to_9 = teen | tens | hundred | thousand | ten_thousand + # 兆/亿 + number_exclude_0_to_9 = ( + (number_exclude_0_to_9 + accep('兆') + delete('零').ques).ques + + (number_exclude_0_to_9 + accep('亿') + delete('零').ques).ques + + number_exclude_0_to_9 + ) + # 负的xxx 1.11, 1.01 + number_exclude_0_to_9 |= ( + (number_exclude_0_to_9 | digits) + + (dot + digits.plus).plus + ) + self.number_exclude_0_to_9 = (sign.ques + number_exclude_0_to_9).optimize() # noqa # cardinal string like 127.0.0.1, used in ID, IP, etc. cardinal = digit.plus + (dot + digits.plus).plus @@ -85,7 +100,6 @@ def build_tagger(self): if self.enable_0_to_9: cardinal |= number else: - number_two_plus = (digits + digits.plus) | teen | tens | hundred | thousand | ten_thousand # noqa - cardinal |= number_two_plus + cardinal |= number_exclude_0_to_9 tagger = insert('value: "') + cardinal + insert('"') self.tagger = self.add_tokens(tagger) diff --git a/itn/chinese/rules/date.py b/itn/chinese/rules/date.py index 8d323528..2f526653 100644 --- a/itn/chinese/rules/date.py +++ b/itn/chinese/rules/date.py @@ -14,7 +14,7 @@ from tn.processor import Processor -from pynini import string_file +from pynini import string_file, accep from pynini.lib.pynutil import delete, insert @@ -29,25 +29,31 @@ def build_tagger(self): digit = string_file('itn/chinese/data/number/digit.tsv') # 1 ~ 9 zero = string_file('itn/chinese/data/number/zero.tsv') # 0 - yyyy = digit + (digit | zero)**3 - yy = digit**2 + yyyy = digit + (digit | zero)**3 # 二零零八年 + yyy = digit + (digit | zero)**2 # 公元一六八年 + yy = (digit | zero)**2 # 零八年奥运会 mm = string_file('itn/chinese/data/date/mm.tsv') dd = string_file('itn/chinese/data/date/dd.tsv') - year = insert('year: "') + (yyyy | yy) + delete('年') + insert('" ') + year = insert('year: "') + (yyyy | yyy | yy) + \ + delete('年') + insert('" ') + year_only = insert('year: "') + (yyyy | yyy | yy) + \ + accep('年') + insert('"') month = insert('month: "') + mm + insert('"') day = insert(' day: "') + dd + insert('"') - # yyyy/mm/dd | yyyy/mm | mm/dd + # yyyy/mm/dd | yyyy/mm | mm/dd | yyyy date = ((year + month + day) | (year + month) - | (month + day)) + | (month + day)) | year_only self.tagger = self.add_tokens(date) def build_verbalizer(self): addsign = insert("/") year = delete('year: "') + self.SIGMA + delete('" ') + year_only = delete('year: "') + self.SIGMA + delete('"') month = delete('month: "') + self.SIGMA + delete('"') day = delete(' day: "') + self.SIGMA + delete('"') verbalizer = (year + addsign).ques + month + (addsign + day).ques + verbalizer |= year_only self.verbalizer = self.delete_tokens(verbalizer) diff --git a/itn/chinese/rules/measure.py b/itn/chinese/rules/measure.py index 0a95391f..efd9c82c 100644 --- a/itn/chinese/rules/measure.py +++ b/itn/chinese/rules/measure.py @@ -21,9 +21,10 @@ class Measure(Processor): - def __init__(self, exclude_one=True): + def __init__(self, exclude_one=True, enable_0_to_9=True): super().__init__(name='measure') self.exclude_one = exclude_one + self.enable_0_to_9 = enable_0_to_9 self.build_tagger() self.build_verbalizer() @@ -34,17 +35,15 @@ def build_tagger(self): units = add_weight(units_en, -1.0) | \ ((accep('亿') | accep('兆') | accep('万')).ques + units_zh) - number = Cardinal().number + number = Cardinal().number if self.enable_0_to_9 else \ + Cardinal().number_exclude_0_to_9 # 百分之三十, 百分三十, 百分之百 percent = ((sign + delete('的').ques).ques + delete('百分') + - delete('之').ques + (number | cross('百', '100')) + delete('之').ques + (Cardinal().number | cross('百', '100')) + insert('%')) # 十千米每小时 => 10km/h measure = number + units - if self.exclude_one: - measure |= number + number.plus + units - measure |= (add_weight(accep('一'), -1.0) + units_zh) tagger = insert('value: "') + (measure | percent) + insert('"') # 每小时十千米 => 10km/h diff --git a/itn/chinese/rules/money.py b/itn/chinese/rules/money.py index bbf72833..f278d241 100644 --- a/itn/chinese/rules/money.py +++ b/itn/chinese/rules/money.py @@ -21,8 +21,9 @@ class Money(Processor): - def __init__(self): + def __init__(self, enable_0_to_9=True): super().__init__(name='money') + self.enable_0_to_9 = enable_0_to_9 self.build_tagger() self.build_verbalizer() @@ -30,7 +31,8 @@ def build_tagger(self): code = string_file('itn/chinese/data/money/code.tsv') symbol = string_file('itn/chinese/data/money/symbol.tsv') - number = Cardinal().number + number = Cardinal().number if self.enable_0_to_9 else \ + Cardinal().number_exclude_0_to_9 tagger = (insert('value: "') + number + insert('"') + insert(' currency: "') + (code | symbol) + insert('"')) self.tagger = self.add_tokens(tagger) diff --git a/itn/chinese/test/data/date.txt b/itn/chinese/test/data/date.txt index 366c4c80..c72724ba 100644 --- a/itn/chinese/test/data/date.txt +++ b/itn/chinese/test/data/date.txt @@ -7,4 +7,4 @@ 公元一九九六年 => 公元1996年 公元一六三年 => 公元163年 八五年二月二十七日 => 85/02/27 -这件事发生在二零一九年九月十二日的晚上或者两千零五年八月五号的晚上或者在八五年二月二十七日的晚上或者在公元一九九六年或者在八六年八月十八日或者于一九九五年三月一日或者在公元一六三年或者在零六年一月二号 => 这件事发生在2019/09/12的晚上或者2005年08/05的晚上或者在85/02/27的晚上或者在公元1996年或者在86/08/18或者于1995/03/01或者在公元163年或者在06年01/02 +这件事发生在二零一九年九月十二日的晚上或者两千零五年八月五号的晚上或者在八五年二月二十七日的晚上或者在公元一九九六年或者在八六年八月十八日或者于一九九五年三月一日或者在公元一六三年或者在零六年一月二号 => 这件事发生在2019/09/12的晚上或者2005年08/05的晚上或者在85/02/27的晚上或者在公元1996年或者在86/08/18或者于1995/03/01或者在公元163年或者在06/01/02 diff --git a/itn/chinese/test/data/measure.txt b/itn/chinese/test/data/measure.txt index d1282b3b..28333725 100644 --- a/itn/chinese/test/data/measure.txt +++ b/itn/chinese/test/data/measure.txt @@ -1,4 +1,4 @@ -一年后 => 一年后 +一年后 => 1年后 两年后 => 2年后 二十年后 => 20年后 二两 => 2两 @@ -26,5 +26,5 @@ 九千九百九十一人 => 9991人 一共有一兆零三百二十万五千人 => 一共有1兆3205000人 明天有百分之六十二的概率降雨所以你有百分之二点五一的可能性赢得比赛但是有负百分之十三的人认为你有负的百分之二十的胜利可能性 => 明天有62%的概率降雨所以你有2.51%的可能性赢得比赛但是有-13%的人认为你有-20%的胜利可能性 -这块黄金重达三百二十四点七五克,我再随便来几个价格十二块五,三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格12块5,¥34.521,20.1万 -一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有一人2人3人4人5人6人7人8人9人10人11人12人13人14人15人16人17人18人19人20人21人22人23人24人25人26人27人28人29人30人31人32人33人34人35人36人37人38人39人40人41人42人43人44人45人46人47人48人49人50人51人52人53人54人55人56人57人58人59人60人61人62人63人64人65人66人67人68人69人70人71人72人73人74人75人76人77人78人79人80人81人82人83人84人85人86人87人88人89人90人91人92人93人94人95人96人97人98人99人100人101人110人111人112人220人223人330人334人440人445人1001人1050人1051人1300人1550人2556人3660人4667人5770人6778人7880人8889人9990人9991人 +这块黄金重达三百二十四点七五克,我再随便来几个价格三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格¥34.521,20.1万 +一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有1人2人3人4人5人6人7人8人9人10人11人12人13人14人15人16人17人18人19人20人21人22人23人24人25人26人27人28人29人30人31人32人33人34人35人36人37人38人39人40人41人42人43人44人45人46人47人48人49人50人51人52人53人54人55人56人57人58人59人60人61人62人63人64人65人66人67人68人69人70人71人72人73人74人75人76人77人78人79人80人81人82人83人84人85人86人87人88人89人90人91人92人93人94人95人96人97人98人99人100人101人110人111人112人220人223人330人334人440人445人1001人1050人1051人1300人1550人2556人3660人4667人5770人6778人7880人8889人9990人9991人 diff --git a/itn/chinese/test/data/normalizer.txt b/itn/chinese/test/data/normalizer.txt index 89fe30f1..fc2a1230 100644 --- a/itn/chinese/test/data/normalizer.txt +++ b/itn/chinese/test/data/normalizer.txt @@ -25,6 +25,7 @@ 重达二十五千克 => 重达25kg 最高气温三十八摄氏度 => 最高气温38°C 实际面积一百二十平方米 => 实际面积120m² -渲染速度十毫秒一帧 => 渲染速度10ms一帧 +渲染速度十毫秒一帧 => 渲染速度10ms1帧 可以打我手机幺三五零幺二三四五六七 => 可以打我手机13501234567 可以拨打幺二三零六来咨询 => 可以拨打12306来咨询 +二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,5,55,疑是银河落9天,12块5 diff --git a/itn/chinese/test/data/normalizer_disable_standalone_number.txt b/itn/chinese/test/data/normalizer_disable_standalone_number.txt deleted file mode 100644 index 8994dd20..00000000 --- a/itn/chinese/test/data/normalizer_disable_standalone_number.txt +++ /dev/null @@ -1,29 +0,0 @@ -一共有多少人 => 一共有多少人 -呃这个呃啊我不知道 => 这个我不知道 -共四百六十五篇,约三百一十五万字 => 共465篇,约315万字 -共计六点四二万人 => 共计6.42万人 -同比升高零点六个百分点 => 同比升高0.6个百分点 -总量的五分之一以上 => 总量的1/5以上 -相当于头发丝的十六分之一 => 相当于头发丝的1/16 -二分之三是一个假分数 => 3/2是一个假分数 -同比增长百分之六点三 => 同比增长6.3% -增幅百分之零点四 => 增幅0.4% -二零零二年一月二十八日 => 2002/01/28 -二零零二年一月 => 2002/01 -八月十六号的十二点之前 => 08/16的十二点之前 -我是五点零二分开始的 => 我是5:02开始的 -于五点三十五分三十六秒发射 => 于5:35:36发射 -上午八点半准时开会 => 8:30a.m.准时开会 -比分定格在七十八比九十六 => 比分定格在78:96 -计算负二的绝对值是二 => 计算负二的绝对值是二 -正负二的平方都是四 => 正负二的平方都是四 -价格是十三点五元 => 价格是¥13.5 -价格是十三点五美元 => 价格是$13.5 -价格是十三点五澳元 => 价格是A$13.5 -价格是十三点五港元 => 价格是HKD13.5 -重达二十五千克 => 重达25kg -最高气温三十八摄氏度 => 最高气温38°C -实际面积一百二十平方米 => 实际面积120m² -渲染速度十毫秒一帧 => 渲染速度10ms一帧 -可以打我手机幺三五零幺二三四五六七 => 可以打我手机13501234567 -可以拨打幺二三零六来咨询 => 可以拨打12306来咨询 diff --git a/itn/chinese/test/data/normalizer_disable_standalone_number_disable_0_to_9.txt b/itn/chinese/test/data/normalizer_disable_standalone_number_disable_0_to_9.txt new file mode 100644 index 00000000..47fcadc9 --- /dev/null +++ b/itn/chinese/test/data/normalizer_disable_standalone_number_disable_0_to_9.txt @@ -0,0 +1,32 @@ +二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,五,五十五,疑是银河落九天,12块五 +一年后 => 一年后 +两年后 => 两年后 +二十年后 => 20年后 +二两 => 二两 +一千克 => 1000g +百分之二 => 2% +百分三十 => 30% +百分之三十 => 30% +百分百 => 100% +百分之百 => 100% +百分之二点一五 => 2.15% +每小时十公里 => 10km/h +每小时十千米 => 10km/h +十千米每小时 => 10km/h +三百二十四点七五克 => 324.75g +二十点一万 => 20.1万 +一百块钱 => 100块钱 +十二块五毛 => 12块五毛 +一万零三百人 => 10300人 +一亿两千三百人 => 一亿2300人 +一亿零两千三百人 => 一亿零2300人 +一亿七万两千三百人 => 一亿72300人 +一兆零三百万两千三百人 => 一兆零3002300人 +一兆零三百二十万五千人 => 一兆零3205000人 +十五兆零三百二十万五千人 => 15兆3205000人 +两千万人 => 2000万人 +九千九百九十一人 => 9991人 +一共有一兆零三百二十万五千人 => 一共有一兆零3205000人 +明天有百分之六十二的概率降雨所以你有百分之二点五一的可能性赢得比赛但是有负百分之十三的人认为你有负的百分之二十的胜利可能性 => 明天有62%的概率降雨所以你有2.51%的可能性赢得比赛但是有-13%的人认为你有-20%的胜利可能性 +这块黄金重达三百二十四点七五克,我再随便来几个价格三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格¥34.521,20.1万 +一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有一人二人三人四人五人六人七人八人九人10人11人12人13人14人15人16人17人18人19人20人21人22人23人24人25人26人27人28人29人30人31人32人33人34人35人36人37人38人39人40人41人42人43人44人45人46人47人48人49人50人51人52人53人54人55人56人57人58人59人60人61人62人63人64人65人66人67人68人69人70人71人72人73人74人75人76人77人78人79人80人81人82人83人84人85人86人87人88人89人90人91人92人93人94人95人96人97人98人99人100人101人110人111人112人220人223人330人334人440人445人1001人1050人1051人1300人1550人2556人3660人4667人5770人6778人7880人8889人9990人9991人 diff --git a/itn/chinese/test/data/normalizer_disable_standalone_number_enable_0_to_9.txt b/itn/chinese/test/data/normalizer_disable_standalone_number_enable_0_to_9.txt new file mode 100644 index 00000000..606177c2 --- /dev/null +++ b/itn/chinese/test/data/normalizer_disable_standalone_number_enable_0_to_9.txt @@ -0,0 +1 @@ +二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,五,五十五,疑是银河落9天,12块五 diff --git a/itn/chinese/test/data/normalizer_enable_standalone_number_disable_0_to_9.txt b/itn/chinese/test/data/normalizer_enable_standalone_number_disable_0_to_9.txt new file mode 100644 index 00000000..786cc087 --- /dev/null +++ b/itn/chinese/test/data/normalizer_enable_standalone_number_disable_0_to_9.txt @@ -0,0 +1,32 @@ +二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,五,55,疑是银河落九天,12块五 +一年后 => 一年后 +两年后 => 两年后 +二十年后 => 20年后 +二两 => 二两 +一千克 => 1000g +百分之二 => 2% +百分三十 => 30% +百分之三十 => 30% +百分百 => 100% +百分之百 => 100% +百分之二点一五 => 2.15% +每小时十公里 => 10km/h +每小时十千米 => 10km/h +十千米每小时 => 10km/h +三百二十四点七五克 => 324.75g +二十点一万 => 20.1万 +一百块钱 => 100块钱 +十二块五毛 => 12块五毛 +一万零三百人 => 10300人 +一亿两千三百人 => 一亿2300人 +一亿零两千三百人 => 一亿零2300人 +一亿七万两千三百人 => 一亿72300人 +一兆零三百万两千三百人 => 一兆零3002300人 +一兆零三百二十万五千人 => 一兆零3205000人 +十五兆零三百二十万五千人 => 15兆3205000人 +两千万人 => 2000万人 +九千九百九十一人 => 9991人 +一共有一兆零三百二十万五千人 => 一共有一兆零3205000人 +明天有百分之六十二的概率降雨所以你有百分之二点五一的可能性赢得比赛但是有负百分之十三的人认为你有负的百分之二十的胜利可能性 => 明天有62%的概率降雨所以你有2.51%的可能性赢得比赛但是有-13%的人认为你有-20%的胜利可能性 +这块黄金重达三百二十四点七五克,我再随便来几个价格三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格¥34.521,20.1万 +一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有一人二人三人四人五人六人七人八人九人10人11人12人13人14人15人16人17人18人19人20人21人22人23人24人25人26人27人28人29人30人31人32人33人34人35人36人37人38人39人40人41人42人43人44人45人46人47人48人49人50人51人52人53人54人55人56人57人58人59人60人61人62人63人64人65人66人67人68人69人70人71人72人73人74人75人76人77人78人79人80人81人82人83人84人85人86人87人88人89人90人91人92人93人94人95人96人97人98人99人100人101人110人111人112人220人223人330人334人440人445人1001人1050人1051人1300人1550人2556人3660人4667人5770人6778人7880人8889人9990人9991人 diff --git a/itn/chinese/test/data/time.txt b/itn/chinese/test/data/time.txt index 2a81a09e..0aae787f 100644 --- a/itn/chinese/test/data/time.txt +++ b/itn/chinese/test/data/time.txt @@ -9,4 +9,4 @@ 八点零五分 => 8:05 八点三十 => 8:30 八点半 => 8:30 -时间上是零点十分登机,八点五分下飞机,八点三十去吃早饭,十二点回家.你是说八点零五分下飞机还是八点零五下飞机?我可能下午三点四十,或者上午十点半再或者下午三点四十一分去找你 => 时间上是00:10登机,8.5分下飞机,8:30去吃早饭,12点回家.你是说8:05下飞机还是8:05下飞机?我可能3:40p.m.,或者10:30a.m.再或者3:41p.m.去找你 +时间上是零点十分登机,八点五分下飞机,八点三十去吃早饭.你是说八点零五分下飞机还是八点零五下飞机?我可能下午三点四十,或者上午十点半再或者下午三点四十一分去找你 => 时间上是00:10登机,8.5分下飞机,8:30去吃早饭.你是说8:05下飞机还是8:05下飞机?我可能3:40p.m.,或者10:30a.m.再或者3:41p.m.去找你 diff --git a/itn/chinese/test/normalizer_test.py b/itn/chinese/test/normalizer_test.py index 6b54c922..083c8dce 100644 --- a/itn/chinese/test/normalizer_test.py +++ b/itn/chinese/test/normalizer_test.py @@ -43,3 +43,70 @@ class TestNormalizer: @pytest.mark.parametrize("spoken, written", normalizer_cases) def test_normalizer(self, spoken, written): assert self.normalizer.normalize(spoken) == written + + +class TestNormalizerDisablestandalonenumberEnable0to9: + + normalizer = InverseNormalizer( + overwrite_cache=True, + enable_standalone_number=False, + enable_0_to_9=True) + + normalizer_cases = chain( + parse_test_case('data/char.txt'), + parse_test_case('data/date.txt'), + parse_test_case('data/fraction.txt'), + parse_test_case('data/math.txt'), + parse_test_case('data/measure.txt'), + parse_test_case('data/money.txt'), + parse_test_case('data/time.txt'), + parse_test_case('data/whitelist.txt'), + parse_test_case('data/normalizer_disable_standalone_number_enable_0_to_9.txt')) + + @pytest.mark.parametrize("spoken, written", normalizer_cases) + def test_normalizer(self, spoken, written): + assert self.normalizer.normalize(spoken) == written + + +class TestNormalizerEnablestandalonenumberDisable0to9: + + normalizer = InverseNormalizer( + overwrite_cache=True, + enable_standalone_number=True, + enable_0_to_9=False) + + normalizer_cases = chain( + parse_test_case('data/char.txt'), + parse_test_case('data/date.txt'), + parse_test_case('data/fraction.txt'), + parse_test_case('data/math.txt'), + parse_test_case('data/money.txt'), + parse_test_case('data/time.txt'), + parse_test_case('data/whitelist.txt'), + parse_test_case('data/normalizer_enable_standalone_number_disable_0_to_9.txt')) + + @pytest.mark.parametrize("spoken, written", normalizer_cases) + def test_normalizer(self, spoken, written): + assert self.normalizer.normalize(spoken) == written + + +class TestNormalizerDisablestandalonenumberDisable0to9: + + normalizer = InverseNormalizer( + overwrite_cache=True, + enable_standalone_number=False, + enable_0_to_9=False) + + normalizer_cases = chain( + parse_test_case('data/char.txt'), + parse_test_case('data/date.txt'), + parse_test_case('data/fraction.txt'), + parse_test_case('data/math.txt'), + parse_test_case('data/money.txt'), + parse_test_case('data/time.txt'), + parse_test_case('data/whitelist.txt'), + parse_test_case('data/normalizer_disable_standalone_number_disable_0_to_9.txt')) + + @pytest.mark.parametrize("spoken, written", normalizer_cases) + def test_normalizer(self, spoken, written): + assert self.normalizer.normalize(spoken) == written diff --git a/itn/chinese/test/normalizer_test_disable_standalone_number.py b/itn/chinese/test/normalizer_test_disable_standalone_number.py deleted file mode 100644 index 2cf3d6e2..00000000 --- a/itn/chinese/test/normalizer_test_disable_standalone_number.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2022 Zhendong Peng (pzd17@tsinghua.org.cn) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import pytest - -from itertools import chain - -from itn.chinese.inverse_normalizer import InverseNormalizer -from itn.chinese.test.utils import parse_test_case - - -class TestNormalizer: - - normalizer = InverseNormalizer( - overwrite_cache=True, - enable_standalone_number=False) - - normalizer_cases = chain( - parse_test_case('data/char.txt'), - parse_test_case('data/date.txt'), - parse_test_case('data/fraction.txt'), - parse_test_case('data/math.txt'), - parse_test_case('data/measure.txt'), - parse_test_case('data/money.txt'), - parse_test_case('data/time.txt'), - parse_test_case('data/whitelist.txt'), - parse_test_case('data/normalizer_disable_standalone_number.txt')) - - @pytest.mark.parametrize("spoken, written", normalizer_cases) - def test_normalizer(self, spoken, written): - assert self.normalizer.normalize(spoken) == written diff --git a/itn/main.py b/itn/main.py index d314750c..5cf26bbd 100644 --- a/itn/main.py +++ b/itn/main.py @@ -36,7 +36,7 @@ def main(): default='True', help='enable standalone number') parser.add_argument('--enable_0_to_9', type=str, - default='True', + default='False', help='enable convert number 0 to 9') args = parser.parse_args()