Skip to content

Commit f60d9e4

Browse files
authored
fix(itn): set 0to9 for measure & money (#109)
1 parent 9b9bf6a commit f60d9e4

16 files changed

Lines changed: 187 additions & 104 deletions

itn/chinese/inverse_normalizer.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class InverseNormalizer(Processor):
3232

3333
def __init__(self, cache_dir=None, overwrite_cache=False,
3434
enable_standalone_number=True,
35-
enable_0_to_9=True):
35+
enable_0_to_9=False):
3636
super().__init__(name='inverse_normalizer', ordertype='itn')
3737
self.convert_number = enable_standalone_number
3838
self.enable_0_to_9 = enable_0_to_9
@@ -44,10 +44,10 @@ def build_tagger(self):
4444
tagger = (add_weight(Date().tagger, 1.02)
4545
| add_weight(Whitelist().tagger, 1.01)
4646
| add_weight(Fraction().tagger, 1.05)
47-
| add_weight(Measure().tagger, 1.05)
48-
| add_weight(Money().tagger, 1.04)
47+
| add_weight(Measure(enable_0_to_9=self.enable_0_to_9).tagger, 1.05) # noqa
48+
| add_weight(Money(enable_0_to_9=self.enable_0_to_9).tagger, 1.04) # noqa
4949
| add_weight(Time().tagger, 1.05)
50-
| add_weight(Cardinal(self.convert_number, self.enable_0_to_9).tagger, 1.06)
50+
| add_weight(Cardinal(self.convert_number, self.enable_0_to_9).tagger, 1.06) # noqa
5151
| add_weight(Math().tagger, 1.10)
5252
| add_weight(Char().tagger, 100)).optimize()
5353

@@ -56,13 +56,13 @@ def build_tagger(self):
5656
self.tagger = tagger @ self.build_rule(delete(' '), '', '[EOS]')
5757

5858
def build_verbalizer(self):
59-
verbalizer = (Cardinal(self.convert_number, self.enable_0_to_9).verbalizer
59+
verbalizer = (Cardinal(self.convert_number, self.enable_0_to_9).verbalizer # noqa
6060
| Char().verbalizer
6161
| Date().verbalizer
6262
| Fraction().verbalizer
6363
| Math().verbalizer
64-
| Measure().verbalizer
65-
| Money().verbalizer
64+
| Measure(enable_0_to_9=self.enable_0_to_9).verbalizer
65+
| Money(enable_0_to_9=self.enable_0_to_9).verbalizer
6666
| Time().verbalizer
6767
| Whitelist().verbalizer).optimize()
6868
postprocessor = PostProcessor(remove_interjections=True).processor

itn/chinese/rules/cardinal.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Cardinal(Processor):
2323
def __init__(self, enable_standalone_number=True, enable_0_to_9=True):
2424
super().__init__('cardinal')
2525
self.number = None
26+
self.number_exclude_0_to_9 = None
2627
self.enable_standalone_number = enable_standalone_number
2728
self.enable_0_to_9 = enable_0_to_9
2829
self.build_tagger()
@@ -64,15 +65,29 @@ def build_tagger(self):
6465
| add_weight(addzero + addzero + zero + digit, 0.5)
6566
| add_weight(digit + addzero**3, 0.8)
6667
| add_weight(addzero**4, 1.0)))
67-
68-
# 1.11, 1.01
68+
# 个/十/百/千/万
6969
number = digits | teen | tens | hundred | thousand | ten_thousand
7070
# 兆/亿
7171
number = ((number + accep('兆') + delete('零').ques).ques +
7272
(number + accep('亿') + delete('零').ques).ques + number)
73+
# 负的xxx 1.11, 1.01
7374
number = sign.ques + number + (dot + digits.plus).ques
7475
self.number = number.optimize()
75-
self.digits = digits.optimize()
76+
77+
# 十/百/千/万
78+
number_exclude_0_to_9 = teen | tens | hundred | thousand | ten_thousand
79+
# 兆/亿
80+
number_exclude_0_to_9 = (
81+
(number_exclude_0_to_9 + accep('兆') + delete('零').ques).ques +
82+
(number_exclude_0_to_9 + accep('亿') + delete('零').ques).ques +
83+
number_exclude_0_to_9
84+
)
85+
# 负的xxx 1.11, 1.01
86+
number_exclude_0_to_9 |= (
87+
(number_exclude_0_to_9 | digits) +
88+
(dot + digits.plus).plus
89+
)
90+
self.number_exclude_0_to_9 = (sign.ques + number_exclude_0_to_9).optimize() # noqa
7691

