Skip to content

Commit 91697e9

Browse files
authored
feat: add TrainNumber rule for Chinese ITN (#191) (#335)
Convert spoken train numbers to codes, e.g.: 高一二三 => G123 动二三 => D23 特五六七八 => T5678 Requires at least 2 digits to avoid conflicts with 高一/高二/高三 (school grades).
1 parent b12582b commit 91697e9

5 files changed

Lines changed: 54 additions & 0 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
G
2+
D
3+
T
4+
K
5+
Z
6+
L
7+
L

itn/chinese/inverse_normalizer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from itn.chinese.rules.cardinal import Cardinal
1919
from itn.chinese.rules.char import Char
2020
from itn.chinese.rules.date import Date
21+
from itn.chinese.rules.train_number import TrainNumber
2122
from itn.chinese.rules.fraction import Fraction
2223
from itn.chinese.rules.license_plate import LicensePlate
2324
from itn.chinese.rules.math import Math
@@ -62,6 +63,7 @@ def build_tagger_and_verbalizer(self):
6263
| add_weight(cardinal.tagger, 1.06)
6364
| add_weight(Math(cardinal=cardinal).tagger, 1.10)
6465
| add_weight(LicensePlate().tagger, 1.0)
66+
| add_weight(TrainNumber().tagger, 1.0)
6567
| add_weight(Char().tagger, 100)
6668
).optimize()
6769

@@ -73,6 +75,7 @@ def build_tagger_and_verbalizer(self):
7375
| Char().verbalizer
7476
| Date().verbalizer
7577
| Fraction().verbalizer
78+
| TrainNumber().verbalizer
7679
| Math().verbalizer
7780
| Measure(enable_0_to_9=self.enable_0_to_9).verbalizer
7881
| Money(enable_0_to_9=self.enable_0_to_9).verbalizer

itn/chinese/rules/train_number.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright (c) 2024 Zhendong Peng (pzd17@tsinghua.org.cn)
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from pynini import string_file
16+
from pynini.lib.pynutil import insert
17+
18+
from tn.processor import Processor
19+
from tn.utils import get_abs_path
20+
21+
22+
class TrainNumber(Processor):
23+
24+
def __init__(self):
25+
super().__init__(name="trainnumber")
26+
self.build_tagger()
27+
self.build_verbalizer()
28+
29+
def build_tagger(self):
30+
digit = string_file(get_abs_path("../itn/chinese/data/number/digit.tsv"))
31+
zero = string_file(get_abs_path("../itn/chinese/data/number/zero.tsv"))
32+
digits = zero | digit
33+
prefix = string_file(get_abs_path("../itn/chinese/data/train_number/prefix.tsv"))
34+
number = digits + digits + (digits + digits.ques).ques
35+
tagger = insert('value: "') + prefix + number + insert('"')
36+
self.tagger = self.add_tokens(tagger)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
高一二 => G12
2+
高一二三 => G123
3+
高一二三四 => G1234
4+
动二三 => D23
5+
动三四五六 => D3456
6+
特五六七八 => T5678
7+
快一零二三 => K1023

itn/chinese/test/normalizer_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class TestNormalizer:
3838
parse_test_case("data/whitelist.txt"),
3939
parse_test_case("data/number.txt"),
4040
parse_test_case("data/license_plate.txt"),
41+
parse_test_case("data/train_number.txt"),
4142
parse_test_case("data/normalizer.txt"),
4243
)
4344

0 commit comments

Comments
 (0)