Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions itn/chinese/inverse_normalizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()

Expand All @@ -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
Expand Down
24 changes: 19 additions & 5 deletions itn/chinese/rules/cardinal.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand All @@ -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
Comment on lines 100 to -89
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

之前enable_0_to_9只有在cardinal的tagger中才生效,在遇到量词时 (比如“九天”) measure中用的是cardinal.number,而非cardinal.tagger,此时设置enable_0_to_9=False,“九天”依旧会被转成“9天”
image

cardinal |= number_exclude_0_to_9
tagger = insert('value: "') + cardinal + insert('"')
self.tagger = self.add_tokens(tagger)
18 changes: 12 additions & 6 deletions itn/chinese/rules/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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 # 零八年奥运会
Comment on lines +32 to +34
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个是为了过单元测试,顺手附带修的bug,现在单元测试分成了四组,若这里不添加yy,则其中一组单元测试过不去:

standalone number 0to9
yes yes
yes no
no no
no yes

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)
11 changes: 5 additions & 6 deletions itn/chinese/rules/measure.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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'))
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里没用number而是用cardinal().number是因为百分数不应该区分是否0~9,比如“百分之二”理应被转换为“2%”

+ 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
Expand Down
6 changes: 4 additions & 2 deletions itn/chinese/rules/money.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,18 @@

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()

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)
Expand Down
2 changes: 1 addition & 1 deletion itn/chinese/test/data/date.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions itn/chinese/test/data/measure.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
一年后 => 一年后
一年后 => 1年后
两年后 => 2年后
二十年后 => 20年后
二两 => 2两
Expand Down Expand Up @@ -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人
3 changes: 2 additions & 1 deletion itn/chinese/test/data/normalizer.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
重达二十五千克 => 重达25kg
最高气温三十八摄氏度 => 最高气温38°C
实际面积一百二十平方米 => 实际面积120m²
渲染速度十毫秒一帧 => 渲染速度10ms一帧
渲染速度十毫秒一帧 => 渲染速度10ms1帧
可以打我手机幺三五零幺二三四五六七 => 可以打我手机13501234567
可以拨打幺二三零六来咨询 => 可以拨打12306来咨询
二点五平方电线,五,五十五,疑是银河落九天,十二块五 => 2.5平方电线,5,55,疑是银河落9天,12块5
29 changes: 0 additions & 29 deletions itn/chinese/test/data/normalizer_disable_standalone_number.txt

This file was deleted.

Loading