7792
# cardinal string like 127.0.0.1, used in ID, IP, etc.
7893
cardinal = digit.plus + (dot + digits.plus).plus
@@ -85,7 +100,6 @@ def build_tagger(self):
85100
if self.enable_0_to_9:
86101
cardinal |= number
87102
else:
88-
number_two_plus = (digits + digits.plus) | teen | tens | hundred | thousand | ten_thousand # noqa
89-
cardinal |= number_two_plus
103+
cardinal |= number_exclude_0_to_9
90104
tagger = insert('value: "') + cardinal + insert('"')
91105
self.tagger = self.add_tokens(tagger)

itn/chinese/rules/date.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from tn.processor import Processor
1616

17-
from pynini import string_file
17+
from pynini import string_file, accep
1818
from pynini.lib.pynutil import delete, insert
1919

2020

@@ -29,25 +29,31 @@ def build_tagger(self):
2929
digit = string_file('itn/chinese/data/number/digit.tsv') # 1 ~ 9
3030
zero = string_file('itn/chinese/data/number/zero.tsv') # 0
3131

32-
yyyy = digit + (digit | zero)**3
33-
yy = digit**2
32+
yyyy = digit + (digit | zero)**3 # 二零零八年
33+
yyy = digit + (digit | zero)**2 # 公元一六八年
34+
yy = (digit | zero)**2 # 零八年奥运会
3435
mm = string_file('itn/chinese/data/date/mm.tsv')
3536
dd = string_file('itn/chinese/data/date/dd.tsv')
3637

37-
year = insert('year: "') + (yyyy | yy) + delete('年') + insert('" ')
38+
year = insert('year: "') + (yyyy | yyy | yy) + \
39+
delete('年') + insert('" ')
40+
year_only = insert('year: "') + (yyyy | yyy | yy) + \
41+
accep('年') + insert('"')
3842
month = insert('month: "') + mm + insert('"')
3943
day = insert(' day: "') + dd + insert('"')
4044

41-
# yyyy/mm/dd | yyyy/mm | mm/dd
45+
# yyyy/mm/dd | yyyy/mm | mm/dd | yyyy
4246
date = ((year + month + day)
4347
| (year + month)
44-
| (month + day))
48+
| (month + day)) | year_only
4549
self.tagger = self.add_tokens(date)
4650

4751
def build_verbalizer(self):
4852
addsign = insert("/")
4953
year = delete('year: "') + self.SIGMA + delete('" ')
54+
year_only = delete('year: "') + self.SIGMA + delete('"')
5055
month = delete('month: "') + self.SIGMA + delete('"')
5156
day = delete(' day: "') + self.SIGMA + delete('"')
5257
verbalizer = (year + addsign).ques + month + (addsign + day).ques
58+
verbalizer |= year_only
5359
self.verbalizer = self.delete_tokens(verbalizer)

itn/chinese/rules/measure.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121

2222
class Measure(Processor):
2323

24-
def __init__(self, exclude_one=True):
24+
def __init__(self, exclude_one=True, enable_0_to_9=True):
2525
super().__init__(name='measure')
2626
self.exclude_one = exclude_one
27+
self.enable_0_to_9 = enable_0_to_9
2728
self.build_tagger()
2829
self.build_verbalizer()
2930

@@ -34,17 +35,15 @@ def build_tagger(self):
3435
units = add_weight(units_en, -1.0) | \
3536
((accep('亿') | accep('兆') | accep('万')).ques + units_zh)
3637

37-
number = Cardinal().number
38+
number = Cardinal().number if self.enable_0_to_9 else \
39+
Cardinal().number_exclude_0_to_9
3840
# 百分之三十, 百分三十, 百分之百
3941
percent = ((sign + delete('的').ques).ques + delete('百分') +
40-
delete('之').ques + (number | cross('百', '100'))
42+
delete('之').ques + (Cardinal().number | cross('百', '100'))
4143
+ insert('%'))
4244

4345
# 十千米每小时 => 10km/h
4446
measure = number + units
45-
if self.exclude_one:
46-
measure |= number + number.plus + units
47-
measure |= (add_weight(accep('一'), -1.0) + units_zh)
4847
tagger = insert('value: "') + (measure | percent) + insert('"')
4948

5049
# 每小时十千米 => 10km/h

itn/chinese/rules/money.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,18 @@
2121

2222
class Money(Processor):
2323

24-
def __init__(self):
24+
def __init__(self, enable_0_to_9=True):
2525
super().__init__(name='money')
26+
self.enable_0_to_9 = enable_0_to_9
2627
self.build_tagger()
2728
self.build_verbalizer()
2829

2930
def build_tagger(self):
3031
code = string_file('itn/chinese/data/money/code.tsv')
3132
symbol = string_file('itn/chinese/data/money/symbol.tsv')
3233

33-
number = Cardinal().number
34+
number = Cardinal().number if self.enable_0_to_9 else \
35+
Cardinal().number_exclude_0_to_9
3436
tagger = (insert('value: "') + number + insert('"') +
3537
insert(' currency: "') + (code | symbol) + insert('"'))
3638
self.tagger = self.add_tokens(tagger)

itn/chinese/test/data/date.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
公元一九九六年 => 公元1996年
88
公元一六三年 => 公元163年
99
八五年二月二十七日 => 85/02/27
10-
这件事发生在二零一九年九月十二日的晚上或者两千零五年八月五号的晚上或者在八五年二月二十七日的晚上或者在公元一九九六年或者在八六年八月十八日或者于一九九五年三月一日或者在公元一六三年或者在零六年一月二号 => 这件事发生在2019/09/12的晚上或者2005年08/05的晚上或者在85/02/27的晚上或者在公元1996年或者在86/08/18或者于1995/03/01或者在公元163年或者在06年01/02
10+
这件事发生在二零一九年九月十二日的晚上或者两千零五年八月五号的晚上或者在八五年二月二十七日的晚上或者在公元一九九六年或者在八六年八月十八日或者于一九九五年三月一日或者在公元一六三年或者在零六年一月二号 => 这件事发生在2019/09/12的晚上或者2005年08/05的晚上或者在85/02/27的晚上或者在公元1996年或者在86/08/18或者于1995/03/01或者在公元163年或者在06/01/02

itn/chinese/test/data/measure.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
一年后 => 一年后
1+
一年后 => 1年后
22
两年后 => 2年后
33
二十年后 => 20年后
44
二两 => 2两
@@ -26,5 +26,5 @@
2626
九千九百九十一人 => 9991人
2727
一共有一兆零三百二十万五千人 => 一共有1兆3205000人
2828
明天有百分之六十二的概率降雨所以你有百分之二点五一的可能性赢得比赛但是有负百分之十三的人认为你有负的百分之二十的胜利可能性 => 明天有62%的概率降雨所以你有2.51%的可能性赢得比赛但是有-13%的人认为你有-20%的胜利可能性
29-
这块黄金重达三百二十四点七五克,我再随便来几个价格十二块五,三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格12块5,¥34.521,20.1万
30-
一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有一人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人
29+
这块黄金重达三百二十四点七五克,我再随便来几个价格三十四点五二一元,二十点一万 => 这块黄金重达324.75g,我再随便来几个价格¥34.521,20.1万
30+
一共有一人二人三人四人五人六人七人八人九人十人十一人十二人十三人十四人十五人十六人十七人十八人十九人二十人二十一人二十二人二十三人二十四人二十五人二十六人二十七人二十八人二十九人三十人三十一人三十二人三十三人三十四人三十五人三十六人三十七人三十八人三十九人四十人四十一人四十二人四十三人四十四人四十五人四十六人四十七人四十八人四十九人五十人五十一人五十二人五十三人五十四人五十五人五十六人五十七人五十八人五十九人六十人六十一人六十二人六十三人六十四人六十五人六十六人六十七人六十八人六十九人七十人七十一人七十二人七十三人七十四人七十五人七十六人七十七人七十八人七十九人八十人八十一人八十二人八十三人八十四人八十五人八十六人八十七人八十八人八十九人九十人九十一人九十二人九十三人九十四人九十五人九十六人九十七人九十八人九十九人一百人一百零一人一百一人一百一十一人一百一十二人两百二人二百二十三人三百三人三百三十四人四百四人四百四十五人一千零一人一千零五十人一千零五十一人一千三百人一千五百五人两千五百五十六人三千六百六人四千六百六十七人五千七百七人六千七百七十八人七千八百八人八千八百八十九人九千九百九人九千九百九十一人 => 一共有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人

itn/chinese/test/data/normalizer.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
重达二十五千克 => 重达25kg
2626
最高气温三十八摄氏度 => 最高气温38°C
2727
实际面积一百二十平方米 => 实际面积120m²
28-
渲染速度十毫秒一帧 => 渲染速度10ms一帧
28+
渲染速度十毫秒一帧 => 渲染速度10ms1帧
2929
可以打我手机幺三五零幺二三四五六七 => 可以打我手机13501234567
3030
可以拨打幺二三零六来咨询 => 可以拨打12306来咨询
31+
二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,5,55,疑是银河落9天,12块5

itn/chinese/test/data/normalizer_disable_standalone_number.txt

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)