From c1144afcc8e337b23159ff40e28f0d2550f57e61 Mon Sep 17 00:00:00 2001 From: surendran-246 Date: Thu, 4 Jun 2026 15:12:29 +0530 Subject: [PATCH 1/5] feat(ta): add cardinal TN tagger, verbalizer and test cases Signed-off-by: surendran-246 --- .../text_normalization/ta/__init__.py | 0 .../ta/data/numbers/digit.tsv | 9 + .../ta/data/numbers/teens_and_ties.tsv | 18 ++ .../ta/data/numbers/zero.tsv | 1 + .../text_normalization/ta/graph_utils.py | 225 ++++++++++++++++++ .../text_normalization/ta/taggers/__init__.py | 0 .../text_normalization/ta/taggers/cardinal.py | 34 +++ .../text_normalization/ta/utils.py | 74 ++++++ .../ta/verbalizers/__init__.py | 0 .../ta/verbalizers/cardinal.py | 34 +++ test_cases_cardinal.txt | 28 +++ 11 files changed, 423 insertions(+) create mode 100644 nemo_text_processing/text_normalization/ta/__init__.py create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv create mode 100644 nemo_text_processing/text_normalization/ta/graph_utils.py create mode 100644 nemo_text_processing/text_normalization/ta/taggers/__init__.py create mode 100644 nemo_text_processing/text_normalization/ta/taggers/cardinal.py create mode 100644 nemo_text_processing/text_normalization/ta/utils.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/__init__.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py create mode 100644 test_cases_cardinal.txt diff --git a/nemo_text_processing/text_normalization/ta/__init__.py b/nemo_text_processing/text_normalization/ta/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv new file mode 100644 index 000000000..d61749cbd --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv @@ -0,0 +1,9 @@ +1 ஒன்று +2 இரண்டு +3 மூன்று +4 நான்கு +5 ஐந்து +6 ஆறு +7 ஏழு +8 எட்டு +9 ஒன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv new file mode 100644 index 000000000..51bfd3800 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv @@ -0,0 +1,18 @@ +10 பத்து +11 பதினொன்று +12 பன்னிரண்டு +13 பதின்மூன்று +14 பதினான்கு +15 பதினைந்து +16 பதினாறு +17 பதினேழு +18 பதினெட்டு +19 பத்தொன்பது +20 இருபது +30 முப்பது +40 நாற்பது +50 ஐம்பது +60 அறுபது +70 எழுபது +80 எண்பது +90 தொண்ணூறு \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv new file mode 100644 index 000000000..13de36a14 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv @@ -0,0 +1 @@ +0 சுழியம் \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/graph_utils.py b/nemo_text_processing/text_normalization/ta/graph_utils.py new file mode 100644 index 000000000..e8543d9ad --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/graph_utils.py @@ -0,0 +1,225 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright 2015 and onwards Google, Inc. +# +# 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 logging +import os +import string +from pathlib import Path +from typing import Dict + +import pynini +from pynini import Far +from pynini.export import export +from pynini.lib import byte, pynutil, utf8 + +NEMO_CHAR = utf8.VALID_UTF8_CHAR +NEMO_DIGIT = byte.DIGIT + +NEMO_HI_DIGIT = pynini.union("०", "१", "२", "३", "४", "५", "६", "७", "८", "९").optimize() +NEMO_HI_NON_ZERO = pynini.union("१", "२", "३", "४", "५", "६", "७", "८", "९").optimize() +NEMO_HI_ZERO = "०" +# Combined Hindi and Arabic digits for graphs that need to accept both +NEMO_ALL_DIGIT = pynini.union(NEMO_HI_DIGIT, NEMO_DIGIT).optimize() +NEMO_ALL_ZERO = pynini.union("०", "0").optimize() +NEMO_ALL_NON_ZERO = pynini.union(NEMO_HI_NON_ZERO, "1", "2", "3", "4", "5", "6", "7", "8", "9").optimize() + +HI_DEDH = "डेढ़" # 1.5 +HI_DHAI = "ढाई" # 2.5 +HI_SAVVA = "सवा" # quarter more (1.25) +HI_SADHE = "साढ़े" # half more (X.5) +HI_PAUNE = "पौने" # quarter less (0.75) + +# Hindi decimal representations +HI_POINT_FIVE = ".५" # .5 +HI_ONE_POINT_FIVE = "१.५" # 1.5 +HI_TWO_POINT_FIVE = "२.५" # 2.5 +HI_DECIMAL_25 = ".२५" # .25 +HI_DECIMAL_75 = ".७५" # .75 + +# Arabic/English decimal representations +EN_POINT_FIVE = ".5" +EN_ONE_POINT_FIVE = "1.5" +EN_TWO_POINT_FIVE = "2.5" +EN_DECIMAL_25 = ".25" +EN_DECIMAL_75 = ".75" + +# Combined Hindi and English decimal patterns +POINT_FIVE = pynini.union(HI_POINT_FIVE, EN_POINT_FIVE).optimize() +ONE_POINT_FIVE = pynini.union(HI_ONE_POINT_FIVE, EN_ONE_POINT_FIVE).optimize() +TWO_POINT_FIVE = pynini.union(HI_TWO_POINT_FIVE, EN_TWO_POINT_FIVE).optimize() +DECIMAL_25 = pynini.union(HI_DECIMAL_25, EN_DECIMAL_25).optimize() +DECIMAL_75 = pynini.union(HI_DECIMAL_75, EN_DECIMAL_75).optimize() + +# Symbol constants +HI_BY = "बाई" +LOWERCASE_X = "x" +UPPERCASE_X = "X" +ASTERISK = "*" +HYPHEN = "-" +SLASH = "/" +COMMA = "," +PERIOD = "." +HI_PERIOD = "।" + +NEMO_LOWER = pynini.union(*string.ascii_lowercase).optimize() +NEMO_UPPER = pynini.union(*string.ascii_uppercase).optimize() +NEMO_ALPHA = pynini.union(NEMO_LOWER, NEMO_UPPER).optimize() +NEMO_HEX = pynini.union(*string.hexdigits).optimize() +NEMO_NON_BREAKING_SPACE = u"\u00a0" +NEMO_SPACE = " " +NEMO_WHITE_SPACE = pynini.union(" ", "\t", "\n", "\r", u"\u00a0").optimize() +NEMO_NOT_SPACE = pynini.difference(NEMO_CHAR, NEMO_WHITE_SPACE).optimize() +NEMO_NOT_QUOTE = pynini.difference(NEMO_CHAR, r'"').optimize() +TO_LOWER = pynini.union(*[pynini.cross(x, y) for x, y in zip(string.ascii_uppercase, string.ascii_lowercase)]) +TO_UPPER = pynini.invert(TO_LOWER) +NEMO_SIGMA = pynini.closure(NEMO_CHAR) + + +delete_space = pynutil.delete(pynini.closure(NEMO_WHITE_SPACE)) +delete_zero_or_one_space = pynutil.delete(pynini.closure(NEMO_WHITE_SPACE, 0, 1)) +insert_space = pynutil.insert(" ") +delete_extra_space = pynini.cross(pynini.closure(NEMO_WHITE_SPACE, 1), " ") +delete_preserve_order = pynini.closure( + pynutil.delete(" preserve_order: true") + | (pynutil.delete(" field_order: \"") + NEMO_NOT_QUOTE + pynutil.delete("\"")) +) + + +MIN_NEG_WEIGHT = -0.0001 +MIN_POS_WEIGHT = 0.0001 +INPUT_CASED = "cased" +INPUT_LOWER_CASED = "lower_cased" +MINUS = pynini.union(" ऋणात्मक ", " ऋणात्मक ").optimize() + + +def capitalized_input_graph( + graph: 'pynini.FstLike', original_graph_weight: float = None, capitalized_graph_weight: float = None +) -> 'pynini.FstLike': + """ + Allow graph input to be capitalized, e.g. for ITN) + + Args: + graph: FstGraph + original_graph_weight: weight to add to the original `graph` + capitalized_graph_weight: weight to add to the capitalized graph + """ + capitalized_graph = pynini.compose(TO_LOWER + NEMO_SIGMA, graph).optimize() + + if original_graph_weight is not None: + graph = pynutil.add_weight(graph, weight=original_graph_weight) + + if capitalized_graph_weight is not None: + capitalized_graph = pynutil.add_weight(capitalized_graph, weight=capitalized_graph_weight) + + graph |= capitalized_graph + return graph + + +def generator_main(file_name: str, graphs: Dict[str, 'pynini.FstLike']): + """ + Exports graph as OpenFst finite state archive (FAR) file with given file name and rule name. + + Args: + file_name: exported file name + graphs: Mapping of a rule name and Pynini WFST graph to be exported + """ + exporter = export.Exporter(file_name) + for rule, graph in graphs.items(): + exporter[rule] = graph.optimize() + exporter.close() + logging.info(f'Created {file_name}') + + +def convert_space(fst) -> 'pynini.FstLike': + """ + Converts space to nonbreaking space. + Used only in tagger grammars for transducing token values within quotes, e.g. name: "hello kitty" + This is making transducer significantly slower, so only use when there could be potential spaces within quotes, otherwise leave it. + + Args: + fst: input fst + + Returns output fst where breaking spaces are converted to non breaking spaces + """ + return fst @ pynini.cdrewrite(pynini.cross(NEMO_SPACE, NEMO_NON_BREAKING_SPACE), "", "", NEMO_SIGMA) + + +class GraphFst: + """ + Base class for all grammar fsts. + + Args: + name: name of grammar class + kind: either 'classify' or 'verbalize' + deterministic: if True will provide a single transduction option, + for False multiple transduction are generated (used for audio-based normalization) + """ + + def __init__(self, name: str, kind: str, deterministic: bool = True): + self.name = name + self.kind = kind + self._fst = None + self.deterministic = deterministic + + self.far_path = Path(os.path.dirname(__file__) + '/grammars/' + kind + '/' + name + '.far') + if self.far_exist(): + self._fst = Far(self.far_path, mode="r", arc_type="standard", far_type="default").get_fst() + + def far_exist(self) -> bool: + """ + Returns true if FAR can be loaded + """ + return self.far_path.exists() + + @property + def fst(self) -> 'pynini.FstLike': + return self._fst + + @fst.setter + def fst(self, fst): + self._fst = fst + + def add_tokens(self, fst) -> 'pynini.FstLike': + """ + Wraps class name around to given fst + + Args: + fst: input fst + + Returns: + Fst: fst + """ + return pynutil.insert(f"{self.name} {{ ") + fst + pynutil.insert(" }") + + def delete_tokens(self, fst) -> 'pynini.FstLike': + """ + Deletes class name wrap around output of given fst + + Args: + fst: input fst + + Returns: + Fst: fst + """ + res = ( + pynutil.delete(f"{self.name}") + + delete_space + + pynutil.delete("{") + + delete_space + + fst + + delete_space + + pynutil.delete("}") + ) + return res @ pynini.cdrewrite(pynini.cross(u"\u00a0", " "), "", "", NEMO_SIGMA) diff --git a/nemo_text_processing/text_normalization/ta/taggers/__init__.py b/nemo_text_processing/text_normalization/ta/taggers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py new file mode 100644 index 000000000..f336995de --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py @@ -0,0 +1,34 @@ +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import GraphFst +from nemo_text_processing.text_normalization.ta.utils import get_abs_path + + +class CardinalFst(GraphFst): + """ + Classifies cardinal numbers, e.g. 5 -> cardinal { integer: "" } + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="cardinal", kind="classify", deterministic=deterministic) + + # Load the three data files as transducers (number -> word) + digit = pynini.string_file(get_abs_path("data/numbers/digit.tsv")) + zero = pynini.string_file(get_abs_path("data/numbers/zero.tsv")) + teens_and_ties = pynini.string_file(get_abs_path("data/numbers/teens_and_ties.tsv")) + + # TODO 1: Combine the three transducers into one grammar so it accepts + # a single digit (1-9), zero (0), OR a two-digit number. + # Hint: the union operator in pynini is | + graph = digit | zero | teens_and_ties # <-- complete this + graph = graph.optimize() + + # TODO 2: Wrap the word in the token field the verbalizer expects: + # produce integer: "" + # Hint: pynutil.insert("text") writes literal text into the output. + final_graph = pynutil.insert('integer: "') + graph + pynutil.insert('"') + + # add_tokens() turns it into: cardinal { integer: "" } + final_graph = self.add_tokens(final_graph) + self.fst = final_graph.optimize() diff --git a/nemo_text_processing/text_normalization/ta/utils.py b/nemo_text_processing/text_normalization/ta/utils.py new file mode 100644 index 000000000..5d314506e --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/utils.py @@ -0,0 +1,74 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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 csv +import os +import pynini + + +def get_abs_path(rel_path): + """ + Get absolute path + + Args: + rel_path: relative path to this file + + Returns absolute path + """ + return os.path.dirname(os.path.abspath(__file__)) + '/' + rel_path + + +def load_labels(abs_path): + """ + loads relative path file as dictionary + + Args: + abs_path: absolute path + + Returns dictionary of mappings + """ + label_tsv = open(abs_path, encoding="utf-8") + labels = list(csv.reader(label_tsv, delimiter="\t")) + label_tsv.close() + return labels + + +def augment_labels_with_punct_at_end(labels): + """ + augments labels: if key ends on a punctuation that value does not have, add a new label + where the value maintains the punctuation + + Args: + labels : input labels + Returns: + additional labels + """ + res = [] + for label in labels: + if len(label) > 1: + if label[0][-1] == "." and label[1][-1] != ".": + res.append([label[0], label[1] + "."] + label[2:]) + return res + + +def apply_fst(text, fst): + """Given a string input, returns the output string + produced by traversing the path with lowest weight. + If no valid path accepts input string, returns an + error. + """ + try: + print(pynini.shortestpath(text @ fst).string()) + except pynini.FstOpError: + print(f"Error: No valid output with given input: '{text}'") diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py b/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py new file mode 100644 index 000000000..9dbde23e2 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py @@ -0,0 +1,34 @@ +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import ( + NEMO_NOT_QUOTE, + GraphFst, + delete_space, +) + + +class CardinalFst(GraphFst): + """ + Verbalizes cardinals, e.g. cardinal { integer: "" } -> + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="cardinal", kind="verbalize", deterministic=deterministic) + + # TODO 3: Remove integer: " before the word and the closing " after it, + # keeping the word itself. + # Hint: pynutil.delete("text") deletes literal text; + # NEMO_NOT_QUOTE matches any character that is not a quote. + graph = ( + pynutil.delete("integer:") + + delete_space + + pynutil.delete('"') + + pynini.closure(NEMO_NOT_QUOTE, 1) # <-- keep the word (1 or more non-quote chars) + + pynutil.delete('"') + ) + + # delete_tokens() removes the surrounding cardinal { ... } + delete_tokens = self.delete_tokens(graph) + self.fst = delete_tokens.optimize() + \ No newline at end of file diff --git a/test_cases_cardinal.txt b/test_cases_cardinal.txt new file mode 100644 index 000000000..c3da1bbbc --- /dev/null +++ b/test_cases_cardinal.txt @@ -0,0 +1,28 @@ +0~சுழியம் +1~ஒன்று +2~இரண்டு +3~மூன்று +4~நான்கு +5~ஐந்து +6~ஆறு +7~ஏழு +8~எட்டு +9~ஒன்பது +10~பத்து +11~பதினொன்று +12~பன்னிரண்டு +13~பதின்மூன்று +14~பதினான்கு +15~பதினைந்து +16~பதினாறு +17~பதினேழு +18~பதினெட்டு +19~பத்தொன்பது +20~இருபது +30~முப்பது +40~நாற்பது +50~ஐம்பது +60~அறுபது +70~எழுபது +80~எண்பது +90~தொண்ணூறு \ No newline at end of file From 7b6d7db8b89c1023dffaba82553115345c597e73 Mon Sep 17 00:00:00 2001 From: surendran-246 Date: Fri, 5 Jun 2026 13:52:40 +0530 Subject: [PATCH 2/5] feat(ta): address review comments Signed-off-by: surendran-246 --- .../text_normalization/ta/__init__.py | 13 ++++ .../text_normalization/ta/data/__init__.py | 13 ++++ .../ta/data/numbers/teens_and_ties.tsv | 74 ++++++++++++++++++- .../text_normalization/ta/graph_utils.py | 3 +- .../text_normalization/ta/taggers/__init__.py | 13 ++++ .../text_normalization/ta/taggers/cardinal.py | 34 ++++++--- .../ta/verbalizers/__init__.py | 13 ++++ .../ta/verbalizers/cardinal.py | 30 ++++++-- test_cases_cardinal.txt | 74 ++++++++++++++++++- 9 files changed, 244 insertions(+), 23 deletions(-) create mode 100644 nemo_text_processing/text_normalization/ta/data/__init__.py diff --git a/nemo_text_processing/text_normalization/ta/__init__.py b/nemo_text_processing/text_normalization/ta/__init__.py index e69de29bb..2f2f217f3 100644 --- a/nemo_text_processing/text_normalization/ta/__init__.py +++ b/nemo_text_processing/text_normalization/ta/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/__init__.py b/nemo_text_processing/text_normalization/ta/data/__init__.py new file mode 100644 index 000000000..4fc25d0d3 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv index 51bfd3800..21f9f65ef 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv @@ -9,10 +9,82 @@ 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 எண்பது -90 தொண்ணூறு \ No newline at end of file +81 எண்பத்தொன்று +82 எண்பத்திரண்டு +83 எண்பத்துமூன்று +84 எண்பத்துநான்கு +85 எண்பத்தைந்து +86 எண்பத்தாறு +87 எண்பத்தேழு +88 எண்பத்தெட்டு +89 எண்பத்தொன்பது +90 தொண்ணூறு +91 தொண்ணூற்றொன்று +92 தொண்ணூற்றிரண்டு +93 தொண்ணூற்றுமூன்று +94 தொண்ணூற்றுநான்கு +95 தொண்ணூற்றைந்து +96 தொண்ணூற்றாறு +97 தொண்ணூற்றேழு +98 தொண்ணூற்றெட்டு +99 தொண்ணூற்றொன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/graph_utils.py b/nemo_text_processing/text_normalization/ta/graph_utils.py index e8543d9ad..854bcb8e5 100644 --- a/nemo_text_processing/text_normalization/ta/graph_utils.py +++ b/nemo_text_processing/text_normalization/ta/graph_utils.py @@ -1,5 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. -# Copyright 2015 and onwards Google, Inc. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/nemo_text_processing/text_normalization/ta/taggers/__init__.py b/nemo_text_processing/text_normalization/ta/taggers/__init__.py index e69de29bb..2f2f217f3 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/__init__.py +++ b/nemo_text_processing/text_normalization/ta/taggers/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py index f336995de..e7cf19655 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py +++ b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py @@ -1,3 +1,17 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini from pynini.lib import pynutil @@ -5,9 +19,13 @@ from nemo_text_processing.text_normalization.ta.utils import get_abs_path -class CardinalFst(GraphFst): +class CardinalFst(GraphFst): """ - Classifies cardinal numbers, e.g. 5 -> cardinal { integer: "" } + Finite state transducer for classifying cardinals, e.g. + 5 -> cardinal { integer: "ஐந்து" } + Args: + deterministic: if True will provide a single transduction option, + for False multiple transduction are generated (used for audio-based normalization) """ def __init__(self, deterministic: bool = True): @@ -17,18 +35,12 @@ def __init__(self, deterministic: bool = True): digit = pynini.string_file(get_abs_path("data/numbers/digit.tsv")) zero = pynini.string_file(get_abs_path("data/numbers/zero.tsv")) teens_and_ties = pynini.string_file(get_abs_path("data/numbers/teens_and_ties.tsv")) - - # TODO 1: Combine the three transducers into one grammar so it accepts - # a single digit (1-9), zero (0), OR a two-digit number. - # Hint: the union operator in pynini is | - graph = digit | zero | teens_and_ties # <-- complete this + + graph = digit | zero | teens_and_ties graph = graph.optimize() - # TODO 2: Wrap the word in the token field the verbalizer expects: - # produce integer: "" - # Hint: pynutil.insert("text") writes literal text into the output. final_graph = pynutil.insert('integer: "') + graph + pynutil.insert('"') # add_tokens() turns it into: cardinal { integer: "" } final_graph = self.add_tokens(final_graph) - self.fst = final_graph.optimize() + self.fst = final_graph.optimize() \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py b/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py index e69de29bb..2f2f217f3 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py index 9dbde23e2..24e300c1b 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py @@ -1,3 +1,17 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini from pynini.lib import pynutil @@ -8,23 +22,23 @@ ) -class CardinalFst(GraphFst): +class CardinalFst(GraphFst): """ - Verbalizes cardinals, e.g. cardinal { integer: "" } -> + Finite state transducer for verbalizing cardinal, e.g. + cardinal { integer: "5" } -> ஐந்து + Args: + deterministic: if True will provide a single transduction option, + for False multiple options (used for audio-based normalization) """ def __init__(self, deterministic: bool = True): super().__init__(name="cardinal", kind="verbalize", deterministic=deterministic) - - # TODO 3: Remove integer: " before the word and the closing " after it, - # keeping the word itself. - # Hint: pynutil.delete("text") deletes literal text; - # NEMO_NOT_QUOTE matches any character that is not a quote. + graph = ( pynutil.delete("integer:") + delete_space + pynutil.delete('"') - + pynini.closure(NEMO_NOT_QUOTE, 1) # <-- keep the word (1 or more non-quote chars) + + pynini.closure(NEMO_NOT_QUOTE, 1) + pynutil.delete('"') ) diff --git a/test_cases_cardinal.txt b/test_cases_cardinal.txt index c3da1bbbc..17716aafb 100644 --- a/test_cases_cardinal.txt +++ b/test_cases_cardinal.txt @@ -19,10 +19,82 @@ 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~எண்பது -90~தொண்ணூறு \ No newline at end of file +81~எண்பத்தொன்று +82~எண்பத்திரண்டு +83~எண்பத்துமூன்று +84~எண்பத்துநான்கு +85~எண்பத்தைந்து +86~எண்பத்தாறு +87~எண்பத்தேழு +88~எண்பத்தெட்டு +89~எண்பத்தொன்பது +90~தொண்ணூறு +91~தொண்ணூற்றொன்று +92~தொண்ணூற்றிரண்டு +93~தொண்ணூற்றுமூன்று +94~தொண்ணூற்றுநான்கு +95~தொண்ணூற்றைந்து +96~தொண்ணூற்றாறு +97~தொண்ணூற்றேழு +98~தொண்ணூற்றெட்டு +99~தொண்ணூற்றொன்பது \ No newline at end of file From 85f3d7bb6db90e40dab5fde0fbdeaa587d2891b0 Mon Sep 17 00:00:00 2001 From: surendran-246 Date: Tue, 16 Jun 2026 18:18:12 +0530 Subject: [PATCH 3/5] message Signed-off-by: surendran-246 --- "eval \"$(ssh-agent -s)\" " | 7 + "eval \"$(ssh-agent -s)\" .pub" | 1 + .../text_normalization/blind_testcases_ta | 1398 +++++++++++++++++ .../text_normalization/normalize.py | 16 +- .../text_normalization/run_evaluate.py | 6 +- .../ta/data/numbers/digit.tsv | 9 + .../ta/data/numbers/hundred_ta.tsv | 18 + .../ta/data/numbers/teens_and_ties.tsv | 180 +-- .../ta/data/numbers/teens_and_ties_en.tsv | 90 ++ .../ta/data/numbers/thousands.tsv | 8 + .../ta/data/numbers/zero.tsv | 1 + .../text_normalization/ta/graph_utils.py | 58 +- .../text_normalization/ta/taggers/cardinal.py | 478 +++++- .../ta/taggers/punctuation.py | 48 + .../ta/taggers/tokenize_and_classify.py | 168 ++ .../text_normalization/ta/taggers/word.py | 61 + .../ta/verbalizers/cardinal.py | 61 +- .../ta/verbalizers/post_processing.py | 96 ++ .../ta/verbalizers/verbalize.py | 53 + .../ta/verbalizers/verbalize_final.py | 76 + .../text_normalization/ta/verbalizers/word.py | 43 + run_cardinal_tests.py | 48 + tests/nemo_text_processing/ta/__init__.py | 13 + .../text_cases_cardinal.txt | 54 + .../test_cases_cardinal.txt | 148 ++ .../nemo_text_processing/ta/test_cardinal.py | 42 + 26 files changed, 2996 insertions(+), 185 deletions(-) create mode 100644 "eval \"$(ssh-agent -s)\" " create mode 100644 "eval \"$(ssh-agent -s)\" .pub" create mode 100644 nemo_text_processing/text_normalization/blind_testcases_ta create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/hundred_ta.tsv create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/thousands.tsv create mode 100644 nemo_text_processing/text_normalization/ta/taggers/punctuation.py create mode 100644 nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py create mode 100644 nemo_text_processing/text_normalization/ta/taggers/word.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/post_processing.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/word.py create mode 100644 run_cardinal_tests.py create mode 100644 tests/nemo_text_processing/ta/__init__.py create mode 100644 tests/nemo_text_processing/ta/data_inverse_text_normalization/text_cases_cardinal.txt create mode 100644 tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt create mode 100644 tests/nemo_text_processing/ta/test_cardinal.py diff --git "a/eval \"$(ssh-agent -s)\" " "b/eval \"$(ssh-agent -s)\" " new file mode 100644 index 000000000..b14c82405 --- /dev/null +++ "b/eval \"$(ssh-agent -s)\" " @@ -0,0 +1,7 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACCBMyvfUYcSi2sN3FiNKP92mA4jqEmXAt9Mz/oDhT/pJwAAAJieiaaMnomm +jAAAAAtzc2gtZWQyNTUxOQAAACCBMyvfUYcSi2sN3FiNKP92mA4jqEmXAt9Mz/oDhT/pJw +AAAED1t2yISojEhh/YjRHWLfYQOZzCun70VF+ZVvMWjWh3I4EzK99RhxKLaw3cWI0o/3aY +DiOoSZcC30zP+gOFP+knAAAAFXN1cmVuZHJhbnNAbnZpZGlhLmNvbQ== +-----END OPENSSH PRIVATE KEY----- diff --git "a/eval \"$(ssh-agent -s)\" .pub" "b/eval \"$(ssh-agent -s)\" .pub" new file mode 100644 index 000000000..90b5c176a --- /dev/null +++ "b/eval \"$(ssh-agent -s)\" .pub" @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIEzK99RhxKLaw3cWI0o/3aYDiOoSZcC30zP+gOFP+kn surendrans@nvidia.com diff --git a/nemo_text_processing/text_normalization/blind_testcases_ta b/nemo_text_processing/text_normalization/blind_testcases_ta new file mode 100644 index 000000000..4a2911adf --- /dev/null +++ b/nemo_text_processing/text_normalization/blind_testcases_ta @@ -0,0 +1,1398 @@ +CARDINAL ௪ சிக்ஸர்கள் ௧௪ பவுண்டரிகள் நான்கு சிக்ஸர்கள் பதினான்கு பவுண்டரிகள் + +CARDINAL ௬ ரன்கள் எடுத்தார் ஆறு ரன்கள் எடுத்தார் + +CARDINAL ௩ கோல்கள் அடித்தார் மூன்று கோல்கள் அடித்தார் + +CARDINAL ௯ சிக்ஸர்கள் ஒன்பது சிக்ஸர்கள் + +CARDINAL ௫ பவுண்டரிகள் ஐந்து பவுண்டரிகள் + +CARDINAL ௨ சிக்ஸர்கள் ௧௨ ரன்கள் இரண்டு சிக்ஸர்கள் பன்னிரண்டு ரன்கள் + +CARDINAL ௯ புள்ளிகள் ஒன்பது புள்ளிகள் + +CARDINAL ௪ பேர் உயிரிழப்பு ௧௮ பேர் காயம் நான்கு பேர் உயிரிழப்பு பதினெட்டு பேர் காயம் + +CARDINAL ௫ கோல்கள் அடித்தனர் ஐந்து கோல்கள் அடித்தனர் + +CARDINAL ௩ பேட்ஸ்மேன்கள் ௧௨ வீரர்கள் மூன்று பேட்ஸ்மேன்கள் பன்னிரண்டு வீரர்கள் + +CARDINAL ௧ ஓவர் ௧௩ ரன்கள் ஒன்று ஓவர் பதிமூன்று ரன்கள் + +CARDINAL ௩ ஓவர்கள் மூன்று ஓவர்கள் + +CARDINAL ௫ கோல்கள் ஐந்து கோல்கள் + +CARDINAL ௩ ஆப்பிள்கள் மூன்று ஆப்பிள்கள் + +CARDINAL ௭ வாழைப்பழங்கள் ஏழு வாழைப்பழங்கள் + +CARDINAL ௩ தோல்வி ௧௨ வெற்றி மூன்று தோல்வி பன்னிரண்டு வெற்றி + +CARDINAL ௫ தோல்விகள் ௧ டிரா ௧௭ வெற்றிகள் ஐந்து தோல்விகள் ஒன்று டிரா பதினேழு வெற்றிகள் + +CARDINAL ௮ போட்டிகள் டிரா எட்டு போட்டிகள் டிரா + +CARDINAL ௪ பவுண்டரிகள் நான்கு பவுண்டரிகள் + +CARDINAL ௮ சிக்ஸர்கள் ௨ அவுட் எட்டு சிக்ஸர்கள் இரண்டு அவுட் + +CARDINAL ௬ வீரர்கள் அவுட் ஆறு வீரர்கள் அவுட் + +CARDINAL ௪ ரன்கள் ௩ பவுண்டரிகள் நான்கு ரன்கள் மூன்று பவுண்டரிகள் + +CARDINAL ஒன்பிளஸ் ௮ ப்ரோ ஒன்பிளஸ் எட்டு ப்ரோ + +CARDINAL ௫ சார்ஜர்கள் ஐந்து சார்ஜர்கள் + +CARDINAL ௪ ஓவரில் ௧௭ ரன்கள் நான்கு ஓவரில் பதினேழு ரன்கள் + +CARDINAL ௫ சாக்லேட்டுகள் ௯ டாபிகள் ஐந்து சாக்லேட்டுகள் ஒன்பது டாபிகள் + +CARDINAL ௬ பேட்ஸ்மேன்கள் ௨ பவுலர்கள் ஆறு பேட்ஸ்மேன்கள் இரண்டு பவுலர்கள் + +CARDINAL ௧ விக்கெட் கீப்பர் ஒன்று விக்கெட் கீப்பர் + +CARDINAL ௮ கேட்ச் அவுட் எட்டு கேட்ச் அவுட் + +CARDINAL ௫ விக்கெட்டுக்கு ௧௦ ரன்கள் ஐந்து விக்கெட்டுக்கு பத்து ரன்கள் + +CARDINAL ௭ வெற்றி ௨ டிரா ஏழு வெற்றி இரண்டு டிரா + +CARDINAL ௨ பவுண்டரிகள் இரண்டு பவுண்டரிகள் + +CARDINAL ௬ ரன்கள் ௫ விக்கெட்டுகள் ஆறு ரன்கள் ஐந்து விக்கெட்டுகள் + +CARDINAL ௭ பந்துகள் ௧௧ ரன்கள் ஏழு பந்துகள் பதினொன்று ரன்கள் + +CARDINAL ௬ சாக்லேட்டுகள் ௪ டாபிகள் ஆறு சாக்லேட்டுகள் நான்கு டாபிகள் + +CARDINAL ௮ வெண்கலங்கள் ௨ தங்கங்கள் எட்டு வெண்கலங்கள் இரண்டு தங்கங்கள் + +CARDINAL ௧ தங்கப் பதக்கம் ஒன்று தங்கப் பதக்கம் + +CARDINAL ௩ ரன்கள் மூன்று ரன்கள் + +CARDINAL ௫ ஓவர்கள் ஐந்து ஓவர்கள் + +CARDINAL ௬ பந்து ஆறு பந்து + +CARDINAL ௩ இன்னிங்ஸ் மூன்று இன்னிங்ஸ் + +CARDINAL வசனம் ௭ பாடம் ௧௫ வசனம் ஏழு பாடம் பதினைந்து + +CARDINAL பாடம் எண் ௨ வசனம் ௪ பாடம் எண் இரண்டு வசனம் நான்கு + +CARDINAL பக்க எண் ௮ பத்தி ௬ பக்க எண் எட்டு பத்தி ஆறு + +CARDINAL ௨ பந்துகள் ௪ ரன்கள் இரண்டு பந்துகள் நான்கு ரன்கள் + +CARDINAL ௬ விக்கெட்டுகள் ஆறு விக்கெட்டுகள் + +CARDINAL ௨ புள்ளி ௫ கோல்கள் இரண்டு புள்ளி ஐந்து கோல்கள் + +CARDINAL பாடம் ௧௦ ஸ்லோகம் ௨ பாடம் பத்து ஸ்லோகம் இரண்டு + +CARDINAL அத்தியாயம் ௫ காட்சி ௬ அத்தியாயம் ஐந்து காட்சி ஆறு + +CARDINAL ௬ கேள்விகள் ௫ தவறு ஆறு கேள்விகள் ஐந்து தவறு + +CARDINAL ௩ ரோஜா ௪ மல்லிகை ௨ சாமந்தி மூன்று ரோஜா நான்கு மல்லிகை இரண்டு சாமந்தி + +CARDINAL ௨ ஃப்ரீ ஹிட் ௧ நோ பால் இரண்டு ஃப்ரீ ஹிட் ஒன்று நோ பால் + +CARDINAL ௩ போன் ௧ சார்ஜர் மூன்று போன் ஒன்று சார்ஜர் + +CARDINAL ௬ டிரா ௭ தோல்வி ௯ வெற்றி ஆறு டிரா ஏழு தோல்வி ஒன்பது வெற்றி + +CARDINAL ௪ கார் ௨ பைக் நான்கு கார் இரண்டு பைக் + +CARDINAL ௧ கூடை ௮ பழம் ஒன்று கூடை எட்டு பழம் + +CARDINAL ௩ வரிசை ௮ நபர் மூன்று வரிசை எட்டு நபர் + +CARDINAL ௧௦ பென்சில் ௨ பேனா பத்து பென்சில் இரண்டு பேனா + +CARDINAL ௫ கட்டிடம் ஐந்து கட்டிடம் + +CARDINAL ௬ குழந்தை ஆறு குழந்தை + +CARDINAL பத்தி ௧௩ வரிசை ௪ பத்தி பதிமூன்று வரிசை நான்கு + +CARDINAL ௩ தங்கம் ௪ வெள்ளி மூன்று தங்கம் நான்கு வெள்ளி + +CARDINAL ௫ குழிகள் ஐந்து குழிகள் + +CARDINAL ௮ குப்பம் எட்டு குப்பம் + +CARDINAL ௩ லேப்டாப் மூன்று லேப்டாப் + +CARDINAL ௧ சிக்ஸர் ௨ பவுண்டரிகள் ஒன்று சிக்ஸர் இரண்டு பவுண்டரிகள் + +CARDINAL ௫ பஸ் ஐந்து பஸ் + +CARDINAL ௨ லாரி இரண்டு லாரி + +CARDINAL ௩ வண்டி மூன்று வண்டி + +CARDINAL ௬ சுறா ௩௦ முதலீட்டாளர்கள் ஆறு சுறா முப்பது முதலீட்டாளர்கள் + +CARDINAL ௨ அமைச்சர் ௫௦ பிரச்சனைகள் இரண்டு அமைச்சர் ஐம்பது பிரச்சனைகள் + +CARDINAL ௬ பவுலர் ஆறு பவுலர் + +CARDINAL ஸ்லோகம் ௩ பாடம் ௧ ஸ்லோகம் மூன்று பாடம் ஒன்று + +CARDINAL வரிசை ௬ பத்தி ௯ வரிசை ஆறு பத்தி ஒன்பது + +CARDINAL புத்தகம் ௧ பாடம் ௮ புத்தகம் ஒன்று பாடம் எட்டு + +CARDINAL சிறுகதை எண் ௨ வரிசை ௬ சிறுகதை எண் இரண்டு வரிசை ஆறு + +CARDINAL கைதி எண் ௪ கைதி எண் நான்கு + +CARDINAL பக்க எண் ௧௦ வரிசை ௨ பக்க எண் பத்து வரிசை இரண்டு + +CARDINAL ௪ மருத்துவர் நான்கு மருத்துவர் + +CARDINAL ௨ பந்து ௩ ரன் இரண்டு பந்து மூன்று ரன் + +CARDINAL புள்ளிகள் ௨ கோல் ௪ புள்ளிகள் இரண்டு கோல் நான்கு + +CARDINAL பாடம் எண் ௪ பாடம் எண் நான்கு + +CARDINAL ௮ ஓவர் எட்டு ஓவர் + +CARDINAL ௭ ரன் ௨ ஓவர் ஏழு ரன் இரண்டு ஓவர் + +CARDINAL ௪ பந்து ௮ ரன் நான்கு பந்து எட்டு ரன் + +CARDINAL ௩ பாட்டில் ௫ கிளாஸ் மூன்று பாட்டில் ஐந்து கிளாஸ் + +CARDINAL ௬ ரன் ஆறு ரன் + +CARDINAL ௬ கோல் ஆறு கோல் + +CARDINAL ௧௦ புள்ளிகள் ௩ கோல் பத்து புள்ளிகள் மூன்று கோல் + +CARDINAL ௧௪ சிக்ஸர் ௩ பவுண்டரி பதினான்கு சிக்ஸர் மூன்று பவுண்டரி + +CARDINAL ௬ ஆப்பிள் ௩ வாழைப்பழம் ஆறு ஆப்பிள் மூன்று வாழைப்பழம் + +CARDINAL ௩ மேட்ச் டிரா மூன்று மேட்ச் டிரா + +CARDINAL ௬ மேட்ச் தோல்வி ஆறு மேட்ச் தோல்வி + +CARDINAL ௯ மேட்ச் வெற்றி ஒன்பது மேட்ச் வெற்றி + +CARDINAL ஸ்லோகம் ௬ பாடம் ௯ ஸ்லோகம் ஆறு பாடம் ஒன்பது + +CARDINAL பதம் ௪ வரிசை எண் ௩ பதம் நான்கு வரிசை எண் மூன்று + +CARDINAL பாடம் ௧௦ பக்கம் ௪ பாடம் பத்து பக்கம் நான்கு + +CARDINAL ௫ கார் ௨ மோட்டார் சைக்கிள் ஐந்து கார் இரண்டு மோட்டார் சைக்கிள் + +CARDINAL ௭ புள்ளிகள் ௨ கோல் ஏழு புள்ளிகள் இரண்டு கோல் + +CARDINAL ௪ இரவு ௩ பகல் நான்கு இரவு மூன்று பகல் + +CARDINAL ௧ ஆஸ் ௧ ராணி ௫ சீட்டுகள் ஒன்று ஆஸ் ஒன்று ராணி ஐந்து சீட்டுகள் + +CARDINAL வரிசை ௨ பத்தி ௧ வரிசை இரண்டு பத்தி ஒன்று + +CARDINAL ௫ ஜோடி காலணி ஐந்து ஜோடி காலணி + +CARDINAL ௧௦ ஓவரில் ௯ ரன் பத்து ஓவரில் ஒன்பது ரன் + +CARDINAL ௮ ரன் எட்டு ரன் + +CARDINAL ௪ சிக்ஸர்கள் ௧ ஃபோர் நான்கு சிக்ஸர்கள் ஒன்று ஃபோர் + +CARDINAL பக்க எண் ௯ இன் வரிசை ௪ பக்க எண் ஒன்பது இன் வரிசை நான்கு + +CARDINAL பாரா ௧௦ இன் பகுதி ௩ பாரா பத்து இன் பகுதி மூன்று + +CARDINAL ஆயத் ௪ ருகூ ௬ ஆயத் நான்கு ருகூ ஆறு + +CARDINAL பாரா ௯ ருகூ ௬ பாரா ஒன்பது ருகூ ஆறு + +CARDINAL ௮ கால்சட்டைகள் ௯ சட்டைகள் எட்டு கால்சட்டைகள் ஒன்பது சட்டைகள் + +CARDINAL ௪ ரொட்டி ௨ காய்கறி நான்கு ரொட்டி இரண்டு காய்கறி + +CARDINAL ௩ மேட்ச் ௪ வெற்றி மூன்று மேட்ச் நான்கு வெற்றி + +CARDINAL ௪ தோல்வி ௩ வெற்றி ௧ டிரா நான்கு தோல்வி மூன்று வெற்றி ஒன்று டிரா + +CARDINAL படம் ௧௯ பாடம் ௨ படம் பத்தொன்பது பாடம் இரண்டு + +CARDINAL பாடம் ௧ பக்கம் ௧௨௨ பாடம் ஒன்று பக்கம் நூற்று இருபத்து இரண்டு + +CARDINAL பாடம் ௩ வரிசை ௬ பாடம் மூன்று வரிசை ஆறு + +CARDINAL ஸ்லோகம் ௧௦ பக்கம் ௩ ஸ்லோகம் பத்து பக்கம் மூன்று + +CARDINAL ௬ புள்ளிகள் ௩ கோல் ஆறு புள்ளிகள் மூன்று கோல் + +CARDINAL ௨ டெஸ்ட் போட்டிகள் ௬ ஒன்றுநாள் போட்டிகள் இரண்டு டெஸ்ட் போட்டிகள் ஆறு ஒன்றுநாள் போட்டிகள் + +CARDINAL ௨ ஓவரில் ௭ ரன் இரண்டு ஓவரில் ஏழு ரன் + +CARDINAL ௮ ஓவரில் ௪௫ ரன் எட்டு ஓவரில் நாற்பத்து ஐந்து ரன் + +CARDINAL ௯ ஓவரில் ௬௦ ரன் ஒன்பது ஓவரில் அறுபது ரன் + +CARDINAL ௫ போட்டிகள் ௪ வெற்றிகள் ஐந்து போட்டிகள் நான்கு வெற்றிகள் + +CARDINAL ௨ வெற்றி ௪ தோல்வி ௫ டிரா இரண்டு வெற்றி நான்கு தோல்வி ஐந்து டிரா + +CARDINAL ஸ்லோகம் ௯ பக்கம் ௭ ஸ்லோகம் ஒன்பது பக்கம் ஏழு + +CARDINAL பாடம் ௨ பக்கம் ௬௬ பாடம் இரண்டு பக்கம் அறுபத்து ஆறு + +CARDINAL ௨ டயகிராம் ௧௩ பக்க எண் இரண்டு டயகிராம் பதிமூன்று பக்க எண் + +CARDINAL பட எண் ௮ பாடம் ௪ பட எண் எட்டு பாடம் நான்கு + +CARDINAL பக்க எண் ௧௦ பாடம் ௩ பக்க எண் பத்து பாடம் மூன்று + +CARDINAL ருகு ௩ ஆயத் ௮ ருகு மூன்று ஆயத் எட்டு + +CARDINAL ருகு ௪ ஆயத் ௬ வரி ௩௩ ருகு நான்கு ஆயத் ஆறு வரி முப்பத்து மூன்று + +CARDINAL பாரா ௨ ருகு ௭ வரி ௧௫ பாரா இரண்டு ருகு ஏழு வரி பதினைந்து + +CARDINAL ௩௦ பாரா வரி ௮ முப்பது பாரா வரி எட்டு + +CARDINAL ௪ சிக்ஸர்கள் ௧௨ ஃபோர்கள் நான்கு சிக்ஸர்கள் பன்னிரண்டு ஃபோர்கள் + +CARDINAL ௫ புள்ளிகள் ௭ கோல்கள் ஐந்து புள்ளிகள் ஏழு கோல்கள் + +CARDINAL பதிப்பு ௨ தலைமுறை ௪ பதிப்பு இரண்டு தலைமுறை நான்கு + +CARDINAL ௮ செங்கற்கள் ௩௨ கற்கள் எட்டு செங்கற்கள் முப்பத்து இரண்டு கற்கள் + +CARDINAL ௯ ஓவரில் ௧௫ ரன்கள் ஒன்பது ஓவரில் பதினைந்து ரன்கள் + +CARDINAL ௪ விக்கெட் ௧௧௩ ரன்கள் நான்கு விக்கெட் நூற்று பதிமூன்று ரன்கள் + +CARDINAL ௭ விக்கெட் ௨௧௧ ரன்கள் ஏழு விக்கெட் இருநூற்று பதினொன்று ரன்கள் + +CARDINAL ௪ சிக்ஸர்கள் ௫ ஃபோர்கள் ௪௪ ரன்கள் நான்கு சிக்ஸர்கள் ஐந்து ஃபோர்கள் நாற்பத்து நான்கு ரன்கள் + +CARDINAL ருகு ௮ வரி ௧௦ ருகு எட்டு வரி பத்து + +CARDINAL பாடம் ௯ வரி ௧௩ பாடம் ஒன்பது வரி பதிமூன்று + +CARDINAL பகுதி ௧௦ வரி ௬ சுலோகம் ௨ பகுதி பத்து வரி ஆறு சுலோகம் இரண்டு + +CARDINAL பகுதி ௧௨ சுலோகம் ௩ வரி ௧௭ பகுதி பன்னிரண்டு சுலோகம் மூன்று வரி பதினேழு + +CARDINAL ௭ ஓவர் ஏழு ஓவர் + +CARDINAL ௬ ஃபோர்கள் ஆறு ஃபோர்கள் + +CARDINAL ௩ ஒன்றுநாள் ௫ டெஸ்ட் போட்டிகள் மூன்று ஒன்றுநாள் ஐந்து டெஸ்ட் போட்டிகள் + +CARDINAL ௭ வீரர்கள் ௨ காயம் ஏழு வீரர்கள் இரண்டு காயம் + +CARDINAL பதிப்பு ௩ தலைமுறை ௧௦ பதிப்பு மூன்று தலைமுறை பத்து + +CARDINAL ருகு ௧௪ பாரா ௮ ருகு பதினான்கு பாரா எட்டு + +CARDINAL சுலோகம் ௮ பாடம் ௬ சுலோகம் எட்டு பாடம் ஆறு + +CARDINAL விரிவுரை ௩ வகுப்பு ௮ விரிவுரை மூன்று வகுப்பு எட்டு + +CARDINAL வகுப்பு ௧௦ பிரிவு ௨ வகுப்பு பத்து பிரிவு இரண்டு + +CARDINAL ௩ டிரா ௨ தோல்வி மூன்று டிரா இரண்டு தோல்வி + +CARDINAL சுலோகம் ௩ பாடம் ௧௧ சுலோகம் மூன்று பாடம் பதினொன்று + +CARDINAL வரி ௬ பாடம் ௧௦ வரி ஆறு பாடம் பத்து + +CARDINAL ருகு ௨ பாரா ௧௫ ருகு இரண்டு பாரா பதினைந்து + +CARDINAL ௪ சிக்ஸர்கள் ௫ பந்துகள் நான்கு சிக்ஸர்கள் ஐந்து பந்துகள் + +CARDINAL ௨ பந்துகள் ௧ ரன் இரண்டு பந்துகள் ஒன்று ரன் + +CARDINAL வரி ௮ அத்தியாயம் ௧௯ வரி எட்டு அத்தியாயம் பத்தொன்பது + +CARDINAL பக்கம் ௧௦ பத்தி ௨ பக்கம் பத்து பத்தி இரண்டு + +CARDINAL ௯ ஓவரில் ௧௭ ரன்கள் ஒன்பது ஓவரில் பதினேழு ரன்கள் + +CARDINAL ௪ பந்துகளில் ௬ நான்கு பந்துகளில் ஆறு + +CARDINAL ௧௭ பந்துகளில் ௧௦ ரன்கள் பதினேழு பந்துகளில் பத்து ரன்கள் + +CARDINAL ௫ ஓவர் ௬௬ ரன்கள் ஐந்து ஓவர் அறுபத்து ஆறு ரன்கள் + +CARDINAL ௮ புள்ளிகள் ௯ கோல்கள் எட்டு புள்ளிகள் ஒன்பது கோல்கள் + +CARDINAL ௫ கொய்யாப்பழங்கள் ஐந்து கொய்யாப்பழங்கள் + +CARDINAL ௬ ருகு ௭ பாரா ஆறு ருகு ஏழு பாரா + +CARDINAL சுலோகம் ௮ பதம் ௯ சுலோகம் எட்டு பதம் ஒன்பது + +CARDINAL ௭ ஓவரில் ௨௧ ரன்கள் ஏழு ஓவரில் இருபத்து ஒன்று ரன்கள் + +CARDINAL ௧ ஓவரில் ௩ ரன்கள் ஒன்று ஓவரில் மூன்று ரன்கள் + +CARDINAL ௭ சிக்ஸர்கள் ௫ ஃபோர்கள் ஏழு சிக்ஸர்கள் ஐந்து ஃபோர்கள் + +CARDINAL ௩ சுலோகங்கள் மூன்று சுலோகங்கள் + +CARDINAL ௬ பக்கங்கள் ஆறு பக்கங்கள் + +CARDINAL ௫ சிக்ஸர்கள் ஐந்து சிக்ஸர்கள் + +CARDINAL ௩ பாட்டில்கள் ௧௦ கண்ணாடிகள் மூன்று பாட்டில்கள் பத்து கண்ணாடிகள் + +CARDINAL ௩ போட்டிகள் மூன்று போட்டிகள் + +CARDINAL ௬ போட்டிகள் ௪ டிரா ஆறு போட்டிகள் நான்கு டிரா + +CARDINAL ௨ பந்துகளில் ௩ ரன்கள் இரண்டு பந்துகளில் மூன்று ரன்கள் + +CARDINAL ௩ புள்ளிகள் ௪ கோல்கள் மூன்று புள்ளிகள் நான்கு கோல்கள் + +CARDINAL ஆயத் ௪ வரி ௯ ஆயத் நான்கு வரி ஒன்பது + +CARDINAL பாரா ௪ ருகு ௧௦ வரி ௧௭ பாரா நான்கு ருகு பத்து வரி பதினேழு + +CARDINAL பாரா ௬ ருகு ௨௫ வரி ௨௦ பாரா ஆறு ருகு இருபத்து ஐந்து வரி இருபது + +CARDINAL பாடம் ௩ தோஹா ௪ வரி ௨ பாடம் மூன்று தோஹா நான்கு வரி இரண்டு + +CARDINAL வரி ௮ சொல் ௬ வரி எட்டு சொல் ஆறு + +CARDINAL கட்டுரை ௧௦ பத்தி ௨ கட்டுரை பத்து பத்தி இரண்டு + +CARDINAL ௭ ஸ்வரங்கள் ஏழு ஸ்வரங்கள் + +CARDINAL பாடல் ௪ முகடை ௨ பாடல் நான்கு முகடை இரண்டு + +CARDINAL டிக்கெட் எண் ௯ வரி ௮ டிக்கெட் எண் ஒன்பது வரி எட்டு + +CARDINAL ஆயத் ௧௦ வரி ௧௮ ஆயத் பத்து வரி பதினெட்டு + +CARDINAL ௬ ஓவர் ௨௦ ரன்கள் ஆறு ஓவர் இருபது ரன்கள் + +CARDINAL ௮௦ ரன்கள் ௩ விக்கெட்டுகள் எண்பது ரன்கள் மூன்று விக்கெட்டுகள் + +CARDINAL ௪ ஸ்பின்னர்கள் ௩ பேட்ஸ்மேன்கள் ௧ விக்கெட் கீப்பர் நான்கு ஸ்பின்னர்கள் மூன்று பேட்ஸ்மேன்கள் ஒன்று விக்கெட் கீப்பர் + +CARDINAL ௧ கோல் கீப்பர் ௬ வீரர்கள் ஒன்று கோல் கீப்பர் ஆறு வீரர்கள் + +CARDINAL பாடம் ௧௮ பதம் ௫ பாடம் பதினெட்டு பதம் ஐந்து + +CARDINAL தோஹா ௬ வரி ௯ தோஹா ஆறு வரி ஒன்பது + +CARDINAL படம் ௬ பக்கம் ௮௦ படம் ஆறு பக்கம் எண்பது + +CARDINAL ௨ டிரா ௩ வெற்றி இரண்டு டிரா மூன்று வெற்றி + +CARDINAL ௪ வைவா ௩ தேர்வுகள் நான்கு வைவா மூன்று தேர்வுகள் + +CARDINAL ௪ தேர்வுகள் ௬ செஷனல்கள் நான்கு தேர்வுகள் ஆறு செஷனல்கள் + +CARDINAL ௩ தட்டுகள் ௪ கிண்ணங்கள் ௨ கரண்டிகள் மூன்று தட்டுகள் நான்கு கிண்ணங்கள் இரண்டு கரண்டிகள் + +CARDINAL ௪ டிரா ௫ வெற்றி நான்கு டிரா ஐந்து வெற்றி + +CARDINAL ௮ சிக்ஸர்கள் ௧௪ ஃபோர்கள் எட்டு சிக்ஸர்கள் பதினான்கு ஃபோர்கள் + +CARDINAL ௫ ஓவர்கள் ௪ விக்கெட்டுகள் ஐந்து ஓவர்கள் நான்கு விக்கெட்டுகள் + +CARDINAL ௩ ரன்கள் ௨ விக்கெட்டுகள் மூன்று ரன்கள் இரண்டு விக்கெட்டுகள் + +CARDINAL ௬ ஓவர்கள் ௪ ரன்கள் ஆறு ஓவர்கள் நான்கு ரன்கள் + +CARDINAL ௪ டெஸ்ட் போட்டிகள் ௧ ஒன்றுநாள் போட்டி நான்கு டெஸ்ட் போட்டிகள் ஒன்று ஒன்றுநாள் போட்டி + +CARDINAL ௨ புள்ளிகள் ௧௨ கோல்கள் இரண்டு புள்ளிகள் பன்னிரண்டு கோல்கள் + +CARDINAL ௭ கரண்டிகள் உடைந்தன ஏழு கரண்டிகள் உடைந்தன + +CARDINAL ௧௦ இல் ௬ மதிப்பெண்கள் பத்து இல் ஆறு மதிப்பெண்கள் + +CARDINAL பாடம் ௨ பக்க எண் ௧௨ பாடம் இரண்டு பக்க எண் பன்னிரண்டு + +CARDINAL ௧ ஓவரில் ௬ பந்துகள் ஒன்று ஓவரில் ஆறு பந்துகள் + +CARDINAL ௭ ஷாட்டுகள் சரியாக பட்டன ஏழு ஷாட்டுகள் சரியாக பட்டன + +CARDINAL இந்தியாவுக்கு ௪ புள்ளிகள் முன்னிலை இந்தியாவுக்கு நான்கு புள்ளிகள் முன்னிலை + +CARDINAL சதத்திற்கு ௩ ரன்கள் மீதம் சதத்திற்கு மூன்று ரன்கள் மீதம் + +CARDINAL ௧ தோல்வி ௨ டிரா ஒன்று தோல்வி இரண்டு டிரா + +CARDINAL அர்ஜென்டினா ௨ புள்ளிகள் பின்தங்கி அர்ஜென்டினா இரண்டு புள்ளிகள் பின்தங்கி + +CARDINAL ௨ கோல்கள் அடிக்கப்பட்டன இரண்டு கோல்கள் அடிக்கப்பட்டன + +CARDINAL ௮ கூடுதல் ரன்கள் எட்டு கூடுதல் ரன்கள் + +CARDINAL ௪ வைடு பந்துகள் நான்கு வைடு பந்துகள் + +CARDINAL வகுப்பு ௯ வகுப்பு ஒன்பது + +CARDINAL வகுப்பு ௫ வகுப்பு ஐந்து + +CARDINAL ௯ பகுதிகள் ஒன்பது பகுதிகள் + +CARDINAL வகுப்பு ௪ பாடம் ௩ வகுப்பு நான்கு பாடம் மூன்று + +CARDINAL பாடம் ௯ பாடம் ஒன்பது + +CARDINAL பக்க எண் ௮ பக்க எண் எட்டு + +CARDINAL ௪ பாட்டில்கள் நான்கு பாட்டில்கள் + +CARDINAL ௧௦௦ இல் ௪ மதிப்பெண்கள் நூறு இல் நான்கு மதிப்பெண்கள் + +CARDINAL ௮ மதிப்பெண்கள் எட்டு மதிப்பெண்கள் + +CARDINAL கண்ணாடி எண் ௨ கண்ணாடி எண் இரண்டு + +CARDINAL ௭ செருப்புகள் ஏழு செருப்புகள் + +CARDINAL ௫ காலணிகள் ஐந்து காலணிகள் + +CARDINAL ௨ சாண்டல்கள் இரண்டு சாண்டல்கள் + +CARDINAL ௭ விளையாட்டுகளில் வெற்றி ஏழு விளையாட்டுகளில் வெற்றி + +CARDINAL ௬ மூடிகள் ஆறு மூடிகள் + +CARDINAL ௧௦௦௦ ரூபாய் ௨ நோட்டுகள் ஆயிரம் ரூபாய் இரண்டு நோட்டுகள் + +CARDINAL ௧௯ இல் ௩ கண்ணாடிகள் பத்தொன்பது இல் மூன்று கண்ணாடிகள் + +CARDINAL பக்கம் ௧௯௯ பாடம் ௬ பக்கம் நூற்று தொண்ணூற்று ஒன்பது பாடம் ஆறு + +CARDINAL ௮ பாராக்கள் எட்டு பாராக்கள் + +CARDINAL பகுதி ௫ பாடம் ௧௯ பகுதி ஐந்து பாடம் பத்தொன்பது + +CARDINAL ௮௦ ரன்கள் ௬ விக்கெட்டுகள் எண்பது ரன்கள் ஆறு விக்கெட்டுகள் + +CARDINAL ௯ கூடுதல் ரன்கள் ஒன்பது கூடுதல் ரன்கள் + +CARDINAL ௧௧ பந்துகள் ௮ ரன்கள் பதினொன்று பந்துகள் எட்டு ரன்கள் + +CARDINAL ௨ மஞ்சள் ௮ சிவப்பு அட்டைகள் இரண்டு மஞ்சள் எட்டு சிவப்பு அட்டைகள் + +CARDINAL அத்தியாயம் ௧௨ சுலோகம் ௮ அத்தியாயம் பன்னிரண்டு சுலோகம் எட்டு + +CARDINAL பக்கம் ௮௮ அத்தியாயம் ௭ பக்கம் எண்பத்து எட்டு அத்தியாயம் ஏழு + +CARDINAL ௧௦௦ ரன்கள் ௫ விக்கெட்டுகள் நூறு ரன்கள் ஐந்து விக்கெட்டுகள் + +CARDINAL ௮ கோல்களால் வெற்றி எட்டு கோல்களால் வெற்றி + +CARDINAL ௩ சக்கர வாகனம் மூன்று சக்கர வாகனம் + +CARDINAL அத்தியாயம் ௧௯ பகுதி ௪ அத்தியாயம் பத்தொன்பது பகுதி நான்கு + +CARDINAL ௧௧ மாதங்கள் ௮ நாட்கள் பதினொன்று மாதங்கள் எட்டு நாட்கள் + +CARDINAL ௯ நாட்கள் ௧௨ மணி நேரம் ஒன்பது நாட்கள் பன்னிரண்டு மணி நேரம் + +CARDINAL ௪ கட்டுகள் ௧௩ அட்டைகள் நான்கு கட்டுகள் பதிமூன்று அட்டைகள் + +CARDINAL ௭ போட்டிகள் ௧௨ விக்கெட்டுகள் ஏழு போட்டிகள் பன்னிரண்டு விக்கெட்டுகள் + +CARDINAL ௧ மனிதன் ஒன்று மனிதன் + +CARDINAL ௨ பெண்கள் இரண்டு பெண்கள் + +CARDINAL ௩ குழந்தைகள் மூன்று குழந்தைகள் + +CARDINAL ௪ புத்தகங்கள் நான்கு புத்தகங்கள் + +CARDINAL ௫ அறைகள் ஐந்து அறைகள் + +CARDINAL ௬ வீடுகள் ஆறு வீடுகள் + +CARDINAL ௭ பக்கங்கள் ஏழு பக்கங்கள் + +CARDINAL ௮ நாணயங்கள் எட்டு நாணயங்கள் + +CARDINAL ௯ பெட்டிகள் ஒன்பது பெட்டிகள் + +CARDINAL ௧௦ வேலைகள் பத்து வேலைகள் + +CARDINAL ௧௧ பழங்கள் ௨ பூக்கள் பதினொன்று பழங்கள் இரண்டு பூக்கள் + +CARDINAL ௩ பூக்கள் மூன்று பூக்கள் + +CARDINAL ௧௩ பூந்தொட்டிகள் ௪ செடிகள் பதிமூன்று பூந்தொட்டிகள் நான்கு செடிகள் + +CARDINAL ௪ பப்பாளிப்பழங்கள் நான்கு பப்பாளிப்பழங்கள் + +CARDINAL ௫ மாம்பழங்கள் ஐந்து மாம்பழங்கள் + +CARDINAL ௬ வாழைப்பழங்கள் ஆறு வாழைப்பழங்கள் + +CARDINAL ௭ திராட்சைப்பழங்கள் ஏழு திராட்சைப்பழங்கள் + +CARDINAL ௮ ஆரஞ்சுப்பழங்கள் எட்டு ஆரஞ்சுப்பழங்கள் + +CARDINAL ௯ ஆப்பிள்கள் ஒன்பது ஆப்பிள்கள் + +CARDINAL ௧௦ சப்போட்டா பழங்கள் பத்து சப்போட்டா பழங்கள் + +CARDINAL ௧ தாமரை ஒன்று தாமரை + +CARDINAL ௨ கற்கள் இரண்டு கற்கள் + +CARDINAL ௩ நாற்காலிகள் மூன்று நாற்காலிகள் + +CARDINAL ௪ பைகள் நான்கு பைகள் + +CARDINAL ௫ தொலைபேசிகள் ஐந்து தொலைபேசிகள் + +CARDINAL ௬ அறைகள் ஆறு அறைகள் + +CARDINAL ௭ பெண்கள் ஏழு பெண்கள் + +CARDINAL ௮ புத்தகங்கள் எட்டு புத்தகங்கள் + +CARDINAL ௯ வாகனங்கள் ஒன்பது வாகனங்கள் + +CARDINAL ௧௦ நதிகள் பத்து நதிகள் + +CARDINAL ௩ எருமைகள் மூன்று எருமைகள் + +CARDINAL ௨ காலணிகள் இரண்டு காலணிகள் + +CARDINAL ௩ நாய்கள் மூன்று நாய்கள் + +CARDINAL ௪ குதிரைகள் நான்கு குதிரைகள் + +CARDINAL ௫ மகன்கள் ஐந்து மகன்கள் + +CARDINAL ௬ சேவல்கள் ஆறு சேவல்கள் + +CARDINAL ௭ கழுதைகள் ஏழு கழுதைகள் + +CARDINAL ௮ சிறுமிகள் எட்டு சிறுமிகள் + +CARDINAL ௯ சிறுவர்கள் ஒன்பது சிறுவர்கள் + +CARDINAL ௧௦ கேள்விகள் பத்து கேள்விகள் + +CARDINAL ௧ சட்டை ஒன்று சட்டை + +CARDINAL ௨ படகுகள் இரண்டு படகுகள் + +CARDINAL ௩ பெட்டிகள் மூன்று பெட்டிகள் + +CARDINAL ௪ மூடிகள் நான்கு மூடிகள் + +CARDINAL ௫ நோட்டுகள் ஐந்து நோட்டுகள் + +CARDINAL ௬ நாணயங்கள் ஆறு நாணயங்கள் + +CARDINAL ௭ காயங்கள் ஏழு காயங்கள் + +CARDINAL ௮ நிறங்கள் எட்டு நிறங்கள் + +CARDINAL ௯ மக்கள் ஒன்பது மக்கள் + +CARDINAL ௧௦ நாட்கள் பத்து நாட்கள் + +CARDINAL ௫ விஷயங்கள் ஐந்து விஷயங்கள் + +CARDINAL ௨ மருந்துகள் இரண்டு மருந்துகள் + +CARDINAL ௩ கூடுகள் மூன்று கூடுகள் + +CARDINAL ௪ தோழிகள் நான்கு தோழிகள் + +CARDINAL ௫ செடிகள் ஐந்து செடிகள் + +CARDINAL ௬ திரைகள் ஆறு திரைகள் + +CARDINAL ௭ பூனைகள் ஏழு பூனைகள் + +CARDINAL ௮ எலிகள் எட்டு எலிகள் + +CARDINAL ௯ வாகனங்கள் ஒன்பது வாகனங்கள் + +CARDINAL ௧௦ கண்கள் பத்து கண்கள் + +CARDINAL ௬ சுவர்கள் ஆறு சுவர்கள் + +CARDINAL ௨ கடிகாரங்கள் இரண்டு கடிகாரங்கள் + +CARDINAL ௩ பப்பாளிப்பழங்கள் மூன்று பப்பாளிப்பழங்கள் + +CARDINAL ௪ மிதிவண்டிகள் நான்கு மிதிவண்டிகள் + +CARDINAL ௫ ஜன்னல்கள் ஐந்து ஜன்னல்கள் + +CARDINAL ௬ கிளைகள் ஆறு கிளைகள் + +CARDINAL ௭ பொம்மைகள் ஏழு பொம்மைகள் + +CARDINAL ௮ கவிதைகள் எட்டு கவிதைகள் + +CARDINAL ௯ கதைகள் ஒன்பது கதைகள் + +CARDINAL ௧௦ கதைகள் பத்து கதைகள் + +CARDINAL ௭ மொட்டுகள் ஏழு மொட்டுகள் + +CARDINAL ௨ கோழிகள் இரண்டு கோழிகள் + +CARDINAL ௩ தெருக்கள் மூன்று தெருக்கள் + +CARDINAL ௪ தேதிகள் நான்கு தேதிகள் + +CARDINAL ௫ கருவிகள் ஐந்து கருவிகள் + +CARDINAL ௬ கன்னியர்கள் ஆறு கன்னியர்கள் + +CARDINAL ௭ தட்டுகள் ஏழு தட்டுகள் + +CARDINAL ௮ பெண்கள் எட்டு பெண்கள் + +CARDINAL ௯ இரவுகள் ஒன்பது இரவுகள் + +CARDINAL ௧௦ காய்கறிகள் பத்து காய்கறிகள் + +CARDINAL ௮ குழந்தைகள் எட்டு குழந்தைகள் + +CARDINAL ௨ தொப்பிகள் இரண்டு தொப்பிகள் + +CARDINAL ௩ சிறுமிகள் மூன்று சிறுமிகள் + +CARDINAL ௪ நதிகள் நான்கு நதிகள் + +CARDINAL ௫ பெண்கள் ஐந்து பெண்கள் + +CARDINAL ௬ பொட்டுகள் ஆறு பொட்டுகள் + +CARDINAL ௭ பெட்டிகள் ஏழு பெட்டிகள் + +CARDINAL ௯ பொம்மைகள் ஒன்பது பொம்மைகள் + +CARDINAL ௧௦ கதைகள் பத்து கதைகள் + +CARDINAL ௯ இதழ்கள் ஒன்பது இதழ்கள் + +CARDINAL ௨ கொடிகள் இரண்டு கொடிகள் + +CARDINAL ௩ கவிதைகள் மூன்று கவிதைகள் + +CARDINAL ௪ ஏரிகள் நான்கு ஏரிகள் + +CARDINAL ௫ செருப்புகள் ஐந்து செருப்புகள் + +CARDINAL ௬ பசுக்கள் ஆறு பசுக்கள் + +CARDINAL ௭ சாலைகள் ஏழு சாலைகள் + +CARDINAL ௮ கண்கள் எட்டு கண்கள் + +CARDINAL ௧௦ பேச்சுகள் பத்து பேச்சுகள் + +CARDINAL ௧௦௧ நூற்று ஒன்று + +CARDINAL ௧௦௨ நூற்று இரண்டு + +CARDINAL ௧௦௩ நூற்று மூன்று + +CARDINAL ௧௦௪ நூற்று நான்கு + +CARDINAL ௧௦௫ நூற்று ஐந்து + +CARDINAL ௧௦௬ நூற்று ஆறு + +CARDINAL ௧௦௭ நூற்று ஏழு + +CARDINAL ௧௦௮ நூற்று எட்டு + +CARDINAL ௧௦௯ நூற்று ஒன்பது + +CARDINAL ௧௧௦ நூற்று பத்து + +CARDINAL ௧௧௧ நூற்று பதினொன்று + +CARDINAL ௧௧௨ நூற்று பன்னிரண்டு + +CARDINAL ௧௧௩ நூற்று பதிமூன்று + +CARDINAL ௧௧௪ நூற்று பதினான்கு + +CARDINAL ௧௧௫ நூற்று பதினைந்து + +CARDINAL ௧௧௬ நூற்று பதினாறு + +CARDINAL ௮௧௭ எட்டுநூற்று பதினேழு + +CARDINAL ௮௧௮ எட்டுநூற்று பதினெட்டு + +CARDINAL ௮௧௯ எட்டுநூற்று பத்தொன்பது + +CARDINAL ௮௨௦ எட்டுநூற்று இருபது + +CARDINAL ௮௨௧ எட்டுநூற்று இருபத்து ஒன்று + +CARDINAL ௮௨௨ எட்டுநூற்று இருபத்து இரண்டு + +CARDINAL ௮௨௩ எட்டுநூற்று இருபத்து மூன்று + +CARDINAL ௮௨௪ எட்டுநூற்று இருபத்து நான்கு + +CARDINAL ௮௨௫ எட்டுநூற்று இருபத்து ஐந்து + +CARDINAL ௮௨௬ எட்டுநூற்று இருபத்து ஆறு + +CARDINAL ௮௨௭ எட்டுநூற்று இருபத்து ஏழு + +CARDINAL ௮௨௮ எட்டுநூற்று இருபத்து எட்டு + +CARDINAL ௮௨௯ எட்டுநூற்று இருபத்து ஒன்பது + +CARDINAL ௮௩௦ எட்டுநூற்று முப்பது + +CARDINAL ௮௩௧ எட்டுநூற்று முப்பத்து ஒன்று + +CARDINAL ௮௩௨ எட்டுநூற்று முப்பத்து இரண்டு + +CARDINAL ௮௩௩ எட்டுநூற்று முப்பத்து மூன்று + +CARDINAL ௮௩௪ எட்டுநூற்று முப்பத்து நான்கு + +CARDINAL ௮௩௫ எட்டுநூற்று முப்பத்து ஐந்து + +CARDINAL ௮௩௬ எட்டுநூற்று முப்பத்து ஆறு + +CARDINAL ௭௩௮ எழுநூற்று முப்பத்து எட்டு + +CARDINAL ௭௩௯ எழுநூற்று முப்பத்து ஒன்பது + +CARDINAL ௭௪௦ எழுநூற்று நாற்பது + +CARDINAL ௭௪௧ எழுநூற்று நாற்பத்து ஒன்று + +CARDINAL ௭௪௨ எழுநூற்று நாற்பத்து இரண்டு + +CARDINAL ௭௪௩ எழுநூற்று நாற்பத்து மூன்று + +CARDINAL ௭௪௪ எழுநூற்று நாற்பத்து நான்கு + +CARDINAL ௭௪௫ எழுநூற்று நாற்பத்து ஐந்து + +CARDINAL ௪௪௬ நானூற்று நாற்பத்து ஆறு + +CARDINAL ௪௪௭ நானூற்று நாற்பத்து ஏழு + +CARDINAL ௪௪௮ நானூற்று நாற்பத்து எட்டு + +CARDINAL ௪௪௯ நானூற்று நாற்பத்து ஒன்பது + +CARDINAL ௪௫௦ நானூற்று ஐம்பது + +CARDINAL ௪௬௧ நானூற்று அறுபத்து ஒன்று + +CARDINAL ௧௭௫ நூற்று எழுபத்து ஐந்து + +CARDINAL ௧௮௧ நூற்று எண்பத்து ஒன்று + +CARDINAL ௧௯௦ நூற்று தொண்ணூறு + +CARDINAL ௧௯௯ நூற்று தொண்ணூற்று ஒன்பது + +CARDINAL ௧௦௦௧ ஆயிரத்து ஒன்று + +CARDINAL ௧௦௦௨ ஆயிரத்து இரண்டு + +CARDINAL ௧௦௦௩ ஆயிரத்து மூன்று + +CARDINAL ௧௦௦௪ ஆயிரத்து நான்கு + +CARDINAL ௧௦௦௫ ஆயிரத்து ஐந்து + +CARDINAL ௧௦௦௬ ஆயிரத்து ஆறு + +CARDINAL ௧௦௦௭ ஆயிரத்து ஏழு + +CARDINAL ௧௦௦௮ ஆயிரத்து எட்டு + +CARDINAL ௧௦௦௯ ஆயிரத்து ஒன்பது + +CARDINAL ௧௦௧௦ ஆயிரத்து பத்து + +CARDINAL ௧௦௧௧ ஆயிரத்து பதினொன்று + +CARDINAL ௧௦௧௨ ஆயிரத்து பன்னிரண்டு + +CARDINAL ௧௦௧௩ ஆயிரத்து பதிமூன்று + +CARDINAL ௧௦௧௪ ஆயிரத்து பதினான்கு + +CARDINAL ௧௦௧௫ ஆயிரத்து பதினைந்து + +CARDINAL ௧௦௧௬ ஆயிரத்து பதினாறு + +CARDINAL ௧௦௧௭ ஆயிரத்து பதினேழு + +CARDINAL ௧௦௧௮ ஆயிரத்து பதினெட்டு + +CARDINAL ௧௦௧௯ ஆயிரத்து பத்தொன்பது + +CARDINAL ௧௦௨௦ ஆயிரத்து இருபது + +CARDINAL ௧௦௨௧ ஆயிரத்து இருபத்து ஒன்று + +CARDINAL ௧௦௨௨ ஆயிரத்து இருபத்து இரண்டு + +CARDINAL ௧௧௨௩ ஆயிரத்து நூற்று இருபத்து மூன்று + +CARDINAL ௧௪௨௪ ஆயிரத்து நானூற்று இருபத்து நான்கு + +CARDINAL ௧௫௨௫ ஆயிரத்து ஐந்நூற்று இருபத்து ஐந்து + +CARDINAL ௧௩௨௬ ஆயிரத்து முந்நூற்று இருபத்து ஆறு + +CARDINAL ௧௪௨௭ ஆயிரத்து நானூற்று இருபத்து ஏழு + +CARDINAL ௧௬௨௮ ஆயிரத்து அறுநூற்று இருபத்து எட்டு + +CARDINAL ௧௭௨௯ ஆயிரத்து எழுநூற்று இருபத்து ஒன்பது + +CARDINAL ௧௮௩௦ ஆயிரத்து எட்டுநூற்று முப்பது + +CARDINAL ௧௧௩௧ ஆயிரத்து நூற்று முப்பத்து ஒன்று + +CARDINAL ௧௨௩௨ ஆயிரத்து இருநூற்று முப்பத்து இரண்டு + +CARDINAL ௧௩௩௩ ஆயிரத்து முந்நூற்று முப்பத்து மூன்று + +CARDINAL ௧௪௩௪ ஆயிரத்து நானூற்று முப்பத்து நான்கு + +CARDINAL ௧௫௩௫ ஆயிரத்து ஐந்நூற்று முப்பத்து ஐந்து + +CARDINAL ௧௬௩௬ ஆயிரத்து அறுநூற்று முப்பத்து ஆறு + +CARDINAL ௧௭௩௭ ஆயிரத்து எழுநூற்று முப்பத்து ஏழு + +CARDINAL ௧௮௩௮ ஆயிரத்து எட்டுநூற்று முப்பத்து எட்டு + +CARDINAL ௧௯௩௯ ஆயிரத்து ஒன்பதுநூற்று முப்பத்து ஒன்பது + +CARDINAL ௧௦௪௦ ஆயிரத்து நாற்பது + +CARDINAL ௧௦௪௧ ஆயிரத்து நாற்பத்து ஒன்று + +CARDINAL ௧௦௪௨ ஆயிரத்து நாற்பத்து இரண்டு + +CARDINAL ௧௦௪௩ ஆயிரத்து நாற்பத்து மூன்று + +CARDINAL ௧௦௪௪ ஆயிரத்து நாற்பத்து நான்கு + +CARDINAL ௧௦௪௫ ஆயிரத்து நாற்பத்து ஐந்து + +CARDINAL ௧௦௪௬ ஆயிரத்து நாற்பத்து ஆறு + +CARDINAL ௧௦௪௭ ஆயிரத்து நாற்பத்து ஏழு + +CARDINAL ௧௦௪௮ ஆயிரத்து நாற்பத்து எட்டு + +CARDINAL ௧௦௪௯ ஆயிரத்து நாற்பத்து ஒன்பது + +CARDINAL ௧௦௫௦ ஆயிரத்து ஐம்பது + +CARDINAL ௧௦௬௧ ஆயிரத்து அறுபத்து ஒன்று + +CARDINAL ௧௦௭௫ ஆயிரத்து எழுபத்து ஐந்து + +CARDINAL ௧௦௮௧ ஆயிரத்து எண்பத்து ஒன்று + +CARDINAL ௧௦௯௦ ஆயிரத்து தொண்ணூறு + +CARDINAL ௧௦௯௯ ஆயிரத்து தொண்ணூற்று ஒன்பது + +CARDINAL ௧௦௦௦௧ பத்துஆயிரத்து ஒன்று + +CARDINAL ௧௦௦௦௨ பத்துஆயிரத்து இரண்டு + +CARDINAL ௧௦௨௦௩ பத்துஆயிரத்து இருநூற்று மூன்று + +CARDINAL ௧௦௩௦௪ பத்துஆயிரத்து முந்நூற்று நான்கு + +CARDINAL ௧௧௩௦௫ பதினொன்றுஆயிரத்து முந்நூற்று ஐந்து + +CARDINAL ௧௨௪௫௬ பன்னிரண்டுஆயிரத்து நானூற்று ஐம்பத்து ஆறு + +CARDINAL ௧௩௦௪௭ பதிமூன்றுஆயிரத்து நாற்பத்து ஏழு + +CARDINAL ௧௦௦௦௮ பத்துஆயிரத்து எட்டு + +CARDINAL ௧௦௦௦௯ பத்துஆயிரத்து ஒன்பது + +CARDINAL ௧௦௦௧௦ பத்துஆயிரத்து பத்து + +CARDINAL ௧௦௦௧௧ பத்துஆயிரத்து பதினொன்று + +CARDINAL ௧௦௦௧௨ பத்துஆயிரத்து பன்னிரண்டு + +CARDINAL ௧௦௦௧௩ பத்துஆயிரத்து பதிமூன்று + +CARDINAL ௧௦௦௧௪ பத்துஆயிரத்து பதினான்கு + +CARDINAL ௧௦௦௧௫ பத்துஆயிரத்து பதினைந்து + +CARDINAL ௧௦௦௧௬ பத்துஆயிரத்து பதினாறு + +CARDINAL ௧௦௦௧௭ பத்துஆயிரத்து பதினேழு + +CARDINAL ௧௦௦௧௮ பத்துஆயிரத்து பதினெட்டு + +CARDINAL ௧௦௦௧௯ பத்துஆயிரத்து பத்தொன்பது + +CARDINAL ௧௦௦௨௦ பத்துஆயிரத்து இருபது + +CARDINAL ௧௦௦௨௧ பத்துஆயிரத்து இருபத்து ஒன்று + +CARDINAL ௧௦௦௨௨ பத்துஆயிரத்து இருபத்து இரண்டு + +CARDINAL ௧௦௦௨௩ பத்துஆயிரத்து இருபத்து மூன்று + +CARDINAL ௧௦௦௨௪ பத்துஆயிரத்து இருபத்து நான்கு + +CARDINAL ௧௦௦௨௫ பத்துஆயிரத்து இருபத்து ஐந்து + +CARDINAL ௧௦௦௨௬ பத்துஆயிரத்து இருபத்து ஆறு + +CARDINAL ௧௦௦௨௭ பத்துஆயிரத்து இருபத்து ஏழு + +CARDINAL ௧௦௦௨௮ பத்துஆயிரத்து இருபத்து எட்டு + +CARDINAL ௧௦௦௨௯ பத்துஆயிரத்து இருபத்து ஒன்பது + +CARDINAL ௧௦௦௩௦ பத்துஆயிரத்து முப்பது + +CARDINAL ௧௦௦௩௧ பத்துஆயிரத்து முப்பத்து ஒன்று + +CARDINAL ௧௦௦௩௨ பத்துஆயிரத்து முப்பத்து இரண்டு + +CARDINAL ௧௦௦௩௩ பத்துஆயிரத்து முப்பத்து மூன்று + +CARDINAL ௧௦௦௩௪ பத்துஆயிரத்து முப்பத்து நான்கு + +CARDINAL ௧௦௦௩௫ பத்துஆயிரத்து முப்பத்து ஐந்து + +CARDINAL ௧௦௦௩௬ பத்துஆயிரத்து முப்பத்து ஆறு + +CARDINAL ௧௦௦௩௭ பத்துஆயிரத்து முப்பத்து ஏழு + +CARDINAL ௧௦௦௩௮ பத்துஆயிரத்து முப்பத்து எட்டு + +CARDINAL ௧௦௦௩௯ பத்துஆயிரத்து முப்பத்து ஒன்பது + +CARDINAL ௧௦௦௪௦ பத்துஆயிரத்து நாற்பது + +CARDINAL ௧௦௦௪௧ பத்துஆயிரத்து நாற்பத்து ஒன்று + +CARDINAL ௧௦௦௪௨ பத்துஆயிரத்து நாற்பத்து இரண்டு + +CARDINAL ௧௦௦௪௩ பத்துஆயிரத்து நாற்பத்து மூன்று + +CARDINAL ௧௦௦௪௪ பத்துஆயிரத்து நாற்பத்து நான்கு + +CARDINAL ௧௦௦௪௫ பத்துஆயிரத்து நாற்பத்து ஐந்து + +CARDINAL ௧௦௦௪௬ பத்துஆயிரத்து நாற்பத்து ஆறு + +CARDINAL ௧௦௦௪௭ பத்துஆயிரத்து நாற்பத்து ஏழு + +CARDINAL ௧௦௦௪௮ பத்துஆயிரத்து நாற்பத்து எட்டு + +CARDINAL ௧௦௦௪௯ பத்துஆயிரத்து நாற்பத்து ஒன்பது + +CARDINAL ௧௦௦௫௦ பத்துஆயிரத்து ஐம்பது + +CARDINAL ௧௦௦௬௧ பத்துஆயிரத்து அறுபத்து ஒன்று + +CARDINAL ௧௦௦௭௫ பத்துஆயிரத்து எழுபத்து ஐந்து + +CARDINAL ௧௦௦௮௧ பத்துஆயிரத்து எண்பத்து ஒன்று + +CARDINAL ௧௦௦௯௦ பத்துஆயிரத்து தொண்ணூறு + +CARDINAL ௧௦௦௯௯ பத்துஆயிரத்து தொண்ணூற்று ஒன்பது + +CARDINAL ௧௦௦௦௦௧ ஒன்று இலட்சத்து ஒன்று + +CARDINAL ௧௧௦௦௦௨ ஒன்று இலட்சத்து பத்துஆயிரத்து இரண்டு + +CARDINAL ௧௨௦௪௦௩ ஒன்று இலட்சத்து இருபதுஆயிரத்து நானூற்று மூன்று + +CARDINAL ௧௪௧௫௦௪ ஒன்று இலட்சத்து நாற்பத்து ஒன்றுஆயிரத்து ஐந்நூற்று நான்கு + +CARDINAL ௧௫௧௫௧௫ ஒன்று இலட்சத்து ஐம்பத்து ஒன்றுஆயிரத்து ஐந்நூற்று பதினைந்து + +CARDINAL ௧௦௦௦௦௬ ஒன்று இலட்சத்து ஆறு + +CARDINAL ௧௦௦௦௦௭ ஒன்று இலட்சத்து ஏழு + +CARDINAL ௧௦௦௦௦௮ ஒன்று இலட்சத்து எட்டு + +CARDINAL ௧௦௦௦௦௯ ஒன்று இலட்சத்து ஒன்பது + +CARDINAL ௧௦௦௦௧௦ ஒன்று இலட்சத்து பத்து + +CARDINAL ௧௦௦௦௧௧ ஒன்று இலட்சத்து பதினொன்று + +CARDINAL ௧௦௦௦௧௨ ஒன்று இலட்சத்து பன்னிரண்டு + +CARDINAL ௧௦௦௦௧௩ ஒன்று இலட்சத்து பதிமூன்று + +CARDINAL ௧௦௦௦௧௪ ஒன்று இலட்சத்து பதினான்கு + +CARDINAL ௧௦௦௦௧௫ ஒன்று இலட்சத்து பதினைந்து + +CARDINAL ௧௦௦௦௧௬ ஒன்று இலட்சத்து பதினாறு + +CARDINAL ௧௦௦௦௧௭ ஒன்று இலட்சத்து பதினேழு + +CARDINAL ௧௦௦௦௧௮ ஒன்று இலட்சத்து பதினெட்டு + +CARDINAL ௧௦௦௦௧௯ ஒன்று இலட்சத்து பத்தொன்பது + +CARDINAL ௧௦௦௦௨௦ ஒன்று இலட்சத்து இருபது + +CARDINAL ௧௦௦௦௨௧ ஒன்று இலட்சத்து இருபத்து ஒன்று + +CARDINAL ௧௦௦௦௨௨ ஒன்று இலட்சத்து இருபத்து இரண்டு + +CARDINAL ௧௦௦௦௨௩ ஒன்று இலட்சத்து இருபத்து மூன்று + +CARDINAL ௧௦௦௦௨௪ ஒன்று இலட்சத்து இருபத்து நான்கு + +CARDINAL ௧௦௦௦௨௫ ஒன்று இலட்சத்து இருபத்து ஐந்து + +CARDINAL ௧௦௦௦௨௬ ஒன்று இலட்சத்து இருபத்து ஆறு + +CARDINAL ௧௦௦௦௨௭ ஒன்று இலட்சத்து இருபத்து ஏழு + +CARDINAL ௧௦௦௦௨௮ ஒன்று இலட்சத்து இருபத்து எட்டு + +CARDINAL ௧௦௦௦௨௯ ஒன்று இலட்சத்து இருபத்து ஒன்பது + +CARDINAL ௧௦௦௦௩௦ ஒன்று இலட்சத்து முப்பது + +CARDINAL ௧௦௦௦௩௧ ஒன்று இலட்சத்து முப்பத்து ஒன்று + +CARDINAL ௧௦௦௦௩௨ ஒன்று இலட்சத்து முப்பத்து இரண்டு + +CARDINAL ௧௦௦௦௩௩ ஒன்று இலட்சத்து முப்பத்து மூன்று + +CARDINAL ௧௦௦௦௩௪ ஒன்று இலட்சத்து முப்பத்து நான்கு + +CARDINAL ௧௦௦௦௩௫ ஒன்று இலட்சத்து முப்பத்து ஐந்து + +CARDINAL ௧௦௦௦௩௬ ஒன்று இலட்சத்து முப்பத்து ஆறு + +CARDINAL ௧௦௦௦௩௭ ஒன்று இலட்சத்து முப்பத்து ஏழு + +CARDINAL ௧௦௦௦௩௮ ஒன்று இலட்சத்து முப்பத்து எட்டு + +CARDINAL ௧௦௦௦௩௯ ஒன்று இலட்சத்து முப்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௪௦ ஒன்று இலட்சத்து நாற்பது + +CARDINAL ௧௦௦௦௪௧ ஒன்று இலட்சத்து நாற்பத்து ஒன்று + +CARDINAL ௧௦௦௦௪௨ ஒன்று இலட்சத்து நாற்பத்து இரண்டு + +CARDINAL ௧௦௦௦௪௩ ஒன்று இலட்சத்து நாற்பத்து மூன்று + +CARDINAL ௧௦௦௦௪௪ ஒன்று இலட்சத்து நாற்பத்து நான்கு + +CARDINAL ௧௦௦௦௪௫ ஒன்று இலட்சத்து நாற்பத்து ஐந்து + +CARDINAL ௧௦௦௦௪௬ ஒன்று இலட்சத்து நாற்பத்து ஆறு + +CARDINAL ௧௦௦௦௪௭ ஒன்று இலட்சத்து நாற்பத்து ஏழு + +CARDINAL ௧௦௦௦௪௮ ஒன்று இலட்சத்து நாற்பத்து எட்டு + +CARDINAL ௧௦௦௦௪௯ ஒன்று இலட்சத்து நாற்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௫௦ ஒன்று இலட்சத்து ஐம்பது + +CARDINAL ௧௦௦௦௬௧ ஒன்று இலட்சத்து அறுபத்து ஒன்று + +CARDINAL ௧௦௦௦௭௫ ஒன்று இலட்சத்து எழுபத்து ஐந்து + +CARDINAL ௧௦௦௦௮௧ ஒன்று இலட்சத்து எண்பத்து ஒன்று + +CARDINAL ௧௦௦௦௯௦ ஒன்று இலட்சத்து தொண்ணூறு + +CARDINAL ௧௦௦௦௯௯ ஒன்று இலட்சத்து தொண்ணூற்று ஒன்பது + +CARDINAL ௧௦௦௦௦௦௧ பத்து இலட்சத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௨ பத்து இலட்சத்து இரண்டு + +CARDINAL ௧௦௦௦௦௦௩ பத்து இலட்சத்து மூன்று + +CARDINAL ௧௦௦௦௦௦௪ பத்து இலட்சத்து நான்கு + +CARDINAL ௧௦௦௦௦௦௫ பத்து இலட்சத்து ஐந்து + +CARDINAL ௧௦௦௦௦௦௬ பத்து இலட்சத்து ஆறு + +CARDINAL ௧௦௦௦௦௦௭ பத்து இலட்சத்து ஏழு + +CARDINAL ௧௦௦௦௦௦௮ பத்து இலட்சத்து எட்டு + +CARDINAL ௧௦௦௦௦௦௯ பத்து இலட்சத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௧௦ பத்து இலட்சத்து பத்து + +CARDINAL ௧௦௦௦௦௧௧ பத்து இலட்சத்து பதினொன்று + +CARDINAL ௧௦௦௦௦௧௨ பத்து இலட்சத்து பன்னிரண்டு + +CARDINAL ௧௦௦௦௦௧௩ பத்து இலட்சத்து பதிமூன்று + +CARDINAL ௧௦௦௦௦௧௪ பத்து இலட்சத்து பதினான்கு + +CARDINAL ௧௦௦௦௦௧௫ பத்து இலட்சத்து பதினைந்து + +CARDINAL ௧௦௦௦௦௧௬ பத்து இலட்சத்து பதினாறு + +CARDINAL ௧௦௦௦௦௧௭ பத்து இலட்சத்து பதினேழு + +CARDINAL ௧௦௦௦௦௧௮ பத்து இலட்சத்து பதினெட்டு + +CARDINAL ௧௦௦௦௦௧௯ பத்து இலட்சத்து பத்தொன்பது + +CARDINAL ௧௦௦௦௦௨௦ பத்து இலட்சத்து இருபது + +CARDINAL ௧௦௦௦௦௨௧ பத்து இலட்சத்து இருபத்து ஒன்று + +CARDINAL ௧௦௦௦௦௨௨ பத்து இலட்சத்து இருபத்து இரண்டு + +CARDINAL ௧௦௦௦௦௨௩ பத்து இலட்சத்து இருபத்து மூன்று + +CARDINAL ௧௦௦௦௦௨௪ பத்து இலட்சத்து இருபத்து நான்கு + +CARDINAL ௧௦௦௦௦௨௫ பத்து இலட்சத்து இருபத்து ஐந்து + +CARDINAL ௧௦௦௦௦௨௬ பத்து இலட்சத்து இருபத்து ஆறு + +CARDINAL ௧௦௦௦௦௨௭ பத்து இலட்சத்து இருபத்து ஏழு + +CARDINAL ௧௦௦௦௦௨௮ பத்து இலட்சத்து இருபத்து எட்டு + +CARDINAL ௧௦௦௦௦௨௯ பத்து இலட்சத்து இருபத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௩௦ பத்து இலட்சத்து முப்பது + +CARDINAL ௧௦௦௦௦௩௧ பத்து இலட்சத்து முப்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௩௨ பத்து இலட்சத்து முப்பத்து இரண்டு + +CARDINAL ௧௦௦௦௦௩௩ பத்து இலட்சத்து முப்பத்து மூன்று + +CARDINAL ௧௦௦௦௦௩௪ பத்து இலட்சத்து முப்பத்து நான்கு + +CARDINAL ௧௦௦௦௦௩௫ பத்து இலட்சத்து முப்பத்து ஐந்து + +CARDINAL ௧௦௦௦௦௩௬ பத்து இலட்சத்து முப்பத்து ஆறு + +CARDINAL ௧௦௦௦௦௩௭ பத்து இலட்சத்து முப்பத்து ஏழு + +CARDINAL ௧௦௦௦௦௩௮ பத்து இலட்சத்து முப்பத்து எட்டு + +CARDINAL ௧௦௦௦௦௩௯ பத்து இலட்சத்து முப்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௪௦ பத்து இலட்சத்து நாற்பது + +CARDINAL ௧௦௦௦௦௪௧ பத்து இலட்சத்து நாற்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௪௨ பத்து இலட்சத்து நாற்பத்து இரண்டு + +CARDINAL ௧௦௦௦௦௪௩ பத்து இலட்சத்து நாற்பத்து மூன்று + +CARDINAL ௧௦௦௦௦௪௪ பத்து இலட்சத்து நாற்பத்து நான்கு + +CARDINAL ௧௦௦௦௦௪௫ பத்து இலட்சத்து நாற்பத்து ஐந்து + +CARDINAL ௧௦௦௦௦௪௬ பத்து இலட்சத்து நாற்பத்து ஆறு + +CARDINAL ௧௦௦௦௦௪௭ பத்து இலட்சத்து நாற்பத்து ஏழு + +CARDINAL ௧௦௦௦௦௪௮ பத்து இலட்சத்து நாற்பத்து எட்டு + +CARDINAL ௧௦௦௦௦௪௯ பத்து இலட்சத்து நாற்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௫௦ பத்து இலட்சத்து ஐம்பது + +CARDINAL ௧௦௦௦௦௬௧ பத்து இலட்சத்து அறுபத்து ஒன்று + +CARDINAL ௧௦௦௦௦௭௫ பத்து இலட்சத்து எழுபத்து ஐந்து + +CARDINAL ௧௦௦௦௦௮௧ பத்து இலட்சத்து எண்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௯௦ பத்து இலட்சத்து தொண்ணூறு + +CARDINAL ௧௦௦௦௦௯௯ பத்து இலட்சத்து தொண்ணூற்று ஒன்பது + +CARDINAL ௧௦௦௦௦௦௦௧ ஒன்று கோடியே ஒன்று + +CARDINAL ௧௦௦௦௦௦௦௨ ஒன்று கோடியே இரண்டு + +CARDINAL ௧௦௦௦௦௦௦௩ ஒன்று கோடியே மூன்று + +CARDINAL ௧௦௦௦௦௦௦௪ ஒன்று கோடியே நான்கு + +CARDINAL ௧௦௦௦௦௦௦௫ ஒன்று கோடியே ஐந்து + +CARDINAL ௧௦௦௦௦௦௦௬ ஒன்று கோடியே ஆறு + +CARDINAL ௧௦௦௦௦௦௦௭ ஒன்று கோடியே ஏழு + +CARDINAL ௧௦௦௦௦௦௦௮ ஒன்று கோடியே எட்டு + +CARDINAL ௧௦௦௦௦௦௦௯ ஒன்று கோடியே ஒன்பது + +CARDINAL ௧௦௦௦௦௦௧௦ ஒன்று கோடியே பத்து + +CARDINAL ௧௦௦௦௦௦௧௧ ஒன்று கோடியே பதினொன்று + +CARDINAL ௧௦௦௦௦௦௧௨ ஒன்று கோடியே பன்னிரண்டு + +CARDINAL ௧௦௦௦௦௦௧௩ ஒன்று கோடியே பதிமூன்று + +CARDINAL ௧௦௦௦௦௦௧௪ ஒன்று கோடியே பதினான்கு + +CARDINAL ௧௦௦௦௦௦௧௫ ஒன்று கோடியே பதினைந்து + +CARDINAL ௧௦௦௦௦௦௧௬ ஒன்று கோடியே பதினாறு + +CARDINAL ௧௦௦௦௦௦௧௭ ஒன்று கோடியே பதினேழு + +CARDINAL ௧௦௦௦௦௦௧௮ ஒன்று கோடியே பதினெட்டு + +CARDINAL ௧௦௦௦௦௦௧௯ ஒன்று கோடியே பத்தொன்பது + +CARDINAL ௧௦௦௦௦௦௨௦ ஒன்று கோடியே இருபது + +CARDINAL ௧௦௦௦௦௦௨௧ ஒன்று கோடியே இருபத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௨௨ ஒன்று கோடியே இருபத்து இரண்டு + +CARDINAL ௧௦௦௦௦௦௨௩ ஒன்று கோடியே இருபத்து மூன்று + +CARDINAL ௧௦௦௦௦௦௨௪ ஒன்று கோடியே இருபத்து நான்கு + +CARDINAL ௧௦௦௦௦௦௨௫ ஒன்று கோடியே இருபத்து ஐந்து + +CARDINAL ௧௦௦௦௦௦௨௬ ஒன்று கோடியே இருபத்து ஆறு + +CARDINAL ௧௦௦௦௦௦௨௭ ஒன்று கோடியே இருபத்து ஏழு + +CARDINAL ௧௦௦௦௦௦௨௮ ஒன்று கோடியே இருபத்து எட்டு + +CARDINAL ௧௦௦௦௦௦௨௯ ஒன்று கோடியே இருபத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௦௩௦ ஒன்று கோடியே முப்பது + +CARDINAL ௧௦௦௦௦௦௩௧ ஒன்று கோடியே முப்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௩௨ ஒன்று கோடியே முப்பத்து இரண்டு + +CARDINAL ௧௦௦௦௦௦௩௩ ஒன்று கோடியே முப்பத்து மூன்று + +CARDINAL ௧௦௦௦௦௦௩௪ ஒன்று கோடியே முப்பத்து நான்கு + +CARDINAL ௧௦௦௦௦௦௩௫ ஒன்று கோடியே முப்பத்து ஐந்து + +CARDINAL ௧௦௦௦௦௦௩௬ ஒன்று கோடியே முப்பத்து ஆறு + +CARDINAL ௧௦௦௦௦௦௩௭ ஒன்று கோடியே முப்பத்து ஏழு + +CARDINAL ௧௦௦௦௦௦௩௮ ஒன்று கோடியே முப்பத்து எட்டு + +CARDINAL ௧௦௦௦௦௦௩௯ ஒன்று கோடியே முப்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௦௪௦ ஒன்று கோடியே நாற்பது + +CARDINAL ௧௦௦௦௦௦௪௧ ஒன்று கோடியே நாற்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௪௨ ஒன்று கோடியே நாற்பத்து இரண்டு + +CARDINAL ௧௦௦௦௦௦௪௩ ஒன்று கோடியே நாற்பத்து மூன்று + +CARDINAL ௧௦௦௦௦௦௪௪ ஒன்று கோடியே நாற்பத்து நான்கு + +CARDINAL ௧௦௦௦௦௦௪௫ ஒன்று கோடியே நாற்பத்து ஐந்து + +CARDINAL ௧௦௦௦௦௦௪௬ ஒன்று கோடியே நாற்பத்து ஆறு + +CARDINAL ௧௦௦௦௦௦௪௭ ஒன்று கோடியே நாற்பத்து ஏழு + +CARDINAL ௧௦௦௦௦௦௪௮ ஒன்று கோடியே நாற்பத்து எட்டு + +CARDINAL ௧௦௦௦௦௦௪௯ ஒன்று கோடியே நாற்பத்து ஒன்பது + +CARDINAL ௧௦௦௦௦௦௫௦ ஒன்று கோடியே ஐம்பது + +CARDINAL ௧௦௦௦௦௦௬௧ ஒன்று கோடியே அறுபத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௭௫ ஒன்று கோடியே எழுபத்து ஐந்து + +CARDINAL ௧௦௦௦௦௦௮௧ ஒன்று கோடியே எண்பத்து ஒன்று + +CARDINAL ௧௦௦௦௦௦௯௦ ஒன்று கோடியே தொண்ணூறு + +CARDINAL ௧௦௦௦௦௦௯௯ ஒன்று கோடியே தொண்ணூற்று ஒன்பது + +CARDINAL ௧௩௨௩ ஆயிரத்து முந்நூற்று இருபத்து மூன்று + +CARDINAL ௧௩௪௫ ஆயிரத்து முந்நூற்று நாற்பத்து ஐந்து + +CARDINAL ௧௩௪௫௬ பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு + +CARDINAL ௧௨௩௪௬ பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்து ஆறு + +CARDINAL ௧௨௩௪௫௬ ஒன்று இலட்சத்து இருபத்து மூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு + +CARDINAL ௮௭௨௯௮௭ எட்டு இலட்சத்து எழுபத்து இரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்து ஏழு + +CARDINAL ௯௮௭௬௦௯ ஒன்பது இலட்சத்து எண்பத்து ஏழுஆயிரத்து அறுநூற்று ஒன்பது + +CARDINAL ௯௮௭௬௭௮௯ தொண்ணூற்று எட்டு இலட்சத்து எழுபத்து ஆறுஆயிரத்து எழுநூற்று எண்பத்து ஒன்பது + +CARDINAL ௨௩௪௫௫௬௭ இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௧௨௩௪௫௫௬௭ ஒன்று கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௧௨௧௨௧௨௧௨௨ பன்னிரண்டு கோடியே பன்னிரண்டு இலட்சத்து பன்னிரண்டுஆயிரத்து நூற்று இருபத்து இரண்டு + +CARDINAL ௧௦௦௨௩௪௫௫௬௭ ஒன்று அரபு இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௧௧௨௨௩௪௫௫௬௭ ஒன்று அரபு பன்னிரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௧௦௨௨௩௪௫௫௬௭ ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௧௧௦௨௨௩௪௫௫௬௭ பதினொன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + +CARDINAL ௫௧௦௨௨௩௪௫௫௬௭ ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு + diff --git a/nemo_text_processing/text_normalization/normalize.py b/nemo_text_processing/text_normalization/normalize.py index d8ebf2f4d..01d8f3354 100644 --- a/nemo_text_processing/text_normalization/normalize.py +++ b/nemo_text_processing/text_normalization/normalize.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -163,9 +163,10 @@ def __init__( from nemo_text_processing.text_normalization.hi.taggers.tokenize_and_classify import ClassifyFst from nemo_text_processing.text_normalization.hi.verbalizers.post_processing import PostProcessingFst from nemo_text_processing.text_normalization.hi.verbalizers.verbalize_final import VerbalizeFinalFst - + if post_process: self.post_processor = PostProcessingFst(cache_dir=cache_dir, overwrite_cache=overwrite_cache) + elif lang == 'it': from nemo_text_processing.text_normalization.it.taggers.tokenize_and_classify import ClassifyFst from nemo_text_processing.text_normalization.it.verbalizers.verbalize_final import VerbalizeFinalFst @@ -191,6 +192,13 @@ def __init__( elif lang == 'ko': from nemo_text_processing.text_normalization.ko.taggers.tokenize_and_classify import ClassifyFst from nemo_text_processing.text_normalization.ko.verbalizers.verbalize_final import VerbalizeFinalFst + elif lang == 'ta': + from nemo_text_processing.text_normalization.ta.taggers.tokenize_and_classify import ClassifyFst + from nemo_text_processing.text_normalization.ta.verbalizers.post_processing import PostProcessingFst + from nemo_text_processing.text_normalization.ta.verbalizers.verbalize_final import VerbalizeFinalFst + + if post_process: + self.post_processor = PostProcessingFst(cache_dir=cache_dir, overwrite_cache=overwrite_cache) else: raise NotImplementedError(f"Language {lang} has not been supported yet.") @@ -391,7 +399,7 @@ def normalize( return text output = SPACE_DUP.sub(' ', output[1:]) - if self.lang in ["en", "hi", "vi"] and hasattr(self, 'post_processor') and self.post_processor is not None: + if self.lang in ["en", "hi", "ta", "vi"] and hasattr(self, 'post_processor') and self.post_processor is not None: output = self.post_process(output) if punct_post_process: @@ -737,7 +745,7 @@ def parse_args(): parser.add_argument( "--language", help="language", - choices=["en", "de", "es", "fr", "hu", "sv", "zh", "ar", "it", "hy", "ja", "hi", "ko", "vi", "pt"], + choices=["en", "de", "es", "fr", "hu", "sv", "zh", "ar", "it", "hy", "ja", "hi", "ta", "ko", "vi", "pt"], default="en", type=str, ) diff --git a/nemo_text_processing/text_normalization/run_evaluate.py b/nemo_text_processing/text_normalization/run_evaluate.py index 3a1964bbd..fd0fac207 100644 --- a/nemo_text_processing/text_normalization/run_evaluate.py +++ b/nemo_text_processing/text_normalization/run_evaluate.py @@ -35,7 +35,7 @@ def parse_args(): parser.add_argument( "--lang", help="language", - choices=['ar', 'de', 'en', 'es', 'fr', 'hu', 'it', 'ru', 'sv', 'zh', 'hy', 'hi', 'ko', 'vi', 'pt'], + choices=['ar', 'de', 'en', 'es', 'fr', 'hu', 'it', 'ru', 'sv', 'zh', 'hy', 'hi', 'ta', 'ko', 'vi', 'pt'], default="en", type=str, ) @@ -67,6 +67,10 @@ def parse_args(): to_lower = args.input_case == "lower_cased" training_data = load_files([file_path], to_lower=to_lower) + # print("Loading training data: " + file_path) + # to_lower = True if args.input_case == "lower_cased" else False + # training_data = load_files([file_path], to_lower=to_lower) + if args.filter: training_data = filter_loaded_data(training_data) diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv index d61749cbd..92111ede3 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/digit.tsv @@ -1,3 +1,12 @@ +௧ ஒன்று +௨ இரண்டு +௩ மூன்று +௪ நான்கு +௫ ஐந்து +௬ ஆறு +௭ ஏழு +௮ எட்டு +௯ ஒன்பது 1 ஒன்று 2 இரண்டு 3 மூன்று diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/hundred_ta.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/hundred_ta.tsv new file mode 100644 index 000000000..29621c1a9 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/hundred_ta.tsv @@ -0,0 +1,18 @@ +100 நூறு +200 இருநூற்று +300 முந்நூற்று +400 நானூற்று +500 ஐந்நூற்று +600 அறுநூற்று +700 எழுநூற்று +800 எட்டுநூற்று +900 ஒன்பதுநூற்று +௧௦௦ நூறு +௨௦௦ இருநூற்று +௩௦௦ முந்நூற்று +௪௦௦ நானூற்று +௫௦௦ ஐந்நூற்று +௬௦௦ அறுநூற்று +௭௦௦ எழுநூற்று +௮௦௦ எட்டுநூற்று +௯௦௦ ஒன்பதுநூற்று \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv index 21f9f65ef..4b1c3686c 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv @@ -1,90 +1,90 @@ -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 தொண்ணூற்றொன்பது \ No newline at end of file +௧௦ பத்து +௧௧ பதினொன்று +௧௨ பன்னிரண்டு +௧௩ பதிமூன்று +௧௪ பதினான்கு +௧௫ பதினைந்து +௧௬ பதினாறு +௧௭ பதினேழு +௧௮ பதினெட்டு +௧௯ பத்தொன்பது +௨௦ இருபது +௨௧ இருபத்து ஒன்று +௨௨ இருபத்து இரண்டு +௨௩ இருபத்து மூன்று +௨௪ இருபத்து நான்கு +௨௫ இருபத்து ஐந்து +௨௬ இருபத்து ஆறு +௨௭ இருபத்து ஏழு +௨௮ இருபத்து எட்டு +௨௯ இருபத்து ஒன்பது +௩௦ முப்பது +௩௧ முப்பத்து ஒன்று +௩௨ முப்பத்து இரண்டு +௩௩ முப்பத்து மூன்று +௩௪ முப்பத்து நான்கு +௩௫ முப்பத்து ஐந்து +௩௬ முப்பத்து ஆறு +௩௭ முப்பத்து ஏழு +௩௮ முப்பத்து எட்டு +௩௯ முப்பத்து ஒன்பது +௪௦ நாற்பது +௪௧ நாற்பத்து ஒன்று +௪௨ நாற்பத்து இரண்டு +௪௩ நாற்பத்து மூன்று +௪௪ நாற்பத்து நான்கு +௪௫ நாற்பத்து ஐந்து +௪௬ நாற்பத்து ஆறு +௪௭ நாற்பத்து ஏழு +௪௮ நாற்பத்து எட்டு +௪௯ நாற்பத்து ஒன்பது +௫௦ ஐம்பது +௫௧ ஐம்பத்து ஒன்று +௫௨ ஐம்பத்து இரண்டு +௫௩ ஐம்பத்து மூன்று +௫௪ ஐம்பத்து நான்கு +௫௫ ஐம்பத்து ஐந்து +௫௬ ஐம்பத்து ஆறு +௫௭ ஐம்பத்து ஏழு +௫௮ ஐம்பத்து எட்டு +௫௯ ஐம்பத்து ஒன்பது +௬௦ அறுபது +௬௧ அறுபத்து ஒன்று +௬௨ அறுபத்து இரண்டு +௬௩ அறுபத்து மூன்று +௬௪ அறுபத்து நான்கு +௬௫ அறுபத்து ஐந்து +௬௬ அறுபத்து ஆறு +௬௭ அறுபத்து ஏழு +௬௮ அறுபத்து எட்டு +௬௯ அறுபத்து ஒன்பது +௭௦ எழுபது +௭௧ எழுபத்து ஒன்று +௭௨ எழுபத்து இரண்டு +௭௩ எழுபத்து மூன்று +௭௪ எழுபத்து நான்கு +௭௫ எழுபத்து ஐந்து +௭௬ எழுபத்து ஆறு +௭௭ எழுபத்து ஏழு +௭௮ எழுபத்து எட்டு +௭௯ எழுபத்து ஒன்பது +௮௦ எண்பது +௮௧ எண்பத்து ஒன்று +௮௨ எண்பத்து இரண்டு +௮௩ எண்பத்து மூன்று +௮௪ எண்பத்து நான்கு +௮௫ எண்பத்து ஐந்து +௮௬ எண்பத்து ஆறு +௮௭ எண்பத்து ஏழு +௮௮ எண்பத்து எட்டு +௮௯ எண்பத்து ஒன்பது +௯௦ தொண்ணூறு +௯௧ தொண்ணூற்று ஒன்று +௯௨ தொண்ணூற்று இரண்டு +௯௩ தொண்ணூற்று மூன்று +௯௪ தொண்ணூற்று நான்கு +௯௫ தொண்ணூற்று ஐந்து +௯௬ தொண்ணூற்று ஆறு +௯௭ தொண்ணூற்று ஏழு +௯௮ தொண்ணூற்று எட்டு +௯௯ தொண்ணூற்று ஒன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv new file mode 100644 index 000000000..5e4e47be4 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv @@ -0,0 +1,90 @@ +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 தொண்ணூற்று ஒன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/thousands.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/thousands.tsv new file mode 100644 index 000000000..31515f0f6 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/thousands.tsv @@ -0,0 +1,8 @@ +௧௦௦௦ ஆயிரம் +௧௦௦௦௦௦ லட்சம் +௧௦௦௦௦௦௦௦ கோடி +௧௦௦௦௦௦௦௦௦௦ அரபு +௧௦௦௦௦௦௦௦௦௦௦௦ கரபு +௧௦௦௦௦௦௦௦௦௦௦௦௦௦ நீல் +௧௦௦௦௦௦௦௦௦௦௦௦௦௦௦௦ பத்மம் +௧௦௦௦௦௦௦௦௦௦௦௦௦௦௦௦௦௦ சங்கம் diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv index 13de36a14..c5011b29f 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/zero.tsv @@ -1 +1,2 @@ +௦ சுழியம் 0 சுழியம் \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/graph_utils.py b/nemo_text_processing/text_normalization/ta/graph_utils.py index 854bcb8e5..20082e127 100644 --- a/nemo_text_processing/text_normalization/ta/graph_utils.py +++ b/nemo_text_processing/text_normalization/ta/graph_utils.py @@ -26,26 +26,26 @@ NEMO_CHAR = utf8.VALID_UTF8_CHAR NEMO_DIGIT = byte.DIGIT -NEMO_HI_DIGIT = pynini.union("०", "१", "२", "३", "४", "५", "६", "७", "८", "९").optimize() -NEMO_HI_NON_ZERO = pynini.union("१", "२", "३", "४", "५", "६", "७", "८", "९").optimize() -NEMO_HI_ZERO = "०" -# Combined Hindi and Arabic digits for graphs that need to accept both -NEMO_ALL_DIGIT = pynini.union(NEMO_HI_DIGIT, NEMO_DIGIT).optimize() -NEMO_ALL_ZERO = pynini.union("०", "0").optimize() -NEMO_ALL_NON_ZERO = pynini.union(NEMO_HI_NON_ZERO, "1", "2", "3", "4", "5", "6", "7", "8", "9").optimize() - -HI_DEDH = "डेढ़" # 1.5 -HI_DHAI = "ढाई" # 2.5 -HI_SAVVA = "सवा" # quarter more (1.25) -HI_SADHE = "साढ़े" # half more (X.5) -HI_PAUNE = "पौने" # quarter less (0.75) - -# Hindi decimal representations -HI_POINT_FIVE = ".५" # .5 -HI_ONE_POINT_FIVE = "१.५" # 1.5 -HI_TWO_POINT_FIVE = "२.५" # 2.5 -HI_DECIMAL_25 = ".२५" # .25 -HI_DECIMAL_75 = ".७५" # .75 +NEMO_TA_DIGIT = pynini.union("௦", "௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯").optimize() +NEMO_TA_NON_ZERO = pynini.union("௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯").optimize() +NEMO_TA_ZERO = "௦" +# Combined TAMIL and Arabic digits for graphs that need to accept both +NEMO_ALL_DIGIT = pynini.union(NEMO_TA_DIGIT, NEMO_DIGIT).optimize() +NEMO_ALL_ZERO = pynini.union("௦", "0").optimize() +NEMO_ALL_NON_ZERO = pynini.union(NEMO_TA_NON_ZERO, "1", "2", "3", "4", "5", "6", "7", "8", "9").optimize() + +TA_ONRARAI = "ஒன்றரை" # 1.5 +TA_IRANDARAI = "இரண்டரை" # 2.5 +TA_ONRUKAAL = "ஒன்றுகால்" # quarter more (1.25) +TA_ARAI = "அரை" # half more (X.5) +TA_MUKKAAL = "முக்கால்" # quarter less (0.75) + +# Tamil decimal representations +TA_POINT_FIVE = ".௫" # .5 +TA_ONE_POINT_FIVE = "௧.௫" # 1.5 +TA_TWO_POINT_FIVE = "௨.௫" # 2.5 +TA_DECIMAL_25 = ".௨௫" # .25 +TA_DECIMAL_75 = ".௭௫" # .75 # Arabic/English decimal representations EN_POINT_FIVE = ".5" @@ -54,15 +54,15 @@ EN_DECIMAL_25 = ".25" EN_DECIMAL_75 = ".75" -# Combined Hindi and English decimal patterns -POINT_FIVE = pynini.union(HI_POINT_FIVE, EN_POINT_FIVE).optimize() -ONE_POINT_FIVE = pynini.union(HI_ONE_POINT_FIVE, EN_ONE_POINT_FIVE).optimize() -TWO_POINT_FIVE = pynini.union(HI_TWO_POINT_FIVE, EN_TWO_POINT_FIVE).optimize() -DECIMAL_25 = pynini.union(HI_DECIMAL_25, EN_DECIMAL_25).optimize() -DECIMAL_75 = pynini.union(HI_DECIMAL_75, EN_DECIMAL_75).optimize() +# Combined Tamil and English decimal patterns +POINT_FIVE = pynini.union(TA_POINT_FIVE, EN_POINT_FIVE).optimize() +ONE_POINT_FIVE = pynini.union(TA_ONE_POINT_FIVE, EN_ONE_POINT_FIVE).optimize() +TWO_POINT_FIVE = pynini.union(TA_TWO_POINT_FIVE, EN_TWO_POINT_FIVE).optimize() +DECIMAL_25 = pynini.union(TA_DECIMAL_25, EN_DECIMAL_25).optimize() +DECIMAL_75 = pynini.union(TA_DECIMAL_75, EN_DECIMAL_75).optimize() # Symbol constants -HI_BY = "बाई" +TA_BY = "வகுத்தல்" LOWERCASE_X = "x" UPPERCASE_X = "X" ASTERISK = "*" @@ -70,7 +70,7 @@ SLASH = "/" COMMA = "," PERIOD = "." -HI_PERIOD = "।" +TA_PERIOD = "।" NEMO_LOWER = pynini.union(*string.ascii_lowercase).optimize() NEMO_UPPER = pynini.union(*string.ascii_uppercase).optimize() @@ -100,7 +100,7 @@ MIN_POS_WEIGHT = 0.0001 INPUT_CASED = "cased" INPUT_LOWER_CASED = "lower_cased" -MINUS = pynini.union(" ऋणात्मक ", " ऋणात्मक ").optimize() +MINUS = pynini.union(" எதிர்மறை ", " எதிர்மறை ").optimize() def capitalized_input_graph( diff --git a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py index e7cf19655..2c6e83596 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py +++ b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py @@ -11,36 +11,452 @@ # 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 pynini +from pynini.lib import pynutil +from nemo_text_processing.text_normalization.ta.graph_utils import ( + NEMO_ALL_DIGIT, + NEMO_ALL_ZERO, + GraphFst, + insert_space, +) +from nemo_text_processing.text_normalization.ta.utils import get_abs_path -import pynini -from pynini.lib import pynutil - -from nemo_text_processing.text_normalization.ta.graph_utils import GraphFst -from nemo_text_processing.text_normalization.ta.utils import get_abs_path - - class CardinalFst(GraphFst): - """ - Finite state transducer for classifying cardinals, e.g. - 5 -> cardinal { integer: "ஐந்து" } - Args: - deterministic: if True will provide a single transduction option, - for False multiple transduction are generated (used for audio-based normalization) - """ - - def __init__(self, deterministic: bool = True): - super().__init__(name="cardinal", kind="classify", deterministic=deterministic) - - # Load the three data files as transducers (number -> word) - digit = pynini.string_file(get_abs_path("data/numbers/digit.tsv")) - zero = pynini.string_file(get_abs_path("data/numbers/zero.tsv")) - teens_and_ties = pynini.string_file(get_abs_path("data/numbers/teens_and_ties.tsv")) - - graph = digit | zero | teens_and_ties - graph = graph.optimize() - - final_graph = pynutil.insert('integer: "') + graph + pynutil.insert('"') - - # add_tokens() turns it into: cardinal { integer: "" } - final_graph = self.add_tokens(final_graph) - self.fst = final_graph.optimize() \ No newline at end of file + """ + Finite state transducer for classifying cardinals, e.g. + -23 -> cardinal { negative: "true" integer: "இருபத்து மூன்று" } + Args: + deterministic: if True will provide a single transduction option, + for False multiple transduction are generated (used for audio-based normalization) + """ + def __init__(self, deterministic: bool = True, lm: bool = False): + super().__init__(name="cardinal", kind="classify", deterministic=deterministic) + digit = pynini.string_file(get_abs_path("data/numbers/digit.tsv")) + zero = pynini.string_file(get_abs_path("data/numbers/zero.tsv")) + hundred_ta = pynini.string_file(get_abs_path("data/numbers/hundred_ta.tsv")) + teens_ties_hi = pynini.string_file(get_abs_path("data/numbers/teens_and_ties.tsv")) + teens_ties_en = pynini.string_file(get_abs_path("data/numbers/teens_and_ties_en.tsv")) + teens_ties = pynini.union(teens_ties_hi, teens_ties_en) + teens_and_ties = pynutil.add_weight(teens_ties, -0.1) + self.digit = digit + self.zero = zero + self.hundred_ta = hundred_ta + self.teens_and_ties = teens_and_ties + # single_digit early — covers ASCII + Tamil digits + zero + single_digit = digit | zero + # Single digit graph for digit-by-digit reading + single_digit_graph = digit | zero + self.single_digits_graph = single_digit_graph + pynini.closure(insert_space + single_digit_graph) + zero_delete = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) + def create_graph_suffix(digit_graph, suffix, zeros_counts): + z = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) + if zeros_counts == 0: + return digit_graph + suffix + return digit_graph + (z ** zeros_counts) + suffix + def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): + ins = pynutil.insert(" ") + z = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) + if zeros_counts == 0: + return digit_graph + suffix + ins + sub_graph + return digit_graph + suffix + (z ** zeros_counts) + ins + sub_graph + + # HUNDREDS GRAPH + # Use hundred_ta.tsv for fused exact hundreds (நூற்று, இருநூற்று, ... + # எட்டுநூற்று, எழுநூற்று, நானூற்று etc.) + # For 101-199: நூற்று + space + remainder + # For 201-999: fused prefix (no space) + space + remainder + # Fused hundred prefix for composites (201-999 non-exact) + fused_hundred_prefix = pynini.union( + pynini.cross("2", "இருநூற்று"), + pynini.cross("3", "முந்நூற்று"), + pynini.cross("4", "நானூற்று"), + pynini.cross("5", "ஐந்நூற்று"), + pynini.cross("6", "அறுநூற்று"), + pynini.cross("7", "எழுநூற்று"), + pynini.cross("8", "எட்டுநூற்று"), + pynini.cross("9", "ஒன்பதுநூற்று"), + pynini.cross("௨", "இருநூற்று"), + pynini.cross("௩", "முந்நூற்று"), + pynini.cross("௪", "நானூற்று"), + pynini.cross("௫", "ஐந்நூற்று"), + pynini.cross("௬", "அறுநூற்று"), + pynini.cross("௭", "எழுநூற்று"), + pynini.cross("௮", "எட்டுநூற்று"), + pynini.cross("௯", "ஒன்பதுநூற்று"), + ).optimize() + # Start with fused exact forms from hundred_ta.tsv + exact_hundred = pynutil.add_weight(pynini.union( + pynini.cross("100", "நூறு"), + pynini.cross("௧௦௦", "நூறு"), + ).optimize(), -1.0) + graph_hundreds = hundred_ta + # 101-109 (ASCII and Tamil digits) + graph_hundreds |= ( + (pynini.cross("1", "நூற்று") | pynini.cross("௧", "நூற்று")) + + zero_delete + + pynutil.insert(" ") + + single_digit + ) + # 110-119 + graph_hundreds |= ( + (pynini.cross("1", "நூற்று") | pynini.cross("௧", "நூற்று")) + + pynutil.insert(" ") + + teens_ties + ) + # 201-209, 301-309 ... 901-909 + graph_hundreds |= fused_hundred_prefix + zero_delete + pynutil.insert(" ") + single_digit + # 210-219 ... 910-919 + graph_hundreds |= fused_hundred_prefix + pynutil.insert(" ") + teens_ties + # 220-299 ... 920-999 (two-digit tie/tens tail already in teens_ties) + # teens_ties handles 20,21,...99 so this covers the remaining composites + graph_hundreds = graph_hundreds.optimize() + self.graph_hundreds = graph_hundreds + # THOUSANDS GRAPH + # 1000 → ஆயிரம் (exact, no leading ஒன்று) + # 1001-1099 → ஆயிரத்து + space + remainder + # 1100-1999 → ஆயிரத்து + space + graph_hundreds + # 2000-9000 → fused exact (இரண்டாயிரம், மூன்றாயிரம் ...) + # 2001-9999 → fused prefix (ஐந்தாயிரத்து ...) + space + remainder + one_k_exact = pynini.cross("1", "ஆயிரம்") | pynini.cross("௧", "ஆயிரம்") + one_k_tail = pynini.cross("1", "ஆயிரத்து") | pynini.cross("௧", "ஆயிரத்து") + fused_thousands_exact = pynini.union( + pynini.cross("2", "இரண்டாயிரம்"), + pynini.cross("3", "மூன்றாயிரம்"), + pynini.cross("4", "நான்காயிரம்"), + pynini.cross("5", "ஐந்தாயிரம்"), + pynini.cross("6", "ஆறாயிரம்"), + pynini.cross("7", "ஏழாயிரம்"), + pynini.cross("8", "எட்டாயிரம்"), + pynini.cross("9", "ஒன்பதாயிரம்"), + pynini.cross("௨", "இரண்டாயிரம்"), + pynini.cross("௩", "மூன்றாயிரம்"), + pynini.cross("௪", "நான்காயிரம்"), + pynini.cross("௫", "ஐந்தாயிரம்"), + pynini.cross("௬", "ஆறாயிரம்"), + pynini.cross("௭", "ஏழாயிரம்"), + pynini.cross("௮", "எட்டாயிரம்"), + pynini.cross("௯", "ஒன்பதாயிரம்"), + ).optimize() + fused_thousands_prefix = pynini.union( + pynini.cross("2", "இரண்டாயிரத்து"), + pynini.cross("3", "மூன்றாயிரத்து"), + pynini.cross("4", "நான்காயிரத்து"), + pynini.cross("5", "ஐந்தாயிரத்து"), + pynini.cross("6", "ஆறாயிரத்து"), + pynini.cross("7", "ஏழாயிரத்து"), + pynini.cross("8", "எட்டாயிரத்து"), + pynini.cross("9", "ஒன்பதாயிரத்து"), + pynini.cross("௨", "இரண்டாயிரத்து"), + pynini.cross("௩", "மூன்றாயிரத்து"), + pynini.cross("௪", "நான்காயிரத்து"), + pynini.cross("௫", "ஐந்தாயிரத்து"), + pynini.cross("௬", "ஆறாயிரத்து"), + pynini.cross("௭", "ஏழாயிரத்து"), + pynini.cross("௮", "எட்டாயிரத்து"), + pynini.cross("௯", "ஒன்பதாயிரத்து"), + ).optimize() + # 1000 exact + graph_thousands = one_k_exact + (zero_delete ** 3) + # 1001-1009 + graph_thousands |= one_k_tail + (zero_delete ** 2) + pynutil.insert(" ") + single_digit + # 1010-1099 + graph_thousands |= one_k_tail + zero_delete + pynutil.insert(" ") + teens_ties + # 1100-1999 + graph_thousands |= one_k_tail + pynutil.insert(" ") + graph_hundreds + # 2000-9000 exact + graph_thousands |= fused_thousands_exact + (zero_delete ** 3) + # 2001-9009 + graph_thousands |= fused_thousands_prefix + (zero_delete ** 2) + pynutil.insert(" ") + single_digit + # 2010-9099 + graph_thousands |= fused_thousands_prefix + zero_delete + pynutil.insert(" ") + teens_ties + # 2100-9999 + graph_thousands |= fused_thousands_prefix + pynutil.insert(" ") + graph_hundreds + graph_thousands = graph_thousands.optimize() + self.graph_thousands = graph_thousands + # TEN-THOUSANDS GRAPH + # e.g. 55000 → ஐம்பத்தைந்தாயிரம், 55199 → ஐம்பத்தைந்தாயிரத்து ... + # teens_and_ties already covers 10-99; we fuse them with ஆயிரம்/ஆயிரத்து + suffix_ten_k_exact = pynutil.insert("ஆயிரம்") + suffix_ten_k_tail = pynutil.insert("ஆயிரத்து") + # exact ten-thousands (X0000 where X is a two-digit teens/ties) + graph_ten_thousands = create_graph_suffix(teens_and_ties, suffix_ten_k_exact, 3) + # +single digit tail + graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 2, single_digit) + # +teens tail + graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 1, teens_ties) + # +hundreds tail + graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 0, graph_hundreds) + graph_ten_thousands = graph_ten_thousands.optimize() + self.graph_ten_thousands = graph_ten_thousands + + # LAKHS — இலட்சம் / இலட்சத்து + suffix_lakhs = pynutil.insert(" இலட்சம்") + suffix_lakhs_tail = pynutil.insert(" இலட்சத்து") + digit_one_as_oru = pynini.union( + pynini.cross("1", "ஒன்று"), + pynini.cross("௧", "ஒன்று"), + pynini.cross("2", "இரண்டு"), + pynini.cross("3", "மூன்று"), + pynini.cross("4", "நான்கு"), + pynini.cross("5", "ஐந்து"), + pynini.cross("6", "ஆறு"), + pynini.cross("7", "ஏழு"), + pynini.cross("8", "எட்டு"), + pynini.cross("9", "ஒன்பது"), + pynini.cross("௨", "இரண்டு"), + pynini.cross("௩", "மூன்று"), + pynini.cross("௪", "நான்கு"), + pynini.cross("௫", "ஐந்து"), + pynini.cross("௬", "ஆறு"), + pynini.cross("௭", "ஏழு"), + pynini.cross("௮", "எட்டு"), + pynini.cross("௯", "ஒன்பது"), + ).optimize() + graph_lakhs = create_graph_suffix(digit_one_as_oru, suffix_lakhs, 5) + graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 4, single_digit) + graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 3, teens_ties) + graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 2, graph_hundreds) + graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 1, graph_thousands) + graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 0, graph_ten_thousands) + graph_lakhs = graph_lakhs.optimize() + self.graph_lakhs = graph_lakhs + graph_ten_lakhs = create_graph_suffix(teens_and_ties, suffix_lakhs, 5) + graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 4, single_digit) + graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 3, teens_ties) + graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 2, graph_hundreds) + graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 1, graph_thousands) + graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 0, graph_ten_thousands) + graph_ten_lakhs.optimize() + self.graph_ten_lakhs = graph_ten_lakhs + + # CRORES — கோடி / கோடியே + suffix_crores = pynutil.insert(" கோடி") + suffix_crores_tail = pynutil.insert(" கோடியே") + graph_crores = create_graph_suffix(digit_one_as_oru, suffix_crores, 7) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 6, single_digit) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 5, teens_ties) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 4, graph_hundreds) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 3, graph_thousands) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 2, graph_ten_thousands) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 1, graph_lakhs) + graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 0, graph_ten_lakhs) + graph_crores = graph_crores.optimize() + graph_ten_crores = create_graph_suffix(teens_and_ties, suffix_crores, 7) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 6, single_digit) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 5, teens_ties) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 4, graph_hundreds) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 3, graph_thousands) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 2, graph_ten_thousands) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 1, graph_lakhs) + graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 0, graph_ten_lakhs) + graph_ten_crores.optimize() + + # ARABS + suffix_arabs = pynutil.insert(" அரபு") + graph_arabs = create_graph_suffix(digit_one_as_oru, suffix_arabs, 9) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 8, single_digit) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 7, teens_ties) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 6, graph_hundreds) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 5, graph_thousands) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 4, graph_ten_thousands) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 3, graph_lakhs) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 2, graph_ten_lakhs) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 1, graph_crores) + graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 0, graph_ten_crores) + graph_arabs.optimize() + graph_ten_arabs = create_graph_suffix(teens_and_ties, suffix_arabs, 9) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 8, single_digit) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 7, teens_ties) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 6, graph_hundreds) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 5, graph_thousands) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 4, graph_ten_thousands) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 3, graph_lakhs) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 2, graph_ten_lakhs) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 1, graph_crores) + graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 0, graph_ten_crores) + graph_ten_arabs.optimize() + + # KHARABS + suffix_kharabs = pynutil.insert(" கரபு") + graph_kharabs = create_graph_suffix(digit_one_as_oru, suffix_kharabs, 11) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 10, single_digit) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 9, teens_ties) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 8, graph_hundreds) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 7, graph_thousands) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 6, graph_ten_thousands) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 5, graph_lakhs) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 4, graph_ten_lakhs) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 3, graph_crores) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 2, graph_ten_crores) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 1, graph_arabs) + graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 0, graph_ten_arabs) + graph_kharabs.optimize() + graph_ten_kharabs = create_graph_suffix(teens_and_ties, suffix_kharabs, 11) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 10, single_digit) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 9, teens_ties) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 8, graph_hundreds) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 7, graph_thousands) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 6, graph_ten_thousands) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 5, graph_lakhs) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 4, graph_ten_lakhs) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 3, graph_crores) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 2, graph_ten_crores) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 1, graph_arabs) + graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 0, graph_ten_arabs) + graph_ten_kharabs.optimize() + + # NILS + suffix_nils = pynutil.insert(" நீல்") + graph_nils = create_graph_suffix(digit_one_as_oru, suffix_nils, 13) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 12, single_digit) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 11, teens_ties) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 10, graph_hundreds) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 9, graph_thousands) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 8, graph_ten_thousands) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 7, graph_lakhs) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 6, graph_ten_lakhs) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 5, graph_crores) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 4, graph_ten_crores) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 3, graph_arabs) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 2, graph_ten_arabs) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 1, graph_kharabs) + graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 0, graph_ten_kharabs) + graph_nils.optimize() + graph_ten_nils = create_graph_suffix(teens_and_ties, suffix_nils, 13) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 12, single_digit) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 11, teens_ties) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 10, graph_hundreds) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 9, graph_thousands) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 8, graph_ten_thousands) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 7, graph_lakhs) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 6, graph_ten_lakhs) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 5, graph_crores) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 4, graph_ten_crores) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 3, graph_arabs) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 2, graph_ten_arabs) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 1, graph_kharabs) + graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 0, graph_ten_kharabs) + graph_ten_nils.optimize() + + # PADMAS + suffix_padmas = pynutil.insert(" பத்மம்") + graph_padmas = create_graph_suffix(digit_one_as_oru, suffix_padmas, 15) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 14, single_digit) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 13, teens_ties) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 12, graph_hundreds) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 11, graph_thousands) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 10, graph_ten_thousands) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 9, graph_lakhs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 8, graph_ten_lakhs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 7, graph_crores) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 6, graph_ten_crores) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 5, graph_arabs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 4, graph_ten_arabs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 3, graph_kharabs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 2, graph_ten_kharabs) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 1, graph_nils) + graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 0, graph_ten_nils) + graph_padmas.optimize() + graph_ten_padmas = create_graph_suffix(teens_and_ties, suffix_padmas, 15) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 14, single_digit) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 13, teens_ties) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 12, graph_hundreds) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 11, graph_thousands) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 10, graph_ten_thousands) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 9, graph_lakhs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 8, graph_ten_lakhs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 7, graph_crores) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 6, graph_ten_crores) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 5, graph_arabs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 4, graph_ten_arabs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 3, graph_kharabs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 2, graph_ten_kharabs) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 1, graph_nils) + graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 0, graph_ten_nils) + graph_ten_padmas.optimize() + + # SHANKHS + suffix_shankhs = pynutil.insert(" சங்கம்") + graph_shankhs = create_graph_suffix(digit_one_as_oru, suffix_shankhs, 17) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 16, single_digit) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 15, teens_ties) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 14, graph_hundreds) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 13, graph_thousands) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 12, graph_ten_thousands) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 11, graph_lakhs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 10, graph_ten_lakhs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 9, graph_crores) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 8, graph_ten_crores) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 7, graph_arabs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 6, graph_ten_arabs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 5, graph_kharabs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 4, graph_ten_kharabs) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 3, graph_nils) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 2, graph_ten_nils) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 1, graph_padmas) + graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 0, graph_ten_padmas) + graph_shankhs.optimize() + graph_ten_shankhs = create_graph_suffix(teens_and_ties, suffix_shankhs, 17) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 16, single_digit) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 15, teens_ties) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 14, graph_hundreds) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 13, graph_thousands) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 12, graph_ten_thousands) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 11, graph_lakhs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 10, graph_ten_lakhs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 9, graph_crores) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 8, graph_ten_crores) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 7, graph_arabs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 6, graph_ten_arabs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 5, graph_kharabs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 4, graph_ten_kharabs) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 3, graph_nils) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 2, graph_ten_nils) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 1, graph_padmas) + graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 0, graph_ten_padmas) + graph_ten_shankhs.optimize() + + # LEADING ZERO and FINAL GRAPH + graph_leading_zero = zero + insert_space + single_digit + graph_leading_zero = pynutil.add_weight(graph_leading_zero, 0.5) + graph_without_leading_zeros = ( + digit + | zero + | teens_and_ties + | exact_hundred + | graph_hundreds + | graph_thousands + | graph_ten_thousands + | graph_lakhs + | graph_ten_lakhs + | graph_crores + | graph_ten_crores + | graph_arabs + | graph_ten_arabs + | graph_kharabs + | graph_ten_kharabs + | graph_nils + | graph_ten_nils + | graph_padmas + | graph_ten_padmas + | graph_shankhs + | graph_ten_shankhs + ) + self.graph_without_leading_zeros = graph_without_leading_zeros.optimize() + cardinal_with_leading_zeros = pynini.compose( + NEMO_ALL_ZERO + pynini.closure(NEMO_ALL_DIGIT), self.single_digits_graph + ) + cardinal_with_leading_zeros = pynutil.add_weight(cardinal_with_leading_zeros, 0.5) + final_graph = graph_without_leading_zeros | cardinal_with_leading_zeros + optional_minus_graph = pynini.closure( + pynutil.insert("negative: ") + pynini.cross("-", "\"true\" "), 0, 1 + ) + self.final_graph = final_graph.optimize() + final_graph = ( + optional_minus_graph + + pynutil.insert("integer: \"") + + self.final_graph + + pynutil.insert("\"") + ) + final_graph = self.add_tokens(final_graph) + self.fst = final_graph \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/taggers/punctuation.py b/nemo_text_processing/text_normalization/ta/taggers/punctuation.py new file mode 100644 index 000000000..32bc395e9 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/taggers/punctuation.py @@ -0,0 +1,48 @@ +import sys +from unicodedata import category + +import pynini +from pynini.examples import plurals +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import NEMO_NOT_SPACE, NEMO_SIGMA, GraphFst + + +class PunctuationFst(GraphFst): + """ + Finite state transducer for classifying punctuation + e.g. a, -> tokens { name: "a" } tokens { name: "," } + + Args: + deterministic: if True will provide a single transduction option, + for False multiple transductions are generated (used for audio-based normalization) + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="punctuation", kind="classify", deterministic=deterministic) + s = "!#%&\'()*+,-./:;<=>?@^_`{|}~\"" + + punct_symbols_to_exclude = ["[", "]"] + punct_unicode = [ + chr(i) + for i in range(sys.maxunicode) + if category(chr(i)).startswith("P") and chr(i) not in punct_symbols_to_exclude + ] + + self.punct_marks = [p for p in punct_unicode + list(s)] + + punct = pynini.union(*self.punct_marks) + punct = pynini.closure(punct, 1) + + emphasis = ( + pynini.accep("<") + + pynini.union( + (pynini.closure(NEMO_NOT_SPACE - pynini.union("<", ">"), 1) + pynini.closure(pynini.accep("/"), 0, 1)), + (pynini.accep("/") + pynini.closure(NEMO_NOT_SPACE - pynini.union("<", ">"), 1)), + ) + + pynini.accep(">") + ) + punct = plurals._priority_union(emphasis, punct, NEMO_SIGMA) + + self.graph = punct + self.fst = (pynutil.insert("name: \"") + self.graph + pynutil.insert("\"")).optimize() diff --git a/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py b/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py new file mode 100644 index 000000000..86fdc3421 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py @@ -0,0 +1,168 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 logging +import os + +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import ( + NEMO_SPACE, + NEMO_WHITE_SPACE, + GraphFst, + delete_extra_space, + delete_space, + generator_main, +) +from nemo_text_processing.text_normalization.ta.taggers.cardinal import CardinalFst +# from nemo_text_processing.text_normalization.hi.taggers.date import DateFst +# from nemo_text_processing.text_normalization.hi.taggers.decimal import DecimalFst +# from nemo_text_processing.text_normalization.hi.taggers.electronic import ElectronicFst +# from nemo_text_processing.text_normalization.hi.taggers.fraction import FractionFst +# from nemo_text_processing.text_normalization.hi.taggers.measure import MeasureFst +# from nemo_text_processing.text_normalization.hi.taggers.money import MoneyFst +# from nemo_text_processing.text_normalization.hi.taggers.ordinal import OrdinalFst +from nemo_text_processing.text_normalization.ta.taggers.punctuation import PunctuationFst +# from nemo_text_processing.text_normalization.hi.taggers.telephone import TelephoneFst +# from nemo_text_processing.text_normalization.hi.taggers.time import TimeFst +# from nemo_text_processing.text_normalization.hi.taggers.whitelist import WhiteListFst +from nemo_text_processing.text_normalization.ta.taggers.word import WordFst + + +class ClassifyFst(GraphFst): + """ + Final class that composes all other classification grammars. This class can process an entire sentence including punctuation. + For deployment, this grammar will be compiled and exported to OpenFst Finite State Archive (FAR) File. + More details to deployment at NeMo/tools/text_processing_deployment. + + Args: + input_case: accepting either "lower_cased" or "cased" input. + deterministic: if True will provide a single transduction option, + for False multiple options (used for audio-based normalization) + cache_dir: path to a dir with .far grammar file. Set to None to avoid using cache. + overwrite_cache: set to True to overwrite .far files + whitelist: path to a file with whitelist replacements + """ + + def __init__( + self, + input_case: str, + deterministic: bool = True, + cache_dir: str = None, + overwrite_cache: bool = False, + whitelist: str = None, + ): + super().__init__(name="tokenize_and_classify", kind="classify", deterministic=deterministic) + + far_file = None + if cache_dir is not None and cache_dir != "None": + os.makedirs(cache_dir, exist_ok=True) + whitelist_file = os.path.basename(whitelist) if whitelist else "" + far_file = os.path.join( + cache_dir, + f"hi_tn_{deterministic}_deterministic_{input_case}_{whitelist_file}_tokenize.far", + ) + if not overwrite_cache and far_file and os.path.exists(far_file): + self.fst = pynini.Far(far_file, mode="r")["tokenize_and_classify"] + logging.info(f"ClassifyFst.fst was restored from {far_file}.") + else: + logging.info(f"Creating ClassifyFst grammars.") + + cardinal = CardinalFst(deterministic=deterministic) + cardinal_graph = cardinal.fst + + # decimal = DecimalFst(cardinal=cardinal, deterministic=deterministic) + # decimal_graph = decimal.fst + + # fraction = FractionFst(cardinal=cardinal, deterministic=deterministic) + # fraction_graph = fraction.fst + + # date = DateFst(cardinal=cardinal) + # date_graph = date.fst + + # timefst = TimeFst(cardinal=cardinal) + # time_graph = timefst.fst + + # ordinal = OrdinalFst(cardinal=cardinal, deterministic=deterministic) + # ordinal_graph = ordinal.fst + + # measure = MeasureFst(cardinal=cardinal, decimal=decimal, ordinal=ordinal, input_case=input_case) + # measure_graph = measure.fst + + # money = MoneyFst(cardinal=cardinal) + # money_graph = money.fst + + # whitelist_graph = WhiteListFst( + # input_case=input_case, deterministic=deterministic, input_file=whitelist + # ).fst + + punctuation = PunctuationFst(deterministic=deterministic) + punct_graph = punctuation.fst + + # telephone = TelephoneFst() + # telephone_graph = telephone.fst + + # electronic = ElectronicFst(deterministic=deterministic) + # electronic_graph = electronic.fst + + classify = ( + # pynutil.add_weight(whitelist_graph, 1.01)| + pynutil.add_weight(cardinal_graph, 1.1) + # | pynutil.add_weight(decimal_graph, 1.1) + # | pynutil.add_weight(fraction_graph, 1.1) + # | pynutil.add_weight(date_graph, 1.1) + # | pynutil.add_weight(time_graph, 1.1) + # | pynutil.add_weight(measure_graph, 1.1) + # | pynutil.add_weight(money_graph, 1.1) + # | pynutil.add_weight(telephone_graph, 1.1) + # | pynutil.add_weight(ordinal_graph, 1.1) + # | pynutil.add_weight(electronic_graph, 1.1) + ) + + word_graph = WordFst(punctuation=punctuation, deterministic=deterministic).fst + + punct = pynutil.insert("tokens { ") + pynutil.add_weight(punct_graph, weight=2.1) + pynutil.insert(" }") + punct = pynini.closure( + pynini.union( + pynini.compose(pynini.closure(NEMO_WHITE_SPACE, 1), delete_extra_space), + (pynutil.insert(NEMO_SPACE) + punct), + ), + 1, + ) + + classify = pynini.union(classify, pynutil.add_weight(word_graph, 100)) + token = pynutil.insert("tokens { ") + classify + pynutil.insert(" }") + token_plus_punct = ( + pynini.closure(punct + pynutil.insert(NEMO_SPACE)) + + token + + pynini.closure(pynutil.insert(NEMO_SPACE) + punct) + ) + + graph = token_plus_punct + pynini.closure( + pynini.union( + pynini.compose(pynini.closure(NEMO_WHITE_SPACE, 1), delete_extra_space), + (pynutil.insert(NEMO_SPACE) + punct + pynutil.insert(NEMO_SPACE)), + ) + + token_plus_punct + ) + + graph = delete_space + graph + delete_space + graph = pynini.union(graph, punct) + + self.fst = graph.optimize() + + if far_file: + generator_main(far_file, {"tokenize_and_classify": self.fst}) + logging.info(f"ClassifyFst grammars are saved to {far_file}.") diff --git a/nemo_text_processing/text_normalization/ta/taggers/word.py b/nemo_text_processing/text_normalization/ta/taggers/word.py new file mode 100644 index 000000000..6398a78fd --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/taggers/word.py @@ -0,0 +1,61 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import ( + MIN_NEG_WEIGHT, + NEMO_NOT_SPACE, + GraphFst, + convert_space, +) +from nemo_text_processing.text_normalization.ta.taggers.punctuation import PunctuationFst + + +class WordFst(GraphFst): + """ + Finite state transducer for classifying Tamil words. + e.g. சோனா -> tokens { name: " சோனா" } + + Args: + punctuation: PunctuationFst + deterministic: if True will provide a single transduction option, + for False multiple transductions are generated (used for audio-based normalization) + """ + + def __init__(self, punctuation: PunctuationFst, deterministic: bool = True): + super().__init__(name="word", kind="classify", deterministic=deterministic) + + # Define Tamil characters and symbols using pynini.union + TAMIL_CHAR = pynini.union( + *[chr(i) for i in range(0x0B80, 0x0B83 + 1)], # Tamil vowels and consonants + *[chr(i) for i in range(0x0B85, 0x0BB9 + 1)], # More Tamil characters + *[chr(i) for i in range(0x0BBE, 0x0BCD + 1)], # Tamil diacritics + ).optimize() + + # Include punctuation in the graph + punct = punctuation.graph + default_graph = pynini.closure(pynini.difference(NEMO_NOT_SPACE, punct.project("input")), 1) + symbols_to_exclude = (pynini.union("$", "€", "₩", "£", "¥", "#", "%") | punct).optimize() + + # Use TAMIL_CHAR in the graph + graph = pynini.closure(pynini.difference(TAMIL_CHAR, symbols_to_exclude), 1) + graph = pynutil.add_weight(graph, MIN_NEG_WEIGHT) | default_graph + + # Ensure no spaces around punctuation + graph = pynini.closure(graph + pynini.closure(punct + graph, 0, 1)) + + self.graph = convert_space(graph) + self.fst = (pynutil.insert("name: \"") + self.graph + pynutil.insert("\"")).optimize() diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py index 24e300c1b..59676b890 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/cardinal.py @@ -12,37 +12,38 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pynini -from pynini.lib import pynutil - -from nemo_text_processing.text_normalization.ta.graph_utils import ( - NEMO_NOT_QUOTE, - GraphFst, - delete_space, -) - - +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.hi.graph_utils import NEMO_NOT_QUOTE, GraphFst, delete_space + + class CardinalFst(GraphFst): - """ + """ Finite state transducer for verbalizing cardinal, e.g. - cardinal { integer: "5" } -> ஐந்து + cardinal { negative: "true" integer: "23" } -> minus twenty three + Args: deterministic: if True will provide a single transduction option, - for False multiple options (used for audio-based normalization) - """ - - def __init__(self, deterministic: bool = True): - super().__init__(name="cardinal", kind="verbalize", deterministic=deterministic) - - graph = ( - pynutil.delete("integer:") - + delete_space - + pynutil.delete('"') - + pynini.closure(NEMO_NOT_QUOTE, 1) - + pynutil.delete('"') - ) - - # delete_tokens() removes the surrounding cardinal { ... } - delete_tokens = self.delete_tokens(graph) - self.fst = delete_tokens.optimize() - \ No newline at end of file + for False multiple options (used for audio-based normalization) + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="cardinal", kind="verbalize", deterministic=deterministic) + + self.optional_sign = pynini.cross("negative: \"true\"", "minus ") + if not deterministic: + self.optional_sign |= pynini.cross("negative: \"true\"", "negative ") + self.optional_sign |= pynini.cross("negative: \"true\"", "dash ") + + self.optional_sign = pynini.closure(self.optional_sign + delete_space, 0, 1) + + integer = pynini.closure(NEMO_NOT_QUOTE) + + self.integer = delete_space + pynutil.delete("\"") + integer + pynutil.delete("\"") + integer = pynutil.delete("integer:") + self.integer + + self.numbers = self.optional_sign + integer + delete_tokens = self.delete_tokens(self.numbers) + + self.fst = delete_tokens.optimize() diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/post_processing.py b/nemo_text_processing/text_normalization/ta/verbalizers/post_processing.py new file mode 100644 index 000000000..9afad60e3 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/post_processing.py @@ -0,0 +1,96 @@ +# Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# 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 os + +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import ( + MIN_NEG_WEIGHT, + NEMO_CHAR, + NEMO_SIGMA, + generator_main, +) +from nemo_text_processing.text_normalization.ta.taggers.punctuation import PunctuationFst +from nemo_text_processing.utils.logging import logger + + +class PostProcessingFst: + """ + Finite state transducer that post-processing an entire sentence after verbalization is complete, e.g. + removes extra spaces around punctuation marks " ( one hundred and twenty three ) " -> "(one hundred and twenty three)" + + Args: + cache_dir: path to a dir with .far grammar file. Set to None to avoid using cache. + overwrite_cache: set to True to overwrite .far files + """ + + def __init__(self, cache_dir: str = None, overwrite_cache: bool = False): + + far_file = None + if cache_dir is not None and cache_dir != "None": + os.makedirs(cache_dir, exist_ok=True) + far_file = os.path.join(cache_dir, "ta_tn_post_processing.far") + if not overwrite_cache and far_file and os.path.exists(far_file): + self.fst = pynini.Far(far_file, mode="r")["post_process_graph"] + logger.info(f'Post processing graph was restored from {far_file}.') + else: + self.fst = self.get_punct_postprocess_graph() + + if far_file: + generator_main(far_file, {"post_process_graph": self.fst}) + + def get_punct_postprocess_graph(self): + """ + Returns graph to post process punctuation marks. + + By default, spaces are removed before punctuation marks like comma, period, etc. + """ + punct_marks_all = PunctuationFst().punct_marks + + # Punctuation marks that should NOT have space before them + # (most punctuation except quotes, dashes, and opening brackets) + quotes = ["'", "\"", "«"] + dashes = ["-", "—"] + brackets = ["<", "{", "(", r"\["] + allow_space_before_punct = quotes + dashes + brackets + + no_space_before_punct = [m for m in punct_marks_all if m not in allow_space_before_punct] + # Add Hindi-specific punctuation + no_space_before_punct.extend(["।", ",", ".", ";", ":", "!", "?"]) + # Remove duplicates + no_space_before_punct = list(set(no_space_before_punct)) + no_space_before_punct = pynini.union(*no_space_before_punct) + + delete_space = pynutil.delete(" ") + + # Delete space before no_space_before_punct marks + non_punct = pynini.difference(NEMO_CHAR, no_space_before_punct).optimize() + graph = ( + pynini.closure(non_punct) + + pynini.closure( + no_space_before_punct | pynutil.add_weight(delete_space + no_space_before_punct, MIN_NEG_WEIGHT) + ) + + pynini.closure(non_punct) + ) + graph = pynini.closure(graph).optimize() + + # Remove space after opening brackets + no_space_after_punct = pynini.union(*brackets) + no_space_after_punct = pynini.cdrewrite(delete_space, no_space_after_punct, NEMO_SIGMA, NEMO_SIGMA).optimize() + graph = pynini.compose(graph, no_space_after_punct).optimize() + + return graph diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py new file mode 100644 index 000000000..2c27b0e56 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py @@ -0,0 +1,53 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. + +from nemo_text_processing.text_normalization.ta.graph_utils import GraphFst +from nemo_text_processing.text_normalization.ta.verbalizers.cardinal import CardinalFst +#from nemo_text_processing.text_normalization.ta.verbalizers.date import DateFst +#from nemo_text_processing.text_normalization.hi.verbalizers.decimal import DecimalFst +#from nemo_text_processing.text_normalization.hi.verbalizers.electronic import ElectronicFst +#from nemo_text_processing.text_normalization.hi.verbalizers.fraction import FractionFst +#from nemo_text_processing.text_normalization.hi.verbalizers.measure import MeasureFst +#from nemo_text_processing.text_normalization.hi.verbalizers.money import MoneyFst +#from nemo_text_processing.text_normalization.hi.verbalizers.ordinal import OrdinalFst +#from nemo_text_processing.text_normalization.hi.verbalizers.telephone import TelephoneFst +#from nemo_text_processing.text_normalization.hi.verbalizers.time import TimeFst +#from nemo_text_processing.text_normalization.ta.verbalizers.whitelist import WhiteListFst + + +class VerbalizeFst(GraphFst): + """ + Composes other verbalizer grammars. + For deployment, this grammar will be compiled and exported to OpenFst Finite State Archive (FAR) File. + More details to deployment at NeMo/tools/text_processing_deployment. + + Args: + deterministic: if True will provide a single transduction option, + for False multiple options (used for audio-based normalization) + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="verbalize", kind="verbalize", deterministic=deterministic) + + cardinal = CardinalFst(deterministic=deterministic) + cardinal_graph = cardinal.fst + + + + graph = ( + cardinal_graph + + ) + + self.fst = graph diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py new file mode 100644 index 000000000..f9c300aae --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py @@ -0,0 +1,76 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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 logging +import os + +import pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import ( + GraphFst, + delete_extra_space, + delete_space, + generator_main, +) +from nemo_text_processing.text_normalization.ta.verbalizers.verbalize import VerbalizeFst +from nemo_text_processing.text_normalization.ta.verbalizers.word import WordFst + + +class VerbalizeFinalFst(GraphFst): + """ + Finite state transducer that verbalizes an entire sentence, e.g. + tokens { name: "its" } tokens { time { hours: "twelve" minutes: "thirty" } } tokens { name: "now" } tokens { name: "." } -> its twelve thirty now . + + Args: + deterministic: if True will provide a single transduction option, + for False multiple options (used for audio-based normalization) + cache_dir: path to a dir with .far grammar file. Set to None to avoid using cache. + overwrite_cache: set to True to overwrite .far files + """ + + def __init__(self, deterministic: bool = True, cache_dir: str = None, overwrite_cache: bool = False): + super().__init__(name="verbalize_final", kind="verbalize", deterministic=deterministic) + + far_file = None + if cache_dir is not None and cache_dir != "None": + os.makedirs(cache_dir, exist_ok=True) + far_file = os.path.join(cache_dir, f"en_tn_{deterministic}_deterministic_verbalizer.far") + if not overwrite_cache and far_file and os.path.exists(far_file): + self.fst = pynini.Far(far_file, mode="r")["verbalize"] + logging.info(f'VerbalizeFinalFst graph was restored from {far_file}.') + else: + verbalize = VerbalizeFst(deterministic=deterministic).fst + word = WordFst(deterministic=deterministic).fst + types = verbalize | word + + if deterministic: + graph = ( + pynutil.delete("tokens") + + delete_space + + pynutil.delete("{") + + delete_space + + types + + delete_space + + pynutil.delete("}") + ) + else: + graph = delete_space + types + delete_space + + graph = delete_space + pynini.closure(graph + delete_extra_space) + graph + delete_space + + self.fst = graph.optimize() + if far_file: + generator_main(far_file, {"verbalize": self.fst}) + logging.info(f"VerbalizeFinalFst grammars are saved to {far_file}.") diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/word.py b/nemo_text_processing/text_normalization/ta/verbalizers/word.py new file mode 100644 index 000000000..9734d3d25 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/word.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import NEMO_CHAR, NEMO_SIGMA, GraphFst, delete_space + + +class WordFst(GraphFst): + """ + Finite state transducer for verbalizing Tamil words. + e.g. tokens { name: " சோனா" } -> சோனா + + Args: + deterministic: if True will provide a single transduction option, + for False multiple transduction are generated (used for audio-based normalization) + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="word", kind="verbalize", deterministic=deterministic) + chars = pynini.closure(NEMO_CHAR - " ", 1) + punct = pynini.union("!", "?", ".", ",", "-", ":", ";", "।") # Add other punctuation marks as needed + char = pynutil.delete("name:") + delete_space + pynutil.delete("\"") + chars + pynutil.delete("\"") + + # Ensure no spaces around punctuation + graph = char + pynini.closure(delete_space + punct, 0, 1) + + # Explicitly remove spaces before punctuation + remove_space_before_punct = pynini.cdrewrite(pynini.cross(" ", ""), "", punct, NEMO_SIGMA) + graph = graph @ remove_space_before_punct + + self.fst = graph.optimize() diff --git a/run_cardinal_tests.py b/run_cardinal_tests.py new file mode 100644 index 000000000..d7224ff74 --- /dev/null +++ b/run_cardinal_tests.py @@ -0,0 +1,48 @@ +# run_cardinal_tests.py -- simple checker for the Cardinal exercise. +# Usage (from the repo root, inside your conda env): +# python run_cardinal_tests.py +# Example: +# python run_cardinal_tests.py LANGCODE DIRECTION test_cases_cardinal.txt +import sys +import importlib +import pynini + + +def apply_fst(fst, text): + lattice = text @ fst + if lattice.num_states() == 0: + return None # input was rejected by the grammar + out = pynini.shortestpath(lattice) + return out.string() if out.num_states() else None + + +def main(): + lang, direction, path = sys.argv[1], sys.argv[2], sys.argv[3] + base = "text_normalization" if direction == "tn" else "inverse_text_normalization" + tagger = importlib.import_module( + f"nemo_text_processing.{base}.{lang}.taggers.cardinal").CardinalFst().fst + verbalizer = importlib.import_module( + f"nemo_text_processing.{base}.{lang}.verbalizers.cardinal").CardinalFst().fst + + passed = failed = 0 + with open(path, encoding="utf-8") as f: + for line in f: + line = line.rstrip("\n") + if not line.strip() or "~" not in line: + continue + inp, expected = [s.strip() for s in line.split("~", 1)] + tagged = apply_fst(tagger, inp) + result = apply_fst(verbalizer, tagged) if tagged is not None else None + if result == expected: + passed += 1 + else: + failed += 1 + print(f"FAIL: {inp!r} -> got {result!r}, expected {expected!r}") + + print(f"\n{passed} passed, {failed} failed.") + sys.exit(1 if failed else 0) + + +if __name__ == "__main__": + main() + \ No newline at end of file diff --git a/tests/nemo_text_processing/ta/__init__.py b/tests/nemo_text_processing/ta/__init__.py new file mode 100644 index 000000000..d9155f923 --- /dev/null +++ b/tests/nemo_text_processing/ta/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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. diff --git a/tests/nemo_text_processing/ta/data_inverse_text_normalization/text_cases_cardinal.txt b/tests/nemo_text_processing/ta/data_inverse_text_normalization/text_cases_cardinal.txt new file mode 100644 index 000000000..5f2f741a5 --- /dev/null +++ b/tests/nemo_text_processing/ta/data_inverse_text_normalization/text_cases_cardinal.txt @@ -0,0 +1,54 @@ +நான்கு ஃபோர்கள்~௪ ஃபோர்கள் +ஆறு வீரர்கள் அவுட்~௬ வீரர்கள் அவுட் +ஒன்பிளஸ் எட்டு ப்ரோ~ஒன்பிளஸ் ௮ ப்ரோ +ஐந்து சார்ஜர்கள்~௫ சார்ஜர்கள் +நான்கு ஓவரில் பதினேழு ரன்கள்~௪ ஓவரில் ௧௭ ரன்கள் +ஐந்து சாக்லெட்டுகள் ஒன்பது டாஃபிகள்~௫ சாக்லெட்டுகள் ௯ டாஃபிகள் +பத்தாயிரத்து தொண்ணூற்று ஒன்பது~௧௦௦௯௯ +ஒரு இலட்சத்து ஒன்று~௧௦௦௦௦௧ +நூறு~௧௦௦ +முன்னூற்று ஒன்பது~௩௦௯ +எழுநூற்று தொண்ணூற்று எட்டு~௭௯௮ +ஐந்தாயிரம்~௫௦௦௦ +எட்டாயிரத்து நான்கு~௮௦௦௪ +ஒன்பதாயிரத்து பதினாறு~௯௦௧௬ +ஆயிரத்து தொள்ளாயிரத்து பன்னிரண்டு~௧௯௧௨ +இரண்டாயிரத்து இருநூற்று இருபத்து இரண்டு~௨௨௨௨ +பதினான்காயிரம்~௧௪௦௦௦ +பதினெட்டாயிரத்து ஆறு~௧௮௦௦௬ +இருபத்தாறாயிரத்து இருபத்து ஒன்று~௨௬௦௨௧ +தொண்ணூற்றாறாயிரத்து எண்ணூற்று பதினொன்று~௯௬௮௧௧ +நான்கு இலட்சம்~௪௦௦௦௦௦ +இரண்டு இலட்சத்து இரண்டு~௨௦௦௦௦௨ +ஏழு இலட்சத்து இருபது~௭௦௦௦௨௦ +ஒன்பது இலட்சத்து முன்னூற்று இருபத்து ஒன்று~௯௦௦௩௨௧ +எட்டு இலட்சத்து ஐந்தாயிரத்து முன்னூற்று இருபத்து ஒன்று~௮௦௫௩௨௧ +இருபத்து மூன்று இலட்சம்~௨௩௦௦௦௦௦ +பதினைந்து இலட்சத்து ஒன்று~௧௫௦௦௦௦௧ +இருபத்து ஏழு இலட்சத்து எண்ணூற்று இருபது~௨௭௦௦௮௨௦ +தொண்ணூற்று ஒரு இலட்சத்து முப்பத்தொன்றாயிரத்து எண்ணூற்று இருபத்து ஒன்பது~௯௧௩௧௮௨௯ +மூன்று கோடி~௩௦௦௦௦௦௦௦ +ஒரு கோடியே ஒன்று~௧௦௦௦௦௦௦௧ +ஏழு கோடியே பதின்மூன்று~௭௦௦௦௦௦௧௩ +நான்கு கோடியே தொள்ளாயிரத்து பதினொன்று~௪௦௦௦௦௯௧௧ +ஆறு கோடியே ஐந்தாயிரத்து தொள்ளாயிரத்து பதினொன்று~௬௦௦௦௫௯௧௧ +ஆறு கோடியே இருபத்தைந்தாயிரத்து தொள்ளாயிரத்து பதினொன்று~௬௦௦௨௫௯௧௧ +மூன்று கோடியே ஒரு இலட்சத்து இருபத்தைந்தாயிரத்து தொள்ளாயிரத்து பதினொன்று~௩௦௧௨௫௯௧௧ +இரண்டு கோடியே பதினேழு இலட்சத்து இருபத்தைந்தாயிரத்து தொள்ளாயிரத்து பதினொன்று~௨௧௭௨௫௯௧௧ +முப்பது கோடி~௩௦௦௦௦௦௦௦௦ +தொண்ணூற்று எட்டு இலட்சத்து எழுபத்தாறாயிரத்து எழுநூற்று எண்பத்து ஒன்பது~௯௮௭௬௭௮௯ +இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௨௩௪௫௫௬௭ +ஒரு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௧௨௩௪௫௫௬௭ +ஒரு கோடியே இருபத்து ஒன்று இலட்சத்து இருபத்து ஒன்றாயிரத்து இருநூற்று பன்னிரண்டு~௧௨௧௨௧௨௧௨ +ஒரு அரபே பன்னிரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௧௧௨௨௩௪௫௫௬௭ +ஒரு அரபே இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௧௦௨௨௩௪௫௫௬௭ +பதினொரு அரபே இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௧௧௦௨௨௩௪௫௫௬௭ +ஐம்பத்து ஒரு அரபே இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்தைந்தாயிரத்து ஐந்நூற்று அறுபத்து ஏழு~௫௧௦௨௨௩௪௫௫௬௭ +ஏழே கால் நூறு~௭௨௫ +ஏழரை நூறு~௭௫௦ +ஏழரை ஆயிரம்~௭௫௦௦ +ஏழே கால் ஆயிரம்~௭௨௫௦ +நூற்று ஐம்பது~௧௫௦ +இருநூற்று ஐம்பது~௨௫௦ +பதினாறு நூற்று ஐம்பது~௧௬௫௦ +பதினாறு நூற்று இருபத்தைந்து~௧௬௨௫ \ No newline at end of file diff --git a/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt new file mode 100644 index 000000000..0ab12369a --- /dev/null +++ b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt @@ -0,0 +1,148 @@ +௪ ஃபோர்கள்~நான்கு ஃபோர்கள் +௬ வீரர்கள் அவுட்~ஆறு வீரர்கள் அவுட் +ஒன்பிளஸ் ௮ ப்ரோ~ஒன்பிளஸ் எட்டு ப்ரோ +௫ சார்ஜர்கள்~ஐந்து சார்ஜர்கள் +௪ ஓவரில் ௧௭ ரன்கள்~நான்கு ஓவரில் பதினேழு ரன்கள் +௫ சாக்லெட்டுகள் ௯ டாஃபிகள்~ஐந்து சாக்லெட்டுகள் ஒன்பது டாஃபிகள் +௧௦௦௯௯~பத்துஆயிரத்து தொண்ணூற்று ஒன்பது +௧௦௦௦௦௧~ஒன்று இலட்சத்து ஒன்று +௪ சிக்ஸர்கள் ௧௪ நான்குகள்~நான்கு சிக்ஸர்கள் பதினான்கு நான்குகள் +௬ ரன்கள் எடுத்தார்~ஆறு ரன்கள் எடுத்தார் +௩ கோல்கள் அடித்தார்~மூன்று கோல்கள் அடித்தார் +௫ நான்குகள்~ஐந்து நான்குகள் +௨ சிக்ஸர்கள் ௧௨ ரன்கள்~இரண்டு சிக்ஸர்கள் பன்னிரண்டு ரன்கள் +௯ புள்ளிகள்~ஒன்பது புள்ளிகள் +௪ உயிரிழப்பு ௧௮ காயம்~நான்கு உயிரிழப்பு பதினெட்டு காயம் +௫ கோல்கள் அடி~ஐந்து கோல்கள் அடி +௩ பேட்ஸ்மேன்கள் ௧௨ வீரர்கள்~மூன்று பேட்ஸ்மேன்கள் பன்னிரண்டு வீரர்கள் +௫ தோல்வி ௧ டிரா ௧௭ வெற்றி~ஐந்து தோல்வி ஒன்று டிரா பதினேழு வெற்றி +௫௧௦௨௨௩௪௫௫௬௭~ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +பாடம் ௧௦ ஸ்லோகம் ௨~பாடம் பத்து ஸ்லோகம் இரண்டு +௧௦௧~நூற்று ஒன்று +௧௦௨~நூற்று இரண்டு +௧௦௩~நூற்று மூன்று +௧௦௪~நூற்று நான்கு +௧௦௫~நூற்று ஐந்து +௧௦௬~நூற்று ஆறு +௧௦௭~நூற்று ஏழு +௧௦௮~நூற்று எட்டு +௧௦௯~நூற்று ஒன்பது +௧௧௦~நூற்று பத்து +௧௧௧~நூற்று பதினொன்று +௧௧௨~நூற்று பன்னிரண்டு +௧௧௩~நூற்று பதிமூன்று +௧௧௪~நூற்று பதினான்கு +௧௧௫~நூற்று பதினைந்து +௧௧௬~நூற்று பதினாறு +௮௧௭~எட்டுநூற்று பதினேழு +௮௧௮~எட்டுநூற்று பதினெட்டு +௮௧௯~எட்டுநூற்று பத்தொன்பது +௮௨௦~எட்டுநூற்று இருபது +௮௨௧~எட்டுநூற்று இருபத்து ஒன்று +௮௨௨~எட்டுநூற்று இருபத்து இரண்டு +௮௨௩~எட்டுநூற்று இருபத்து மூன்று +௮௨௪~எட்டுநூற்று இருபத்து நான்கு +௮௨௫~எட்டுநூற்று இருபத்து ஐந்து +௮௨௬~எட்டுநூற்று இருபத்து ஆறு +௮௨௭~எட்டுநூற்று இருபத்து ஏழு +௮௨௮~எட்டுநூற்று இருபத்து எட்டு +௮௨௯~எட்டுநூற்று இருபத்து ஒன்பது +௮௩௦~எட்டுநூற்று முப்பது +௮௩௧~எட்டுநூற்று முப்பத்து ஒன்று +௮௩௨~எட்டுநூற்று முப்பத்து இரண்டு +௮௩௩~எட்டுநூற்று முப்பத்து மூன்று +௮௩௪~எட்டுநூற்று முப்பத்து நான்கு +௮௩௫~எட்டுநூற்று முப்பத்து ஐந்து +௮௩௬~எட்டுநூற்று முப்பத்து ஆறு +௭௩௭~எழுநூற்று முப்பத்து ஏழு +௭௩௮~எழுநூற்று முப்பத்து எட்டு +௭௩௯~எழுநூற்று முப்பத்து ஒன்பது +௭௪௦~எழுநூற்று நாற்பது +௭௪௧~எழுநூற்று நாற்பத்து ஒன்று +௭௪௨~எழுநூற்று நாற்பத்து இரண்டு +௭௪௩~எழுநூற்று நாற்பத்து மூன்று +௭௪௪~எழுநூற்று நாற்பத்து நான்கு +௭௪௫~எழுநூற்று நாற்பத்து ஐந்து +௪௪௬~நானூற்று நாற்பத்து ஆறு +௪௪௭~நானூற்று நாற்பத்து ஏழு +௪௪௮~நானூற்று நாற்பத்து எட்டு +௪௪௯~நானூற்று நாற்பத்து ஒன்பது +௪௫௦~நானூற்று ஐம்பது +௪௬௧~நானூற்று அறுபத்து ஒன்று +௧௭௫~நூற்று எழுபத்து ஐந்து +௧௮௧~நூற்று எண்பத்து ஒன்று +௧௯௦~நூற்று தொண்ணூறு +௧௯௧~நூற்று தொண்ணூற்று ஒன்று +௧௯௯~நூற்று தொண்ணூற்று ஒன்பது +௧௦௦௧~ஆயிரத்து ஒன்று +௧௦௯௯~ஆயிரத்து தொண்ணூற்று ஒன்பது +௫௫௫௧ வாழைப்பழங்கள்~ஐந்தாயிரத்து ஐந்நூற்று ஐம்பத்து ஒன்று வாழைப்பழங்கள் +௫௫௫௫௨ ஆப்பிள்கள்~ஐம்பத்து ஐந்துஆயிரத்து ஐந்நூற்று ஐம்பத்து இரண்டு ஆப்பிள்கள் +௫௩~ஐம்பத்து மூன்று +௫௪~ஐம்பத்து நான்கு +௫௫~ஐம்பத்து ஐந்து +௫௬~ஐம்பத்து ஆறு +௫௭~ஐம்பத்து ஏழு +௫௮~ஐம்பத்து எட்டு +௫௯~ஐம்பத்து ஒன்பது +௬௦~அறுபது +௬௧~அறுபத்து ஒன்று +௬௨~அறுபத்து இரண்டு +௬௩~அறுபத்து மூன்று +௬௪~அறுபத்து நான்கு +௬௫~அறுபத்து ஐந்து +௬௬~அறுபத்து ஆறு +௬௭~அறுபத்து ஏழு +௬௮~அறுபத்து எட்டு +௬௯~அறுபத்து ஒன்பது +௭௦~எழுபது +௭௧~எழுபத்து ஒன்று +௭௨~எழுபத்து இரண்டு +௭௩~எழுபத்து மூன்று +௭௪~எழுபத்து நான்கு +௭௫~எழுபத்து ஐந்து +௭௬~எழுபத்து ஆறு +௭௭~எழுபத்து ஏழு +௭௮~எழுபத்து எட்டு +௭௯~எழுபத்து ஒன்பது +௮௦~எண்பது +௮௧~எண்பத்து ஒன்று +௮௨~எண்பத்து இரண்டு +௮௩~எண்பத்து மூன்று +௮௪~எண்பத்து நான்கு +௮௫~எண்பத்து ஐந்து +௮௬~எண்பத்து ஆறு +௮௭~எண்பத்து ஏழு +௮௮~எண்பத்து எட்டு +௮௯~எண்பத்து ஒன்பது +௯௦~தொண்ணூறு +௯௧~தொண்ணூற்று ஒன்று +௯௨~தொண்ணூற்று இரண்டு +௯௩~தொண்ணூற்று மூன்று +௯௪~தொண்ணூற்று நான்கு +௯௫~தொண்ணூற்று ஐந்து +௯௬~தொண்ணூற்று ஆறு +௯௭~தொண்ணூற்று ஏழு +௯௮~தொண்ணூற்று எட்டு +௯௯~தொண்ணூற்று ஒன்பது +௧௩௨௩~ஆயிரத்து முந்நூற்று இருபத்து மூன்று +௧௩௪௫~ஆயிரத்து முந்நூற்று நாற்பத்து ஐந்து +௧௩௪௫௬~பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு +௧௨௩௪௬~பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்து ஆறு +௧௨௩௪௫௬~ஒன்று இலட்சத்து இருபத்து மூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு +௮௭௨௯௮௭~எட்டு இலட்சத்து எழுபத்து இரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்து ஏழு +௯௮௭௬௦௯~ஒன்பது இலட்சத்து எண்பத்து ஏழுஆயிரத்து அறுநூற்று ஒன்பது +௯௮௭௬௭௮௯~தொண்ணூற்று எட்டு இலட்சத்து எழுபத்து ஆறுஆயிரத்து எழுநூற்று எண்பத்து ஒன்பது +௨௩௪௫௫௬௭~இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௧௨௩௪௫௫௬௭~ஒன்று கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௧௨௧௨௧௨௧௨~ஒன்று கோடியே இருபத்து ஒன்று இலட்சத்து இருபத்து ஒன்றுஆயிரத்து இருநூற்று பன்னிரண்டு +௧௧௨௨௩௪௫௫௬௭~ஒன்று அரபு பன்னிரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௧௦௨௨௩௪௫௫௬௭~ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௧௧௦௨௨௩௪௫௫௬௭~பதினொன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௫௧௦௨௨௩௪௫௫௬௭~ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௨ புள்ளிகள் ௧௨ கோல்கள்~இரண்டு புள்ளிகள் பன்னிரண்டு கோல்கள் +௦௫~சுழியம் ஐந்து +௦௧~சுழியம் ஒன்று +௦௭௩~சுழியம் ஏழு மூன்று +௦௦௦௧~சுழியம் சுழியம் சுழியம் ஒன்று +௦௦௦~சுழியம் சுழியம் சுழியம் diff --git a/tests/nemo_text_processing/ta/test_cardinal.py b/tests/nemo_text_processing/ta/test_cardinal.py new file mode 100644 index 000000000..3be785d55 --- /dev/null +++ b/tests/nemo_text_processing/ta/test_cardinal.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# 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 parameterized import parameterized + +from nemo_text_processing.inverse_text_normalization.inverse_normalize import InverseNormalizer +from nemo_text_processing.text_normalization.normalize import Normalizer + +from ..utils import CACHE_DIR, parse_test_case_file + + +class TestCardinal: + normalizer = Normalizer( + input_case='cased', lang='ta', cache_dir=CACHE_DIR, overwrite_cache=False, post_process=False + ) + #inverse_normalizer = InverseNormalizer(lang='ta', cache_dir=CACHE_DIR, overwrite_cache=False) + + @parameterized.expand(parse_test_case_file('ta/data_text_normalization/test_cases_cardinal.txt')) + @pytest.mark.run_only_on('CPU') + @pytest.mark.unit + def test_norm(self, test_input, expected): + pred = self.normalizer.normalize(test_input, verbose=False) + assert pred.strip() == expected.strip() + + #@parameterized.expand(parse_test_case_file('ta/data_inverse_text_normalization/test_cases_cardinal.txt')) + #@pytest.mark.run_only_on('CPU') + #@pytest.mark.unit + #def test_denorm(self, test_input, expected): + #pred = self.inverse_normalizer.inverse_normalize(test_input, verbose=False) + #assert pred == expected From a731cc150d2de19ffc3758a3a168818065ca6b34 Mon Sep 17 00:00:00 2001 From: surendran-246 Date: Wed, 17 Jun 2026 14:16:05 +0530 Subject: [PATCH 4/5] Updated Ta Cardinal Signed-off-by: surendran-246 --- .../text_normalization/run_evaluate.py | 2 +- .../text_normalization/ta/taggers/punctuation.py | 13 +++++++++++++ .../text_normalization/ta/taggers/word.py | 2 +- nemo_text_processing/text_normalization/ta/utils.py | 2 +- .../text_normalization/ta/verbalizers/verbalize.py | 2 -- .../ta/verbalizers/verbalize_final.py | 2 +- .../text_normalization/ta/verbalizers/word.py | 2 +- tests/nemo_text_processing/ta/__init__.py | 2 +- tests/nemo_text_processing/ta/test_cardinal.py | 2 +- 9 files changed, 20 insertions(+), 9 deletions(-) diff --git a/nemo_text_processing/text_normalization/run_evaluate.py b/nemo_text_processing/text_normalization/run_evaluate.py index fd0fac207..d0d5bada3 100644 --- a/nemo_text_processing/text_normalization/run_evaluate.py +++ b/nemo_text_processing/text_normalization/run_evaluate.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/nemo_text_processing/text_normalization/ta/taggers/punctuation.py b/nemo_text_processing/text_normalization/ta/taggers/punctuation.py index 32bc395e9..82aa82c93 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/punctuation.py +++ b/nemo_text_processing/text_normalization/ta/taggers/punctuation.py @@ -1,3 +1,16 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 sys from unicodedata import category diff --git a/nemo_text_processing/text_normalization/ta/taggers/word.py b/nemo_text_processing/text_normalization/ta/taggers/word.py index 6398a78fd..ed2566ade 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/word.py +++ b/nemo_text_processing/text_normalization/ta/taggers/word.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/nemo_text_processing/text_normalization/ta/utils.py b/nemo_text_processing/text_normalization/ta/utils.py index 5d314506e..fa0471fb6 100644 --- a/nemo_text_processing/text_normalization/ta/utils.py +++ b/nemo_text_processing/text_normalization/ta/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py index 2c27b0e56..dca601f77 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py @@ -42,9 +42,7 @@ def __init__(self, deterministic: bool = True): cardinal = CardinalFst(deterministic=deterministic) cardinal_graph = cardinal.fst - - graph = ( cardinal_graph diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py index f9c300aae..5eb01cd97 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize_final.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/word.py b/nemo_text_processing/text_normalization/ta/verbalizers/word.py index 9734d3d25..f9683a102 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/word.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/word.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/tests/nemo_text_processing/ta/__init__.py b/tests/nemo_text_processing/ta/__init__.py index d9155f923..4fc25d0d3 100644 --- a/tests/nemo_text_processing/ta/__init__.py +++ b/tests/nemo_text_processing/ta/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/tests/nemo_text_processing/ta/test_cardinal.py b/tests/nemo_text_processing/ta/test_cardinal.py index 3be785d55..58b20abd7 100644 --- a/tests/nemo_text_processing/ta/test_cardinal.py +++ b/tests/nemo_text_processing/ta/test_cardinal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 509d654018561533c4ff77651ca8ce046bb872df Mon Sep 17 00:00:00 2001 From: surendran-246 Date: Fri, 26 Jun 2026 16:51:35 +0530 Subject: [PATCH 5/5] Updated TA Ordinal class Signed-off-by: surendran-246 --- .../blind_testcases_ordinal_ta.txt | 312 +++++++ .../text_normalization/blind_testcases_ta | 884 ++++++++++++------ .../ta/data/numbers/__init__.py | 13 + .../ta/data/numbers/teens_and_ties.tsv | 144 +-- .../ta/data/numbers/teens_and_ties_en.tsv | 144 +-- .../ta/data/ordinal/__init__.py | 13 + .../ta/data/ordinal/exceptions.tsv | 72 ++ .../ta/data/ordinal/suffixes.tsv | 1 + .../text_normalization/ta/taggers/cardinal.py | 407 ++++---- .../text_normalization/ta/taggers/ordinal.py | 59 ++ .../ta/taggers/tokenize_and_classify.py | 8 +- .../ta/verbalizers/ordinal.py | 38 + .../ta/verbalizers/verbalize.py | 7 +- test_report.txt | 456 +++++++++ .../test_cases_cardinal.txt | 192 ++-- .../test_cases_ordinal.txt | 72 ++ tests/nemo_text_processing/ta/test_ordinal.py | 43 + 17 files changed, 2092 insertions(+), 773 deletions(-) create mode 100644 nemo_text_processing/text_normalization/blind_testcases_ordinal_ta.txt create mode 100644 nemo_text_processing/text_normalization/ta/data/numbers/__init__.py create mode 100644 nemo_text_processing/text_normalization/ta/data/ordinal/__init__.py create mode 100644 nemo_text_processing/text_normalization/ta/data/ordinal/exceptions.tsv create mode 100644 nemo_text_processing/text_normalization/ta/data/ordinal/suffixes.tsv create mode 100644 nemo_text_processing/text_normalization/ta/taggers/ordinal.py create mode 100644 nemo_text_processing/text_normalization/ta/verbalizers/ordinal.py create mode 100644 test_report.txt create mode 100644 tests/nemo_text_processing/ta/data_text_normalization/test_cases_ordinal.txt create mode 100644 tests/nemo_text_processing/ta/test_ordinal.py diff --git a/nemo_text_processing/text_normalization/blind_testcases_ordinal_ta.txt b/nemo_text_processing/text_normalization/blind_testcases_ordinal_ta.txt new file mode 100644 index 000000000..c005840b9 --- /dev/null +++ b/nemo_text_processing/text_normalization/blind_testcases_ordinal_ta.txt @@ -0,0 +1,312 @@ +ORDINAL ௧௦௦௧ஆவது ஆயிரத்து ஒன்றாவது + +ORDINAL ௧௦௦ஆவது நூறாவது + +ORDINAL ௧௦௧ஆவது நூற்று ஒன்றாவது + +ORDINAL ௧௦௭ஆவது நூற்று ஏழாவது + +ORDINAL ௧௦௯௧ஆவது ஆயிரத்து தொண்ணூற்றொன்றாவது + +ORDINAL ௧௦ஆவது பத்தாவது + +ORDINAL ௧௧௧ஆவது நூற்று பதினொன்றாவது + +ORDINAL ௧௧௨ஆவது நூற்று பன்னிரண்டாவது + +ORDINAL ௧௧௪ஆவது நூற்று பதினான்காவது + +ORDINAL ௧௧௫ஆவது நூற்று பதினைந்தாவது + +ORDINAL ௧௧௭ஆவது நூற்று பதினேழாவது + +ORDINAL ௧௧௮ஆவது நூற்று பதினெட்டாவது + +ORDINAL ௧௧௯ஆவது நூற்று பத்தொன்பதாவது + +ORDINAL ௧௧ஆவது பதினொன்றாவது + +ORDINAL ௧௨௦ஆவது நூற்று இருபதாவது + +ORDINAL ௧௨௧ஆவது நூற்று இருபத்தொன்றாவது + +ORDINAL ௧௨௨ஆவது நூற்று இருபத்திரண்டாவது + +ORDINAL ௧௨௫ஆவது நூற்று இருபத்திஐந்தாவது + +ORDINAL ௧௨ஆவது பன்னிரண்டாவது + +ORDINAL ௧௩௨ஆவது நூற்று முப்பத்திரண்டாவது + +ORDINAL ௧௩௪ஆவது நூற்று முப்பத்திநான்காவது + +ORDINAL ௧௩௭ஆவது நூற்று முப்பத்திஏழாவது + +ORDINAL ௧௩௯ஆவது நூற்று முப்பத்திஒன்பதாவது + +ORDINAL ௧௩ஆவது பதின்மூன்றாவது + +ORDINAL ௧௪௦ஆவது நூற்று நாற்பதாவது + +ORDINAL ௧௪௩ஆவது நூற்று நாற்பத்திமூன்றாவது + +ORDINAL ௧௪௯ஆவது நூற்று நாற்பத்திஒன்பதாவது + +ORDINAL ௧௪ஆவது பதினான்காவது + +ORDINAL ௧௫௩ஆவது நூற்று ஐம்பத்திமூன்றாவது + +ORDINAL ௧௫௯ஆவது நூற்று ஐம்பத்திஒன்பதாவது + +ORDINAL ௧௫ஆவது பதினைந்தாவது + +ORDINAL ௧௬௦ஆவது நூற்று அறுபதாவது + +ORDINAL ௧௬௭ஆவது நூற்று அறுபத்திஏழாவது + +ORDINAL ௧௬ஆவது பதினாறாவது + +ORDINAL ௧௭௧ஆவது நூற்று எழுபத்தொன்றாவது + +ORDINAL ௧௭௩ஆவது நூற்று எழுபத்திமூன்றாவது + +ORDINAL ௧௭௪ஆவது நூற்று எழுபத்திநான்காவது + +ORDINAL ௧௭௬ஆவது நூற்று எழுபத்திஆறாவது + +ORDINAL ௧௭௮௨ஆவது ஆயிரத்து எழுநூற்று எண்பத்திரண்டாவது + +ORDINAL ௧௭௮ஆவது நூற்று எழுபத்தெட்டாவது + +ORDINAL ௧௭ஆவது பதினேழாவது + +ORDINAL ௧௮௨௬ஆவது ஆயிரத்து எட்டுநூற்று இருபத்திஆறாவது + +ORDINAL ௧௮௨ஆவது நூற்று எண்பத்திரண்டாவது + +ORDINAL ௧௮௩ஆவது நூற்று எண்பத்திமூன்றாவது + +ORDINAL ௧௮௭ஆவது நூற்று எண்பத்திஏழாவது + +ORDINAL ௧௮௯௦ஆவது ஆயிரத்து எட்டுநூற்று தொண்ணூறாவது + +ORDINAL ௧௮௯ஆவது நூற்று எண்பத்திஒன்பதாவது + +ORDINAL ௧௮ஆவது பதினெட்டாவது + +ORDINAL ௧௯௦ஆவது நூற்று தொண்ணூறாவது + +ORDINAL ௧௯௧ஆவது நூற்று தொண்ணூற்றொன்றாவது + +ORDINAL ௧௯௨௦ஆவது ஆயிரத்து ஒன்பதுநூற்று இருபதாவது + +ORDINAL ௧௯௫ஆவது நூற்று தொண்ணூற்றிஐந்தாவது + +ORDINAL ௧௯௬ஆவது நூற்று தொண்ணூற்றிஆறாவது + +ORDINAL ௧௯௮௧ஆவது ஆயிரத்து ஒன்பதுநூற்று எண்பத்தொன்றாவது + +ORDINAL ௧௯௮ஆவது நூற்று தொண்ணூற்றிஎட்டாவது + +ORDINAL ௧௯ஆவது பத்தொன்பதாவது + +ORDINAL ௨௦ஆவது இருபதாவது + +ORDINAL ௨௧௯ஆவது இருநூற்று பத்தொன்பதாவது + +ORDINAL ௨௧ஆவது இருபத்தொன்றாவது + +ORDINAL ௨௨௩ஆவது இருநூற்று இருபத்திமூன்றாவது + +ORDINAL ௨௨ஆவது இருபத்திரண்டாவது + +ORDINAL ௨௩௨ஆவது இருநூற்று முப்பத்திரண்டாவது + +ORDINAL ௨௩௩ஆவது இருநூற்று முப்பத்திமூன்றாவது + +ORDINAL ௨௩௪ஆவது இருநூற்று முப்பத்திநான்காவது + +ORDINAL ௨௩ஆவது இருபத்திமூன்றாவது + +ORDINAL ௨௪௦ஆவது இருநூற்று நாற்பதாவது + +ORDINAL ௨௪ஆவது இருபத்திநான்காவது + +ORDINAL ௨௫௮ஆவது இருநூற்று ஐம்பத்திஎட்டாவது + +ORDINAL ௨௫ஆவது இருபத்திஐந்தாவது + +ORDINAL ௨௬௯ஆவது இருநூற்று அறுபத்திஒன்பதாவது + +ORDINAL ௨௬ஆவது இருபத்திஆறாவது + +ORDINAL ௨௭௫ஆவது இருநூற்று எழுபத்திஐந்தாவது + +ORDINAL ௨௭ஆவது இருபத்திஏழாவது + +ORDINAL ௨௮ஆவது இருபத்திஎட்டாவது + +ORDINAL ௨௯ஆவது இருபத்திஒன்பதாவது + +ORDINAL ௩௦ஆவது முப்பதாவது + +ORDINAL ௩௧ஆவது முப்பத்தொன்றாவது + +ORDINAL ௩௨௨ஆவது முந்நூற்று இருபத்திரண்டாவது + +ORDINAL ௩௨௯ஆவது முந்நூற்று இருபத்திஒன்பதாவது + +ORDINAL ௩௨ஆவது முப்பத்திரண்டாவது + +ORDINAL ௩௩ஆவது முப்பத்திமூன்றாவது + +ORDINAL ௩௪ஆவது முப்பத்திநான்காவது + +ORDINAL ௩௫ஆவது முப்பத்திஐந்தாவது + +ORDINAL ௩௬௫ஆவது முந்நூற்று அறுபத்திஐந்தாவது + +ORDINAL ௩௬ஆவது முப்பத்திஆறாவது + +ORDINAL ௩௭ஆவது முப்பத்திஏழாவது + +ORDINAL ௩௮௨ஆவது முந்நூற்று எண்பத்திரண்டாவது + +ORDINAL ௩௮௭ஆவது முந்நூற்று எண்பத்திஏழாவது + +ORDINAL ௩௮ஆவது முப்பத்திஎட்டாவது + +ORDINAL ௩௯ஆவது முப்பத்திஒன்பதாவது + +ORDINAL ௪௦ஆவது நாற்பதாவது + +ORDINAL ௪௧ஆவது நாற்பத்தொன்றாவது + +ORDINAL ௪௨ஆவது நாற்பத்திரண்டாவது + +ORDINAL ௪௩ஆவது நாற்பத்திமூன்றாவது + +ORDINAL ௪௪ஆவது நாற்பத்திநான்காவது + +ORDINAL ௪௫௫ஆவது நானூற்று ஐம்பத்திஐந்தாவது + +ORDINAL ௪௫ஆவது நாற்பத்திஐந்தாவது + +ORDINAL ௪௬௫ஆவது நானூற்று அறுபத்திஐந்தாவது + +ORDINAL ௪௬ஆவது நாற்பத்திஆறாவது + +ORDINAL ௪௭ஆவது நாற்பத்திஏழாவது + +ORDINAL ௪௮ஆவது நாற்பத்திஎட்டாவது + +ORDINAL ௪௯௮ஆவது நானூற்று தொண்ணூற்றிஎட்டாவது + +ORDINAL ௪௯ஆவது நாற்பத்திஒன்பதாவது + +ORDINAL ௫௦ஆவது ஐம்பதாவது + +ORDINAL ௫௧ஆவது ஐம்பத்தொன்றாவது + +ORDINAL ௫௨௫ஆவது ஐநூற்று இருபத்திஐந்தாவது + +ORDINAL ௫௨ஆவது ஐம்பத்திரண்டாவது + +ORDINAL ௫௩ஆவது ஐம்பத்திமூன்றாவது + +ORDINAL ௫௪ஆவது ஐம்பத்திநான்காவது + +ORDINAL ௫௫௫ஆவது ஐநூற்று ஐம்பத்திஐந்தாவது + +ORDINAL ௫௫ஆவது ஐம்பத்திஐந்தாவது + +ORDINAL ௫௬ஆவது ஐம்பத்திஆறாவது + +ORDINAL ௫௭ஆவது ஐம்பத்திஏழாவது + +ORDINAL ௫௮ஆவது ஐம்பத்திஎட்டாவது + +ORDINAL ௫௯ஆவது ஐம்பத்திஒன்பதாவது + +ORDINAL ௫ஆவது ஐந்தாவது + +ORDINAL ௬௦ஆவது அறுபதாவது + +ORDINAL ௬௧ஆவது அறுபத்தொன்றாவது + +ORDINAL ௬௨ஆவது அறுபத்திரண்டாவது + +ORDINAL ௬௩ஆவது அறுபத்திமூன்றாவது + +ORDINAL ௬௪௦ஆவது அறுநூற்று நாற்பதாவது + +ORDINAL ௬௪ஆவது அறுபத்திநான்காவது + +ORDINAL ௬௫ஆவது அறுபத்திஐந்தாவது + +ORDINAL ௬௭ஆவது அறுபத்திஏழாவது + +ORDINAL ௬௮ஆவது அறுபத்திஎட்டாவது + +ORDINAL ௬௯ஆவது அறுபத்திஒன்பதாவது + +ORDINAL ௭௦ஆவது எழுபதாவது + +ORDINAL ௭௧ஆவது எழுபத்தொன்றாவது + +ORDINAL ௭௨ஆவது எழுபத்திரண்டாவது + +ORDINAL ௭௩ஆவது எழுபத்திமூன்றாவது + +ORDINAL ௭௪ஆவது எழுபத்திநான்காவது + +ORDINAL ௭௫ஆவது எழுபத்திஐந்தாவது + +ORDINAL ௭௬ஆவது எழுபத்திஆறாவது + +ORDINAL ௭௭ஆவது எழுபத்தேழாவது + +ORDINAL ௭௮ஆவது எழுபத்தெட்டாவது + +ORDINAL ௭௯ஆவது எழுபத்தொன்பதாவது + +ORDINAL ௭ஆவது ஏழாவது + +ORDINAL ௮௦ஆவது எண்பதாவது + +ORDINAL ௮௧ஆவது எண்பத்தொன்றாவது + +ORDINAL ௮௨ஆவது எண்பத்திரண்டாவது + +ORDINAL ௮௬ஆவது எண்பத்திஆறாவது + +ORDINAL ௮௮ஆவது எண்பத்திஎட்டாவது + +ORDINAL ௮௯௦ஆவது எட்டுநூற்று தொண்ணூறாவது + +ORDINAL ௮௯ஆவது எண்பத்திஒன்பதாவது + +ORDINAL ௮ஆவது எட்டாவது + +ORDINAL ௯௦ஆவது தொண்ணூறாவது + +ORDINAL ௯௧ஆவது தொண்ணூற்றொன்றாவது + +ORDINAL ௯௨ஆவது தொண்ணூற்றிரண்டாவது + +ORDINAL ௯௪ஆவது தொண்ணூற்றிநான்காவது + +ORDINAL ௯௫ஆவது தொண்ணூற்றிஐந்தாவது + +ORDINAL ௯௬ஆவது தொண்ணூற்றிஆறாவது + +ORDINAL ௯௭ஆவது தொண்ணூற்றிஏழாவது + +ORDINAL ௯௮௨௬ஆவது ஒன்பதாயிரத்து எட்டுநூற்று இருபத்திஆறாவது + +ORDINAL ௯௮ஆவது தொண்ணூற்றிஎட்டாவது + +ORDINAL ௯௯ஆவது தொண்ணூற்றிஒன்பதாவது + +ORDINAL ௯ஆவது ஒன்பதாவது + \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/blind_testcases_ta b/nemo_text_processing/text_normalization/blind_testcases_ta index 4a2911adf..ac6b4efea 100644 --- a/nemo_text_processing/text_normalization/blind_testcases_ta +++ b/nemo_text_processing/text_normalization/blind_testcases_ta @@ -228,7 +228,7 @@ CARDINAL ௪ தோல்வி ௩ வெற்றி ௧ டிரா நா CARDINAL படம் ௧௯ பாடம் ௨ படம் பத்தொன்பது பாடம் இரண்டு -CARDINAL பாடம் ௧ பக்கம் ௧௨௨ பாடம் ஒன்று பக்கம் நூற்று இருபத்து இரண்டு +CARDINAL பாடம் ௧ பக்கம் ௧௨௨ பாடம் ஒன்று பக்கம் நூற்று இருபத்திரண்டு CARDINAL பாடம் ௩ வரிசை ௬ பாடம் மூன்று வரிசை ஆறு @@ -240,7 +240,7 @@ CARDINAL ௨ டெஸ்ட் போட்டிகள் ௬ ஒன்று CARDINAL ௨ ஓவரில் ௭ ரன் இரண்டு ஓவரில் ஏழு ரன் -CARDINAL ௮ ஓவரில் ௪௫ ரன் எட்டு ஓவரில் நாற்பத்து ஐந்து ரன் +CARDINAL ௮ ஓவரில் ௪௫ ரன் எட்டு ஓவரில் நாற்பத்திஐந்து ரன் CARDINAL ௯ ஓவரில் ௬௦ ரன் ஒன்பது ஓவரில் அறுபது ரன் @@ -250,7 +250,7 @@ CARDINAL ௨ வெற்றி ௪ தோல்வி ௫ டிரா இர CARDINAL ஸ்லோகம் ௯ பக்கம் ௭ ஸ்லோகம் ஒன்பது பக்கம் ஏழு -CARDINAL பாடம் ௨ பக்கம் ௬௬ பாடம் இரண்டு பக்கம் அறுபத்து ஆறு +CARDINAL பாடம் ௨ பக்கம் ௬௬ பாடம் இரண்டு பக்கம் அறுபத்திஆறு CARDINAL ௨ டயகிராம் ௧௩ பக்க எண் இரண்டு டயகிராம் பதிமூன்று பக்க எண் @@ -260,7 +260,7 @@ CARDINAL பக்க எண் ௧௦ பாடம் ௩ பக்க எண CARDINAL ருகு ௩ ஆயத் ௮ ருகு மூன்று ஆயத் எட்டு -CARDINAL ருகு ௪ ஆயத் ௬ வரி ௩௩ ருகு நான்கு ஆயத் ஆறு வரி முப்பத்து மூன்று +CARDINAL ருகு ௪ ஆயத் ௬ வரி ௩௩ ருகு நான்கு ஆயத் ஆறு வரி முப்பத்திமூன்று CARDINAL பாரா ௨ ருகு ௭ வரி ௧௫ பாரா இரண்டு ருகு ஏழு வரி பதினைந்து @@ -272,7 +272,7 @@ CARDINAL ௫ புள்ளிகள் ௭ கோல்கள் ஐந்த CARDINAL பதிப்பு ௨ தலைமுறை ௪ பதிப்பு இரண்டு தலைமுறை நான்கு -CARDINAL ௮ செங்கற்கள் ௩௨ கற்கள் எட்டு செங்கற்கள் முப்பத்து இரண்டு கற்கள் +CARDINAL ௮ செங்கற்கள் ௩௨ கற்கள் எட்டு செங்கற்கள் முப்பத்திரண்டு கற்கள் CARDINAL ௯ ஓவரில் ௧௫ ரன்கள் ஒன்பது ஓவரில் பதினைந்து ரன்கள் @@ -280,7 +280,7 @@ CARDINAL ௪ விக்கெட் ௧௧௩ ரன்கள் நான் CARDINAL ௭ விக்கெட் ௨௧௧ ரன்கள் ஏழு விக்கெட் இருநூற்று பதினொன்று ரன்கள் -CARDINAL ௪ சிக்ஸர்கள் ௫ ஃபோர்கள் ௪௪ ரன்கள் நான்கு சிக்ஸர்கள் ஐந்து ஃபோர்கள் நாற்பத்து நான்கு ரன்கள் +CARDINAL ௪ சிக்ஸர்கள் ௫ ஃபோர்கள் ௪௪ ரன்கள் நான்கு சிக்ஸர்கள் ஐந்து ஃபோர்கள் நாற்பத்திநான்கு ரன்கள் CARDINAL ருகு ௮ வரி ௧௦ ருகு எட்டு வரி பத்து @@ -330,7 +330,7 @@ CARDINAL ௪ பந்துகளில் ௬ நான்கு பந்த CARDINAL ௧௭ பந்துகளில் ௧௦ ரன்கள் பதினேழு பந்துகளில் பத்து ரன்கள் -CARDINAL ௫ ஓவர் ௬௬ ரன்கள் ஐந்து ஓவர் அறுபத்து ஆறு ரன்கள் +CARDINAL ௫ ஓவர் ௬௬ ரன்கள் ஐந்து ஓவர் அறுபத்திஆறு ரன்கள் CARDINAL ௮ புள்ளிகள் ௯ கோல்கள் எட்டு புள்ளிகள் ஒன்பது கோல்கள் @@ -340,7 +340,7 @@ CARDINAL ௬ ருகு ௭ பாரா ஆறு ருகு ஏழு ப CARDINAL சுலோகம் ௮ பதம் ௯ சுலோகம் எட்டு பதம் ஒன்பது -CARDINAL ௭ ஓவரில் ௨௧ ரன்கள் ஏழு ஓவரில் இருபத்து ஒன்று ரன்கள் +CARDINAL ௭ ஓவரில் ௨௧ ரன்கள் ஏழு ஓவரில் இருபத்தொன்று ரன்கள் CARDINAL ௧ ஓவரில் ௩ ரன்கள் ஒன்று ஓவரில் மூன்று ரன்கள் @@ -366,7 +366,7 @@ CARDINAL ஆயத் ௪ வரி ௯ ஆயத் நான்கு வர CARDINAL பாரா ௪ ருகு ௧௦ வரி ௧௭ பாரா நான்கு ருகு பத்து வரி பதினேழு -CARDINAL பாரா ௬ ருகு ௨௫ வரி ௨௦ பாரா ஆறு ருகு இருபத்து ஐந்து வரி இருபது +CARDINAL பாரா ௬ ருகு ௨௫ வரி ௨௦ பாரா ஆறு ருகு இருபத்திஐந்து வரி இருபது CARDINAL பாடம் ௩ தோஹா ௪ வரி ௨ பாடம் மூன்று தோஹா நான்கு வரி இரண்டு @@ -476,7 +476,7 @@ CARDINAL ௧௦௦௦ ரூபாய் ௨ நோட்டுகள் ஆய CARDINAL ௧௯ இல் ௩ கண்ணாடிகள் பத்தொன்பது இல் மூன்று கண்ணாடிகள் -CARDINAL பக்கம் ௧௯௯ பாடம் ௬ பக்கம் நூற்று தொண்ணூற்று ஒன்பது பாடம் ஆறு +CARDINAL பக்கம் ௧௯௯ பாடம் ௬ பக்கம் நூற்று தொண்ணூற்றிஒன்பது பாடம் ஆறு CARDINAL ௮ பாராக்கள் எட்டு பாராக்கள் @@ -492,7 +492,7 @@ CARDINAL ௨ மஞ்சள் ௮ சிவப்பு அட்டைகள CARDINAL அத்தியாயம் ௧௨ சுலோகம் ௮ அத்தியாயம் பன்னிரண்டு சுலோகம் எட்டு -CARDINAL பக்கம் ௮௮ அத்தியாயம் ௭ பக்கம் எண்பத்து எட்டு அத்தியாயம் ஏழு +CARDINAL பக்கம் ௮௮ அத்தியாயம் ௭ பக்கம் எண்பத்திஎட்டு அத்தியாயம் ஏழு CARDINAL ௧௦௦ ரன்கள் ௫ விக்கெட்டுகள் நூறு ரன்கள் ஐந்து விக்கெட்டுகள் @@ -746,73 +746,73 @@ CARDINAL ௮௧௯ எட்டுநூற்று பத்தொன்பத CARDINAL ௮௨௦ எட்டுநூற்று இருபது -CARDINAL ௮௨௧ எட்டுநூற்று இருபத்து ஒன்று +CARDINAL ௮௨௧ எட்டுநூற்று இருபத்தொன்று -CARDINAL ௮௨௨ எட்டுநூற்று இருபத்து இரண்டு +CARDINAL ௮௨௨ எட்டுநூற்று இருபத்திரண்டு -CARDINAL ௮௨௩ எட்டுநூற்று இருபத்து மூன்று +CARDINAL ௮௨௩ எட்டுநூற்று இருபத்திமூன்று -CARDINAL ௮௨௪ எட்டுநூற்று இருபத்து நான்கு +CARDINAL ௮௨௪ எட்டுநூற்று இருபத்திநான்கு -CARDINAL ௮௨௫ எட்டுநூற்று இருபத்து ஐந்து +CARDINAL ௮௨௫ எட்டுநூற்று இருபத்திஐந்து -CARDINAL ௮௨௬ எட்டுநூற்று இருபத்து ஆறு +CARDINAL ௮௨௬ எட்டுநூற்று இருபத்திஆறு -CARDINAL ௮௨௭ எட்டுநூற்று இருபத்து ஏழு +CARDINAL ௮௨௭ எட்டுநூற்று இருபத்திஏழு -CARDINAL ௮௨௮ எட்டுநூற்று இருபத்து எட்டு +CARDINAL ௮௨௮ எட்டுநூற்று இருபத்திஎட்டு -CARDINAL ௮௨௯ எட்டுநூற்று இருபத்து ஒன்பது +CARDINAL ௮௨௯ எட்டுநூற்று இருபத்திஒன்பது CARDINAL ௮௩௦ எட்டுநூற்று முப்பது -CARDINAL ௮௩௧ எட்டுநூற்று முப்பத்து ஒன்று +CARDINAL ௮௩௧ எட்டுநூற்று முப்பத்தொன்று -CARDINAL ௮௩௨ எட்டுநூற்று முப்பத்து இரண்டு +CARDINAL ௮௩௨ எட்டுநூற்று முப்பத்திரண்டு -CARDINAL ௮௩௩ எட்டுநூற்று முப்பத்து மூன்று +CARDINAL ௮௩௩ எட்டுநூற்று முப்பத்திமூன்று -CARDINAL ௮௩௪ எட்டுநூற்று முப்பத்து நான்கு +CARDINAL ௮௩௪ எட்டுநூற்று முப்பத்திநான்கு -CARDINAL ௮௩௫ எட்டுநூற்று முப்பத்து ஐந்து +CARDINAL ௮௩௫ எட்டுநூற்று முப்பத்திஐந்து -CARDINAL ௮௩௬ எட்டுநூற்று முப்பத்து ஆறு +CARDINAL ௮௩௬ எட்டுநூற்று முப்பத்திஆறு -CARDINAL ௭௩௮ எழுநூற்று முப்பத்து எட்டு +CARDINAL ௭௩௮ எழுநூற்று முப்பத்திஎட்டு -CARDINAL ௭௩௯ எழுநூற்று முப்பத்து ஒன்பது +CARDINAL ௭௩௯ எழுநூற்று முப்பத்திஒன்பது CARDINAL ௭௪௦ எழுநூற்று நாற்பது -CARDINAL ௭௪௧ எழுநூற்று நாற்பத்து ஒன்று +CARDINAL ௭௪௧ எழுநூற்று நாற்பத்தொன்று -CARDINAL ௭௪௨ எழுநூற்று நாற்பத்து இரண்டு +CARDINAL ௭௪௨ எழுநூற்று நாற்பத்திரண்டு -CARDINAL ௭௪௩ எழுநூற்று நாற்பத்து மூன்று +CARDINAL ௭௪௩ எழுநூற்று நாற்பத்திமூன்று -CARDINAL ௭௪௪ எழுநூற்று நாற்பத்து நான்கு +CARDINAL ௭௪௪ எழுநூற்று நாற்பத்திநான்கு -CARDINAL ௭௪௫ எழுநூற்று நாற்பத்து ஐந்து +CARDINAL ௭௪௫ எழுநூற்று நாற்பத்திஐந்து -CARDINAL ௪௪௬ நானூற்று நாற்பத்து ஆறு +CARDINAL ௪௪௬ நானூற்று நாற்பத்திஆறு -CARDINAL ௪௪௭ நானூற்று நாற்பத்து ஏழு +CARDINAL ௪௪௭ நானூற்று நாற்பத்திஏழு -CARDINAL ௪௪௮ நானூற்று நாற்பத்து எட்டு +CARDINAL ௪௪௮ நானூற்று நாற்பத்திஎட்டு -CARDINAL ௪௪௯ நானூற்று நாற்பத்து ஒன்பது +CARDINAL ௪௪௯ நானூற்று நாற்பத்திஒன்பது CARDINAL ௪௫௦ நானூற்று ஐம்பது -CARDINAL ௪௬௧ நானூற்று அறுபத்து ஒன்று +CARDINAL ௪௬௧ நானூற்று அறுபத்தொன்று -CARDINAL ௧௭௫ நூற்று எழுபத்து ஐந்து +CARDINAL ௧௭௫ நூற்று எழுபத்திஐந்து -CARDINAL ௧௮௧ நூற்று எண்பத்து ஒன்று +CARDINAL ௧௮௧ நூற்று எண்பத்தொன்று CARDINAL ௧௯௦ நூற்று தொண்ணூறு -CARDINAL ௧௯௯ நூற்று தொண்ணூற்று ஒன்பது +CARDINAL ௧௯௯ நூற்று தொண்ணூற்றிஒன்பது CARDINAL ௧௦௦௧ ஆயிரத்து ஒன்று @@ -854,75 +854,75 @@ CARDINAL ௧௦௧௯ ஆயிரத்து பத்தொன்பது CARDINAL ௧௦௨௦ ஆயிரத்து இருபது -CARDINAL ௧௦௨௧ ஆயிரத்து இருபத்து ஒன்று +CARDINAL ௧௦௨௧ ஆயிரத்து இருபத்தொன்று -CARDINAL ௧௦௨௨ ஆயிரத்து இருபத்து இரண்டு +CARDINAL ௧௦௨௨ ஆயிரத்து இருபத்திரண்டு -CARDINAL ௧௧௨௩ ஆயிரத்து நூற்று இருபத்து மூன்று +CARDINAL ௧௧௨௩ ஆயிரத்து நூற்று இருபத்திமூன்று -CARDINAL ௧௪௨௪ ஆயிரத்து நானூற்று இருபத்து நான்கு +CARDINAL ௧௪௨௪ ஆயிரத்து நானூற்று இருபத்திநான்கு -CARDINAL ௧௫௨௫ ஆயிரத்து ஐந்நூற்று இருபத்து ஐந்து +CARDINAL ௧௫௨௫ ஆயிரத்து ஐநூற்று இருபத்திஐந்து -CARDINAL ௧௩௨௬ ஆயிரத்து முந்நூற்று இருபத்து ஆறு +CARDINAL ௧௩௨௬ ஆயிரத்து முந்நூற்று இருபத்திஆறு -CARDINAL ௧௪௨௭ ஆயிரத்து நானூற்று இருபத்து ஏழு +CARDINAL ௧௪௨௭ ஆயிரத்து நானூற்று இருபத்திஏழு -CARDINAL ௧௬௨௮ ஆயிரத்து அறுநூற்று இருபத்து எட்டு +CARDINAL ௧௬௨௮ ஆயிரத்து அறுநூற்று இருபத்திஎட்டு -CARDINAL ௧௭௨௯ ஆயிரத்து எழுநூற்று இருபத்து ஒன்பது +CARDINAL ௧௭௨௯ ஆயிரத்து எழுநூற்று இருபத்திஒன்பது CARDINAL ௧௮௩௦ ஆயிரத்து எட்டுநூற்று முப்பது -CARDINAL ௧௧௩௧ ஆயிரத்து நூற்று முப்பத்து ஒன்று +CARDINAL ௧௧௩௧ ஆயிரத்து நூற்று முப்பத்தொன்று -CARDINAL ௧௨௩௨ ஆயிரத்து இருநூற்று முப்பத்து இரண்டு +CARDINAL ௧௨௩௨ ஆயிரத்து இருநூற்று முப்பத்திரண்டு -CARDINAL ௧௩௩௩ ஆயிரத்து முந்நூற்று முப்பத்து மூன்று +CARDINAL ௧௩௩௩ ஆயிரத்து முந்நூற்று முப்பத்திமூன்று -CARDINAL ௧௪௩௪ ஆயிரத்து நானூற்று முப்பத்து நான்கு +CARDINAL ௧௪௩௪ ஆயிரத்து நானூற்று முப்பத்திநான்கு -CARDINAL ௧௫௩௫ ஆயிரத்து ஐந்நூற்று முப்பத்து ஐந்து +CARDINAL ௧௫௩௫ ஆயிரத்து ஐநூற்று முப்பத்திஐந்து -CARDINAL ௧௬௩௬ ஆயிரத்து அறுநூற்று முப்பத்து ஆறு +CARDINAL ௧௬௩௬ ஆயிரத்து அறுநூற்று முப்பத்திஆறு -CARDINAL ௧௭௩௭ ஆயிரத்து எழுநூற்று முப்பத்து ஏழு +CARDINAL ௧௭௩௭ ஆயிரத்து எழுநூற்று முப்பத்திஏழு -CARDINAL ௧௮௩௮ ஆயிரத்து எட்டுநூற்று முப்பத்து எட்டு +CARDINAL ௧௮௩௮ ஆயிரத்து எட்டுநூற்று முப்பத்திஎட்டு -CARDINAL ௧௯௩௯ ஆயிரத்து ஒன்பதுநூற்று முப்பத்து ஒன்பது +CARDINAL ௧௯௩௯ ஆயிரத்து ஒன்பதுநூற்று முப்பத்திஒன்பது CARDINAL ௧௦௪௦ ஆயிரத்து நாற்பது -CARDINAL ௧௦௪௧ ஆயிரத்து நாற்பத்து ஒன்று +CARDINAL ௧௦௪௧ ஆயிரத்து நாற்பத்தொன்று -CARDINAL ௧௦௪௨ ஆயிரத்து நாற்பத்து இரண்டு +CARDINAL ௧௦௪௨ ஆயிரத்து நாற்பத்திரண்டு -CARDINAL ௧௦௪௩ ஆயிரத்து நாற்பத்து மூன்று +CARDINAL ௧௦௪௩ ஆயிரத்து நாற்பத்திமூன்று -CARDINAL ௧௦௪௪ ஆயிரத்து நாற்பத்து நான்கு +CARDINAL ௧௦௪௪ ஆயிரத்து நாற்பத்திநான்கு -CARDINAL ௧௦௪௫ ஆயிரத்து நாற்பத்து ஐந்து +CARDINAL ௧௦௪௫ ஆயிரத்து நாற்பத்திஐந்து -CARDINAL ௧௦௪௬ ஆயிரத்து நாற்பத்து ஆறு +CARDINAL ௧௦௪௬ ஆயிரத்து நாற்பத்திஆறு -CARDINAL ௧௦௪௭ ஆயிரத்து நாற்பத்து ஏழு +CARDINAL ௧௦௪௭ ஆயிரத்து நாற்பத்திஏழு -CARDINAL ௧௦௪௮ ஆயிரத்து நாற்பத்து எட்டு +CARDINAL ௧௦௪௮ ஆயிரத்து நாற்பத்திஎட்டு -CARDINAL ௧௦௪௯ ஆயிரத்து நாற்பத்து ஒன்பது +CARDINAL ௧௦௪௯ ஆயிரத்து நாற்பத்திஒன்பது CARDINAL ௧௦௫௦ ஆயிரத்து ஐம்பது -CARDINAL ௧௦௬௧ ஆயிரத்து அறுபத்து ஒன்று +CARDINAL ௧௦௬௧ ஆயிரத்து அறுபத்தொன்று -CARDINAL ௧௦௭௫ ஆயிரத்து எழுபத்து ஐந்து +CARDINAL ௧௦௭௫ ஆயிரத்து எழுபத்திஐந்து -CARDINAL ௧௦௮௧ ஆயிரத்து எண்பத்து ஒன்று +CARDINAL ௧௦௮௧ ஆயிரத்து எண்பத்தொன்று CARDINAL ௧௦௯௦ ஆயிரத்து தொண்ணூறு -CARDINAL ௧௦௯௯ ஆயிரத்து தொண்ணூற்று ஒன்பது +CARDINAL ௧௦௯௯ ஆயிரத்து தொண்ணூற்றிஒன்பது CARDINAL ௧௦௦௦௧ பத்துஆயிரத்து ஒன்று @@ -934,9 +934,9 @@ CARDINAL ௧௦௩௦௪ பத்துஆயிரத்து முந்ந CARDINAL ௧௧௩௦௫ பதினொன்றுஆயிரத்து முந்நூற்று ஐந்து -CARDINAL ௧௨௪௫௬ பன்னிரண்டுஆயிரத்து நானூற்று ஐம்பத்து ஆறு +CARDINAL ௧௨௪௫௬ பன்னிரண்டுஆயிரத்து நானூற்று ஐம்பத்திஆறு -CARDINAL ௧௩௦௪௭ பதிமூன்றுஆயிரத்து நாற்பத்து ஏழு +CARDINAL ௧௩௦௪௭ பதிமூன்றுஆயிரத்து நாற்பத்திஏழு CARDINAL ௧௦௦௦௮ பத்துஆயிரத்து எட்டு @@ -964,435 +964,747 @@ CARDINAL ௧௦௦௧௯ பத்துஆயிரத்து பத்தொ CARDINAL ௧௦௦௨௦ பத்துஆயிரத்து இருபது -CARDINAL ௧௦௦௨௧ பத்துஆயிரத்து இருபத்து ஒன்று +CARDINAL ௧௦௦௨௧ பத்துஆயிரத்து இருபத்தொன்று -CARDINAL ௧௦௦௨௨ பத்துஆயிரத்து இருபத்து இரண்டு +CARDINAL ௧௦௦௨௨ பத்துஆயிரத்து இருபத்திரண்டு -CARDINAL ௧௦௦௨௩ பத்துஆயிரத்து இருபத்து மூன்று +CARDINAL ௧௦௦௨௩ பத்துஆயிரத்து இருபத்திமூன்று -CARDINAL ௧௦௦௨௪ பத்துஆயிரத்து இருபத்து நான்கு +CARDINAL ௧௦௦௨௪ பத்துஆயிரத்து இருபத்திநான்கு -CARDINAL ௧௦௦௨௫ பத்துஆயிரத்து இருபத்து ஐந்து +CARDINAL ௧௦௦௨௫ பத்துஆயிரத்து இருபத்திஐந்து -CARDINAL ௧௦௦௨௬ பத்துஆயிரத்து இருபத்து ஆறு +CARDINAL ௧௦௦௨௬ பத்துஆயிரத்து இருபத்திஆறு -CARDINAL ௧௦௦௨௭ பத்துஆயிரத்து இருபத்து ஏழு +CARDINAL ௧௦௦௨௭ பத்துஆயிரத்து இருபத்திஏழு -CARDINAL ௧௦௦௨௮ பத்துஆயிரத்து இருபத்து எட்டு +CARDINAL ௧௦௦௨௮ பத்துஆயிரத்து இருபத்திஎட்டு -CARDINAL ௧௦௦௨௯ பத்துஆயிரத்து இருபத்து ஒன்பது +CARDINAL ௧௦௦௨௯ பத்துஆயிரத்து இருபத்திஒன்பது CARDINAL ௧௦௦௩௦ பத்துஆயிரத்து முப்பது -CARDINAL ௧௦௦௩௧ பத்துஆயிரத்து முப்பத்து ஒன்று +CARDINAL ௧௦௦௩௧ பத்துஆயிரத்து முப்பத்தொன்று -CARDINAL ௧௦௦௩௨ பத்துஆயிரத்து முப்பத்து இரண்டு +CARDINAL ௧௦௦௩௨ பத்துஆயிரத்து முப்பத்திரண்டு -CARDINAL ௧௦௦௩௩ பத்துஆயிரத்து முப்பத்து மூன்று +CARDINAL ௧௦௦௩௩ பத்துஆயிரத்து முப்பத்திமூன்று -CARDINAL ௧௦௦௩௪ பத்துஆயிரத்து முப்பத்து நான்கு +CARDINAL ௧௦௦௩௪ பத்துஆயிரத்து முப்பத்திநான்கு -CARDINAL ௧௦௦௩௫ பத்துஆயிரத்து முப்பத்து ஐந்து +CARDINAL ௧௦௦௩௫ பத்துஆயிரத்து முப்பத்திஐந்து -CARDINAL ௧௦௦௩௬ பத்துஆயிரத்து முப்பத்து ஆறு +CARDINAL ௧௦௦௩௬ பத்துஆயிரத்து முப்பத்திஆறு -CARDINAL ௧௦௦௩௭ பத்துஆயிரத்து முப்பத்து ஏழு +CARDINAL ௧௦௦௩௭ பத்துஆயிரத்து முப்பத்திஏழு -CARDINAL ௧௦௦௩௮ பத்துஆயிரத்து முப்பத்து எட்டு +CARDINAL ௧௦௦௩௮ பத்துஆயிரத்து முப்பத்திஎட்டு -CARDINAL ௧௦௦௩௯ பத்துஆயிரத்து முப்பத்து ஒன்பது +CARDINAL ௧௦௦௩௯ பத்துஆயிரத்து முப்பத்திஒன்பது CARDINAL ௧௦௦௪௦ பத்துஆயிரத்து நாற்பது -CARDINAL ௧௦௦௪௧ பத்துஆயிரத்து நாற்பத்து ஒன்று +CARDINAL ௧௦௦௪௧ பத்துஆயிரத்து நாற்பத்தொன்று -CARDINAL ௧௦௦௪௨ பத்துஆயிரத்து நாற்பத்து இரண்டு +CARDINAL ௧௦௦௪௨ பத்துஆயிரத்து நாற்பத்திரண்டு -CARDINAL ௧௦௦௪௩ பத்துஆயிரத்து நாற்பத்து மூன்று +CARDINAL ௧௦௦௪௩ பத்துஆயிரத்து நாற்பத்திமூன்று -CARDINAL ௧௦௦௪௪ பத்துஆயிரத்து நாற்பத்து நான்கு +CARDINAL ௧௦௦௪௪ பத்துஆயிரத்து நாற்பத்திநான்கு -CARDINAL ௧௦௦௪௫ பத்துஆயிரத்து நாற்பத்து ஐந்து +CARDINAL ௧௦௦௪௫ பத்துஆயிரத்து நாற்பத்திஐந்து -CARDINAL ௧௦௦௪௬ பத்துஆயிரத்து நாற்பத்து ஆறு +CARDINAL ௧௦௦௪௬ பத்துஆயிரத்து நாற்பத்திஆறு -CARDINAL ௧௦௦௪௭ பத்துஆயிரத்து நாற்பத்து ஏழு +CARDINAL ௧௦௦௪௭ பத்துஆயிரத்து நாற்பத்திஏழு -CARDINAL ௧௦௦௪௮ பத்துஆயிரத்து நாற்பத்து எட்டு +CARDINAL ௧௦௦௪௮ பத்துஆயிரத்து நாற்பத்திஎட்டு -CARDINAL ௧௦௦௪௯ பத்துஆயிரத்து நாற்பத்து ஒன்பது +CARDINAL ௧௦௦௪௯ பத்துஆயிரத்து நாற்பத்திஒன்பது CARDINAL ௧௦௦௫௦ பத்துஆயிரத்து ஐம்பது -CARDINAL ௧௦௦௬௧ பத்துஆயிரத்து அறுபத்து ஒன்று +CARDINAL ௧௦௦௬௧ பத்துஆயிரத்து அறுபத்தொன்று -CARDINAL ௧௦௦௭௫ பத்துஆயிரத்து எழுபத்து ஐந்து +CARDINAL ௧௦௦௭௫ பத்துஆயிரத்து எழுபத்திஐந்து -CARDINAL ௧௦௦௮௧ பத்துஆயிரத்து எண்பத்து ஒன்று +CARDINAL ௧௦௦௮௧ பத்துஆயிரத்து எண்பத்தொன்று CARDINAL ௧௦௦௯௦ பத்துஆயிரத்து தொண்ணூறு -CARDINAL ௧௦௦௯௯ பத்துஆயிரத்து தொண்ணூற்று ஒன்பது +CARDINAL ௧௦௦௯௯ பத்துஆயிரத்து தொண்ணூற்றிஒன்பது -CARDINAL ௧௦௦௦௦௧ ஒன்று இலட்சத்து ஒன்று +CARDINAL ௧௦௦௦௦௧ ஒரு லட்சத்து ஒன்று -CARDINAL ௧௧௦௦௦௨ ஒன்று இலட்சத்து பத்துஆயிரத்து இரண்டு +CARDINAL ௧௧௦௦௦௨ ஒரு லட்சத்து பத்துஆயிரத்து இரண்டு -CARDINAL ௧௨௦௪௦௩ ஒன்று இலட்சத்து இருபதுஆயிரத்து நானூற்று மூன்று +CARDINAL ௧௨௦௪௦௩ ஒரு லட்சத்து இருபதுஆயிரத்து நானூற்று மூன்று -CARDINAL ௧௪௧௫௦௪ ஒன்று இலட்சத்து நாற்பத்து ஒன்றுஆயிரத்து ஐந்நூற்று நான்கு +CARDINAL ௧௪௧௫௦௪ ஒரு லட்சத்து நாற்பத்தொன்றுஆயிரத்து ஐநூற்று நான்கு -CARDINAL ௧௫௧௫௧௫ ஒன்று இலட்சத்து ஐம்பத்து ஒன்றுஆயிரத்து ஐந்நூற்று பதினைந்து +CARDINAL ௧௫௧௫௧௫ ஒரு லட்சத்து ஐம்பத்தொன்றுஆயிரத்து ஐநூற்று பதினைந்து -CARDINAL ௧௦௦௦௦௬ ஒன்று இலட்சத்து ஆறு +CARDINAL ௧௦௦௦௦௬ ஒரு லட்சத்து ஆறு -CARDINAL ௧௦௦௦௦௭ ஒன்று இலட்சத்து ஏழு +CARDINAL ௧௦௦௦௦௭ ஒரு லட்சத்து ஏழு -CARDINAL ௧௦௦௦௦௮ ஒன்று இலட்சத்து எட்டு +CARDINAL ௧௦௦௦௦௮ ஒரு லட்சத்து எட்டு -CARDINAL ௧௦௦௦௦௯ ஒன்று இலட்சத்து ஒன்பது +CARDINAL ௧௦௦௦௦௯ ஒரு லட்சத்து ஒன்பது -CARDINAL ௧௦௦௦௧௦ ஒன்று இலட்சத்து பத்து +CARDINAL ௧௦௦௦௧௦ ஒரு லட்சத்து பத்து -CARDINAL ௧௦௦௦௧௧ ஒன்று இலட்சத்து பதினொன்று +CARDINAL ௧௦௦௦௧௧ ஒரு லட்சத்து பதினொன்று -CARDINAL ௧௦௦௦௧௨ ஒன்று இலட்சத்து பன்னிரண்டு +CARDINAL ௧௦௦௦௧௨ ஒரு லட்சத்து பன்னிரண்டு -CARDINAL ௧௦௦௦௧௩ ஒன்று இலட்சத்து பதிமூன்று +CARDINAL ௧௦௦௦௧௩ ஒரு லட்சத்து பதிமூன்று -CARDINAL ௧௦௦௦௧௪ ஒன்று இலட்சத்து பதினான்கு +CARDINAL ௧௦௦௦௧௪ ஒரு லட்சத்து பதினான்கு -CARDINAL ௧௦௦௦௧௫ ஒன்று இலட்சத்து பதினைந்து +CARDINAL ௧௦௦௦௧௫ ஒரு லட்சத்து பதினைந்து -CARDINAL ௧௦௦௦௧௬ ஒன்று இலட்சத்து பதினாறு +CARDINAL ௧௦௦௦௧௬ ஒரு லட்சத்து பதினாறு -CARDINAL ௧௦௦௦௧௭ ஒன்று இலட்சத்து பதினேழு +CARDINAL ௧௦௦௦௧௭ ஒரு லட்சத்து பதினேழு -CARDINAL ௧௦௦௦௧௮ ஒன்று இலட்சத்து பதினெட்டு +CARDINAL ௧௦௦௦௧௮ ஒரு லட்சத்து பதினெட்டு -CARDINAL ௧௦௦௦௧௯ ஒன்று இலட்சத்து பத்தொன்பது +CARDINAL ௧௦௦௦௧௯ ஒரு லட்சத்து பத்தொன்பது -CARDINAL ௧௦௦௦௨௦ ஒன்று இலட்சத்து இருபது +CARDINAL ௧௦௦௦௨௦ ஒரு லட்சத்து இருபது -CARDINAL ௧௦௦௦௨௧ ஒன்று இலட்சத்து இருபத்து ஒன்று +CARDINAL ௧௦௦௦௨௧ ஒரு லட்சத்து இருபத்தொன்று -CARDINAL ௧௦௦௦௨௨ ஒன்று இலட்சத்து இருபத்து இரண்டு +CARDINAL ௧௦௦௦௨௨ ஒரு லட்சத்து இருபத்திரண்டு -CARDINAL ௧௦௦௦௨௩ ஒன்று இலட்சத்து இருபத்து மூன்று +CARDINAL ௧௦௦௦௨௩ ஒரு லட்சத்து இருபத்திமூன்று -CARDINAL ௧௦௦௦௨௪ ஒன்று இலட்சத்து இருபத்து நான்கு +CARDINAL ௧௦௦௦௨௪ ஒரு லட்சத்து இருபத்திநான்கு -CARDINAL ௧௦௦௦௨௫ ஒன்று இலட்சத்து இருபத்து ஐந்து +CARDINAL ௧௦௦௦௨௫ ஒரு லட்சத்து இருபத்திஐந்து -CARDINAL ௧௦௦௦௨௬ ஒன்று இலட்சத்து இருபத்து ஆறு +CARDINAL ௧௦௦௦௨௬ ஒரு லட்சத்து இருபத்திஆறு -CARDINAL ௧௦௦௦௨௭ ஒன்று இலட்சத்து இருபத்து ஏழு +CARDINAL ௧௦௦௦௨௭ ஒரு லட்சத்து இருபத்திஏழு -CARDINAL ௧௦௦௦௨௮ ஒன்று இலட்சத்து இருபத்து எட்டு +CARDINAL ௧௦௦௦௨௮ ஒரு லட்சத்து இருபத்திஎட்டு -CARDINAL ௧௦௦௦௨௯ ஒன்று இலட்சத்து இருபத்து ஒன்பது +CARDINAL ௧௦௦௦௨௯ ஒரு லட்சத்து இருபத்திஒன்பது -CARDINAL ௧௦௦௦௩௦ ஒன்று இலட்சத்து முப்பது +CARDINAL ௧௦௦௦௩௦ ஒரு லட்சத்து முப்பது -CARDINAL ௧௦௦௦௩௧ ஒன்று இலட்சத்து முப்பத்து ஒன்று +CARDINAL ௧௦௦௦௩௧ ஒரு லட்சத்து முப்பத்தொன்று -CARDINAL ௧௦௦௦௩௨ ஒன்று இலட்சத்து முப்பத்து இரண்டு +CARDINAL ௧௦௦௦௩௨ ஒரு லட்சத்து முப்பத்திரண்டு -CARDINAL ௧௦௦௦௩௩ ஒன்று இலட்சத்து முப்பத்து மூன்று +CARDINAL ௧௦௦௦௩௩ ஒரு லட்சத்து முப்பத்திமூன்று -CARDINAL ௧௦௦௦௩௪ ஒன்று இலட்சத்து முப்பத்து நான்கு +CARDINAL ௧௦௦௦௩௪ ஒரு லட்சத்து முப்பத்திநான்கு -CARDINAL ௧௦௦௦௩௫ ஒன்று இலட்சத்து முப்பத்து ஐந்து +CARDINAL ௧௦௦௦௩௫ ஒரு லட்சத்து முப்பத்திஐந்து -CARDINAL ௧௦௦௦௩௬ ஒன்று இலட்சத்து முப்பத்து ஆறு +CARDINAL ௧௦௦௦௩௬ ஒரு லட்சத்து முப்பத்திஆறு -CARDINAL ௧௦௦௦௩௭ ஒன்று இலட்சத்து முப்பத்து ஏழு +CARDINAL ௧௦௦௦௩௭ ஒரு லட்சத்து முப்பத்திஏழு -CARDINAL ௧௦௦௦௩௮ ஒன்று இலட்சத்து முப்பத்து எட்டு +CARDINAL ௧௦௦௦௩௮ ஒரு லட்சத்து முப்பத்திஎட்டு -CARDINAL ௧௦௦௦௩௯ ஒன்று இலட்சத்து முப்பத்து ஒன்பது +CARDINAL ௧௦௦௦௩௯ ஒரு லட்சத்து முப்பத்திஒன்பது -CARDINAL ௧௦௦௦௪௦ ஒன்று இலட்சத்து நாற்பது +CARDINAL ௧௦௦௦௪௦ ஒரு லட்சத்து நாற்பது -CARDINAL ௧௦௦௦௪௧ ஒன்று இலட்சத்து நாற்பத்து ஒன்று +CARDINAL ௧௦௦௦௪௧ ஒரு லட்சத்து நாற்பத்தொன்று -CARDINAL ௧௦௦௦௪௨ ஒன்று இலட்சத்து நாற்பத்து இரண்டு +CARDINAL ௧௦௦௦௪௨ ஒரு லட்சத்து நாற்பத்திரண்டு -CARDINAL ௧௦௦௦௪௩ ஒன்று இலட்சத்து நாற்பத்து மூன்று +CARDINAL ௧௦௦௦௪௩ ஒரு லட்சத்து நாற்பத்திமூன்று -CARDINAL ௧௦௦௦௪௪ ஒன்று இலட்சத்து நாற்பத்து நான்கு +CARDINAL ௧௦௦௦௪௪ ஒரு லட்சத்து நாற்பத்திநான்கு -CARDINAL ௧௦௦௦௪௫ ஒன்று இலட்சத்து நாற்பத்து ஐந்து +CARDINAL ௧௦௦௦௪௫ ஒரு லட்சத்து நாற்பத்திஐந்து -CARDINAL ௧௦௦௦௪௬ ஒன்று இலட்சத்து நாற்பத்து ஆறு +CARDINAL ௧௦௦௦௪௬ ஒரு லட்சத்து நாற்பத்திஆறு -CARDINAL ௧௦௦௦௪௭ ஒன்று இலட்சத்து நாற்பத்து ஏழு +CARDINAL ௧௦௦௦௪௭ ஒரு லட்சத்து நாற்பத்திஏழு -CARDINAL ௧௦௦௦௪௮ ஒன்று இலட்சத்து நாற்பத்து எட்டு +CARDINAL ௧௦௦௦௪௮ ஒரு லட்சத்து நாற்பத்திஎட்டு -CARDINAL ௧௦௦௦௪௯ ஒன்று இலட்சத்து நாற்பத்து ஒன்பது +CARDINAL ௧௦௦௦௪௯ ஒரு லட்சத்து நாற்பத்திஒன்பது -CARDINAL ௧௦௦௦௫௦ ஒன்று இலட்சத்து ஐம்பது +CARDINAL ௧௦௦௦௫௦ ஒரு லட்சத்து ஐம்பது -CARDINAL ௧௦௦௦௬௧ ஒன்று இலட்சத்து அறுபத்து ஒன்று +CARDINAL ௧௦௦௦௬௧ ஒரு லட்சத்து அறுபத்தொன்று -CARDINAL ௧௦௦௦௭௫ ஒன்று இலட்சத்து எழுபத்து ஐந்து +CARDINAL ௧௦௦௦௭௫ ஒரு லட்சத்து எழுபத்திஐந்து -CARDINAL ௧௦௦௦௮௧ ஒன்று இலட்சத்து எண்பத்து ஒன்று +CARDINAL ௧௦௦௦௮௧ ஒரு லட்சத்து எண்பத்தொன்று -CARDINAL ௧௦௦௦௯௦ ஒன்று இலட்சத்து தொண்ணூறு +CARDINAL ௧௦௦௦௯௦ ஒரு லட்சத்து தொண்ணூறு -CARDINAL ௧௦௦௦௯௯ ஒன்று இலட்சத்து தொண்ணூற்று ஒன்பது +CARDINAL ௧௦௦௦௯௯ ஒரு லட்சத்து தொண்ணூற்றிஒன்பது -CARDINAL ௧௦௦௦௦௦௧ பத்து இலட்சத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௧ பத்து லட்சத்து ஒன்று -CARDINAL ௧௦௦௦௦௦௨ பத்து இலட்சத்து இரண்டு +CARDINAL ௧௦௦௦௦௦௨ பத்து லட்சத்து இரண்டு -CARDINAL ௧௦௦௦௦௦௩ பத்து இலட்சத்து மூன்று +CARDINAL ௧௦௦௦௦௦௩ பத்து லட்சத்து மூன்று -CARDINAL ௧௦௦௦௦௦௪ பத்து இலட்சத்து நான்கு +CARDINAL ௧௦௦௦௦௦௪ பத்து லட்சத்து நான்கு -CARDINAL ௧௦௦௦௦௦௫ பத்து இலட்சத்து ஐந்து +CARDINAL ௧௦௦௦௦௦௫ பத்து லட்சத்து ஐந்து -CARDINAL ௧௦௦௦௦௦௬ பத்து இலட்சத்து ஆறு +CARDINAL ௧௦௦௦௦௦௬ பத்து லட்சத்து ஆறு -CARDINAL ௧௦௦௦௦௦௭ பத்து இலட்சத்து ஏழு +CARDINAL ௧௦௦௦௦௦௭ பத்து லட்சத்து ஏழு -CARDINAL ௧௦௦௦௦௦௮ பத்து இலட்சத்து எட்டு +CARDINAL ௧௦௦௦௦௦௮ பத்து லட்சத்து எட்டு -CARDINAL ௧௦௦௦௦௦௯ பத்து இலட்சத்து ஒன்பது +CARDINAL ௧௦௦௦௦௦௯ பத்து லட்சத்து ஒன்பது -CARDINAL ௧௦௦௦௦௧௦ பத்து இலட்சத்து பத்து +CARDINAL ௧௦௦௦௦௧௦ பத்து லட்சத்து பத்து -CARDINAL ௧௦௦௦௦௧௧ பத்து இலட்சத்து பதினொன்று +CARDINAL ௧௦௦௦௦௧௧ பத்து லட்சத்து பதினொன்று -CARDINAL ௧௦௦௦௦௧௨ பத்து இலட்சத்து பன்னிரண்டு +CARDINAL ௧௦௦௦௦௧௨ பத்து லட்சத்து பன்னிரண்டு -CARDINAL ௧௦௦௦௦௧௩ பத்து இலட்சத்து பதிமூன்று +CARDINAL ௧௦௦௦௦௧௩ பத்து லட்சத்து பதிமூன்று -CARDINAL ௧௦௦௦௦௧௪ பத்து இலட்சத்து பதினான்கு +CARDINAL ௧௦௦௦௦௧௪ பத்து லட்சத்து பதினான்கு -CARDINAL ௧௦௦௦௦௧௫ பத்து இலட்சத்து பதினைந்து +CARDINAL ௧௦௦௦௦௧௫ பத்து லட்சத்து பதினைந்து -CARDINAL ௧௦௦௦௦௧௬ பத்து இலட்சத்து பதினாறு +CARDINAL ௧௦௦௦௦௧௬ பத்து லட்சத்து பதினாறு -CARDINAL ௧௦௦௦௦௧௭ பத்து இலட்சத்து பதினேழு +CARDINAL ௧௦௦௦௦௧௭ பத்து லட்சத்து பதினேழு -CARDINAL ௧௦௦௦௦௧௮ பத்து இலட்சத்து பதினெட்டு +CARDINAL ௧௦௦௦௦௧௮ பத்து லட்சத்து பதினெட்டு -CARDINAL ௧௦௦௦௦௧௯ பத்து இலட்சத்து பத்தொன்பது +CARDINAL ௧௦௦௦௦௧௯ பத்து லட்சத்து பத்தொன்பது -CARDINAL ௧௦௦௦௦௨௦ பத்து இலட்சத்து இருபது +CARDINAL ௧௦௦௦௦௨௦ பத்து லட்சத்து இருபது -CARDINAL ௧௦௦௦௦௨௧ பத்து இலட்சத்து இருபத்து ஒன்று +CARDINAL ௧௦௦௦௦௨௧ பத்து லட்சத்து இருபத்தொன்று -CARDINAL ௧௦௦௦௦௨௨ பத்து இலட்சத்து இருபத்து இரண்டு +CARDINAL ௧௦௦௦௦௨௨ பத்து லட்சத்து இருபத்திரண்டு -CARDINAL ௧௦௦௦௦௨௩ பத்து இலட்சத்து இருபத்து மூன்று +CARDINAL ௧௦௦௦௦௨௩ பத்து லட்சத்து இருபத்திமூன்று -CARDINAL ௧௦௦௦௦௨௪ பத்து இலட்சத்து இருபத்து நான்கு +CARDINAL ௧௦௦௦௦௨௪ பத்து லட்சத்து இருபத்திநான்கு -CARDINAL ௧௦௦௦௦௨௫ பத்து இலட்சத்து இருபத்து ஐந்து +CARDINAL ௧௦௦௦௦௨௫ பத்து லட்சத்து இருபத்திஐந்து -CARDINAL ௧௦௦௦௦௨௬ பத்து இலட்சத்து இருபத்து ஆறு +CARDINAL ௧௦௦௦௦௨௬ பத்து லட்சத்து இருபத்திஆறு -CARDINAL ௧௦௦௦௦௨௭ பத்து இலட்சத்து இருபத்து ஏழு +CARDINAL ௧௦௦௦௦௨௭ பத்து லட்சத்து இருபத்திஏழு -CARDINAL ௧௦௦௦௦௨௮ பத்து இலட்சத்து இருபத்து எட்டு +CARDINAL ௧௦௦௦௦௨௮ பத்து லட்சத்து இருபத்திஎட்டு -CARDINAL ௧௦௦௦௦௨௯ பத்து இலட்சத்து இருபத்து ஒன்பது +CARDINAL ௧௦௦௦௦௨௯ பத்து லட்சத்து இருபத்திஒன்பது -CARDINAL ௧௦௦௦௦௩௦ பத்து இலட்சத்து முப்பது +CARDINAL ௧௦௦௦௦௩௦ பத்து லட்சத்து முப்பது -CARDINAL ௧௦௦௦௦௩௧ பத்து இலட்சத்து முப்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௩௧ பத்து லட்சத்து முப்பத்தொன்று -CARDINAL ௧௦௦௦௦௩௨ பத்து இலட்சத்து முப்பத்து இரண்டு +CARDINAL ௧௦௦௦௦௩௨ பத்து லட்சத்து முப்பத்திரண்டு -CARDINAL ௧௦௦௦௦௩௩ பத்து இலட்சத்து முப்பத்து மூன்று +CARDINAL ௧௦௦௦௦௩௩ பத்து லட்சத்து முப்பத்திமூன்று -CARDINAL ௧௦௦௦௦௩௪ பத்து இலட்சத்து முப்பத்து நான்கு +CARDINAL ௧௦௦௦௦௩௪ பத்து லட்சத்து முப்பத்திநான்கு -CARDINAL ௧௦௦௦௦௩௫ பத்து இலட்சத்து முப்பத்து ஐந்து +CARDINAL ௧௦௦௦௦௩௫ பத்து லட்சத்து முப்பத்திஐந்து -CARDINAL ௧௦௦௦௦௩௬ பத்து இலட்சத்து முப்பத்து ஆறு +CARDINAL ௧௦௦௦௦௩௬ பத்து லட்சத்து முப்பத்திஆறு -CARDINAL ௧௦௦௦௦௩௭ பத்து இலட்சத்து முப்பத்து ஏழு +CARDINAL ௧௦௦௦௦௩௭ பத்து லட்சத்து முப்பத்திஏழு -CARDINAL ௧௦௦௦௦௩௮ பத்து இலட்சத்து முப்பத்து எட்டு +CARDINAL ௧௦௦௦௦௩௮ பத்து லட்சத்து முப்பத்திஎட்டு -CARDINAL ௧௦௦௦௦௩௯ பத்து இலட்சத்து முப்பத்து ஒன்பது +CARDINAL ௧௦௦௦௦௩௯ பத்து லட்சத்து முப்பத்திஒன்பது -CARDINAL ௧௦௦௦௦௪௦ பத்து இலட்சத்து நாற்பது +CARDINAL ௧௦௦௦௦௪௦ பத்து லட்சத்து நாற்பது -CARDINAL ௧௦௦௦௦௪௧ பத்து இலட்சத்து நாற்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௪௧ பத்து லட்சத்து நாற்பத்தொன்று -CARDINAL ௧௦௦௦௦௪௨ பத்து இலட்சத்து நாற்பத்து இரண்டு +CARDINAL ௧௦௦௦௦௪௨ பத்து லட்சத்து நாற்பத்திரண்டு -CARDINAL ௧௦௦௦௦௪௩ பத்து இலட்சத்து நாற்பத்து மூன்று +CARDINAL ௧௦௦௦௦௪௩ பத்து லட்சத்து நாற்பத்திமூன்று -CARDINAL ௧௦௦௦௦௪௪ பத்து இலட்சத்து நாற்பத்து நான்கு +CARDINAL ௧௦௦௦௦௪௪ பத்து லட்சத்து நாற்பத்திநான்கு -CARDINAL ௧௦௦௦௦௪௫ பத்து இலட்சத்து நாற்பத்து ஐந்து +CARDINAL ௧௦௦௦௦௪௫ பத்து லட்சத்து நாற்பத்திஐந்து -CARDINAL ௧௦௦௦௦௪௬ பத்து இலட்சத்து நாற்பத்து ஆறு +CARDINAL ௧௦௦௦௦௪௬ பத்து லட்சத்து நாற்பத்திஆறு -CARDINAL ௧௦௦௦௦௪௭ பத்து இலட்சத்து நாற்பத்து ஏழு +CARDINAL ௧௦௦௦௦௪௭ பத்து லட்சத்து நாற்பத்திஏழு -CARDINAL ௧௦௦௦௦௪௮ பத்து இலட்சத்து நாற்பத்து எட்டு +CARDINAL ௧௦௦௦௦௪௮ பத்து லட்சத்து நாற்பத்திஎட்டு -CARDINAL ௧௦௦௦௦௪௯ பத்து இலட்சத்து நாற்பத்து ஒன்பது +CARDINAL ௧௦௦௦௦௪௯ பத்து லட்சத்து நாற்பத்திஒன்பது -CARDINAL ௧௦௦௦௦௫௦ பத்து இலட்சத்து ஐம்பது +CARDINAL ௧௦௦௦௦௫௦ பத்து லட்சத்து ஐம்பது -CARDINAL ௧௦௦௦௦௬௧ பத்து இலட்சத்து அறுபத்து ஒன்று +CARDINAL ௧௦௦௦௦௬௧ பத்து லட்சத்து அறுபத்தொன்று -CARDINAL ௧௦௦௦௦௭௫ பத்து இலட்சத்து எழுபத்து ஐந்து +CARDINAL ௧௦௦௦௦௭௫ பத்து லட்சத்து எழுபத்திஐந்து -CARDINAL ௧௦௦௦௦௮௧ பத்து இலட்சத்து எண்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௮௧ பத்து லட்சத்து எண்பத்தொன்று -CARDINAL ௧௦௦௦௦௯௦ பத்து இலட்சத்து தொண்ணூறு +CARDINAL ௧௦௦௦௦௯௦ பத்து லட்சத்து தொண்ணூறு -CARDINAL ௧௦௦௦௦௯௯ பத்து இலட்சத்து தொண்ணூற்று ஒன்பது +CARDINAL ௧௦௦௦௦௯௯ பத்து லட்சத்து தொண்ணூற்றிஒன்பது -CARDINAL ௧௦௦௦௦௦௦௧ ஒன்று கோடியே ஒன்று +CARDINAL ௧௦௦௦௦௦௦௧ ஒரு கோடியே ஒன்று -CARDINAL ௧௦௦௦௦௦௦௨ ஒன்று கோடியே இரண்டு +CARDINAL ௧௦௦௦௦௦௦௨ ஒரு கோடியே இரண்டு -CARDINAL ௧௦௦௦௦௦௦௩ ஒன்று கோடியே மூன்று +CARDINAL ௧௦௦௦௦௦௦௩ ஒரு கோடியே மூன்று -CARDINAL ௧௦௦௦௦௦௦௪ ஒன்று கோடியே நான்கு +CARDINAL ௧௦௦௦௦௦௦௪ ஒரு கோடியே நான்கு -CARDINAL ௧௦௦௦௦௦௦௫ ஒன்று கோடியே ஐந்து +CARDINAL ௧௦௦௦௦௦௦௫ ஒரு கோடியே ஐந்து -CARDINAL ௧௦௦௦௦௦௦௬ ஒன்று கோடியே ஆறு +CARDINAL ௧௦௦௦௦௦௦௬ ஒரு கோடியே ஆறு -CARDINAL ௧௦௦௦௦௦௦௭ ஒன்று கோடியே ஏழு +CARDINAL ௧௦௦௦௦௦௦௭ ஒரு கோடியே ஏழு -CARDINAL ௧௦௦௦௦௦௦௮ ஒன்று கோடியே எட்டு +CARDINAL ௧௦௦௦௦௦௦௮ ஒரு கோடியே எட்டு -CARDINAL ௧௦௦௦௦௦௦௯ ஒன்று கோடியே ஒன்பது +CARDINAL ௧௦௦௦௦௦௦௯ ஒரு கோடியே ஒன்பது -CARDINAL ௧௦௦௦௦௦௧௦ ஒன்று கோடியே பத்து +CARDINAL ௧௦௦௦௦௦௧௦ ஒரு கோடியே பத்து -CARDINAL ௧௦௦௦௦௦௧௧ ஒன்று கோடியே பதினொன்று +CARDINAL ௧௦௦௦௦௦௧௧ ஒரு கோடியே பதினொன்று -CARDINAL ௧௦௦௦௦௦௧௨ ஒன்று கோடியே பன்னிரண்டு +CARDINAL ௧௦௦௦௦௦௧௨ ஒரு கோடியே பன்னிரண்டு -CARDINAL ௧௦௦௦௦௦௧௩ ஒன்று கோடியே பதிமூன்று +CARDINAL ௧௦௦௦௦௦௧௩ ஒரு கோடியே பதிமூன்று -CARDINAL ௧௦௦௦௦௦௧௪ ஒன்று கோடியே பதினான்கு +CARDINAL ௧௦௦௦௦௦௧௪ ஒரு கோடியே பதினான்கு -CARDINAL ௧௦௦௦௦௦௧௫ ஒன்று கோடியே பதினைந்து +CARDINAL ௧௦௦௦௦௦௧௫ ஒரு கோடியே பதினைந்து -CARDINAL ௧௦௦௦௦௦௧௬ ஒன்று கோடியே பதினாறு +CARDINAL ௧௦௦௦௦௦௧௬ ஒரு கோடியே பதினாறு -CARDINAL ௧௦௦௦௦௦௧௭ ஒன்று கோடியே பதினேழு +CARDINAL ௧௦௦௦௦௦௧௭ ஒரு கோடியே பதினேழு -CARDINAL ௧௦௦௦௦௦௧௮ ஒன்று கோடியே பதினெட்டு +CARDINAL ௧௦௦௦௦௦௧௮ ஒரு கோடியே பதினெட்டு -CARDINAL ௧௦௦௦௦௦௧௯ ஒன்று கோடியே பத்தொன்பது +CARDINAL ௧௦௦௦௦௦௧௯ ஒரு கோடியே பத்தொன்பது -CARDINAL ௧௦௦௦௦௦௨௦ ஒன்று கோடியே இருபது +CARDINAL ௧௦௦௦௦௦௨௦ ஒரு கோடியே இருபது -CARDINAL ௧௦௦௦௦௦௨௧ ஒன்று கோடியே இருபத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௨௧ ஒரு கோடியே இருபத்தொன்று -CARDINAL ௧௦௦௦௦௦௨௨ ஒன்று கோடியே இருபத்து இரண்டு +CARDINAL ௧௦௦௦௦௦௨௨ ஒரு கோடியே இருபத்திரண்டு -CARDINAL ௧௦௦௦௦௦௨௩ ஒன்று கோடியே இருபத்து மூன்று +CARDINAL ௧௦௦௦௦௦௨௩ ஒரு கோடியே இருபத்திமூன்று -CARDINAL ௧௦௦௦௦௦௨௪ ஒன்று கோடியே இருபத்து நான்கு +CARDINAL ௧௦௦௦௦௦௨௪ ஒரு கோடியே இருபத்திநான்கு -CARDINAL ௧௦௦௦௦௦௨௫ ஒன்று கோடியே இருபத்து ஐந்து +CARDINAL ௧௦௦௦௦௦௨௫ ஒரு கோடியே இருபத்திஐந்து -CARDINAL ௧௦௦௦௦௦௨௬ ஒன்று கோடியே இருபத்து ஆறு +CARDINAL ௧௦௦௦௦௦௨௬ ஒரு கோடியே இருபத்திஆறு -CARDINAL ௧௦௦௦௦௦௨௭ ஒன்று கோடியே இருபத்து ஏழு +CARDINAL ௧௦௦௦௦௦௨௭ ஒரு கோடியே இருபத்திஏழு -CARDINAL ௧௦௦௦௦௦௨௮ ஒன்று கோடியே இருபத்து எட்டு +CARDINAL ௧௦௦௦௦௦௨௮ ஒரு கோடியே இருபத்திஎட்டு -CARDINAL ௧௦௦௦௦௦௨௯ ஒன்று கோடியே இருபத்து ஒன்பது +CARDINAL ௧௦௦௦௦௦௨௯ ஒரு கோடியே இருபத்திஒன்பது -CARDINAL ௧௦௦௦௦௦௩௦ ஒன்று கோடியே முப்பது +CARDINAL ௧௦௦௦௦௦௩௦ ஒரு கோடியே முப்பது -CARDINAL ௧௦௦௦௦௦௩௧ ஒன்று கோடியே முப்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௩௧ ஒரு கோடியே முப்பத்தொன்று -CARDINAL ௧௦௦௦௦௦௩௨ ஒன்று கோடியே முப்பத்து இரண்டு +CARDINAL ௧௦௦௦௦௦௩௨ ஒரு கோடியே முப்பத்திரண்டு -CARDINAL ௧௦௦௦௦௦௩௩ ஒன்று கோடியே முப்பத்து மூன்று +CARDINAL ௧௦௦௦௦௦௩௩ ஒரு கோடியே முப்பத்திமூன்று -CARDINAL ௧௦௦௦௦௦௩௪ ஒன்று கோடியே முப்பத்து நான்கு +CARDINAL ௧௦௦௦௦௦௩௪ ஒரு கோடியே முப்பத்திநான்கு -CARDINAL ௧௦௦௦௦௦௩௫ ஒன்று கோடியே முப்பத்து ஐந்து +CARDINAL ௧௦௦௦௦௦௩௫ ஒரு கோடியே முப்பத்திஐந்து -CARDINAL ௧௦௦௦௦௦௩௬ ஒன்று கோடியே முப்பத்து ஆறு +CARDINAL ௧௦௦௦௦௦௩௬ ஒரு கோடியே முப்பத்திஆறு -CARDINAL ௧௦௦௦௦௦௩௭ ஒன்று கோடியே முப்பத்து ஏழு +CARDINAL ௧௦௦௦௦௦௩௭ ஒரு கோடியே முப்பத்திஏழு -CARDINAL ௧௦௦௦௦௦௩௮ ஒன்று கோடியே முப்பத்து எட்டு +CARDINAL ௧௦௦௦௦௦௩௮ ஒரு கோடியே முப்பத்திஎட்டு -CARDINAL ௧௦௦௦௦௦௩௯ ஒன்று கோடியே முப்பத்து ஒன்பது +CARDINAL ௧௦௦௦௦௦௩௯ ஒரு கோடியே முப்பத்திஒன்பது -CARDINAL ௧௦௦௦௦௦௪௦ ஒன்று கோடியே நாற்பது +CARDINAL ௧௦௦௦௦௦௪௦ ஒரு கோடியே நாற்பது -CARDINAL ௧௦௦௦௦௦௪௧ ஒன்று கோடியே நாற்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௪௧ ஒரு கோடியே நாற்பத்தொன்று -CARDINAL ௧௦௦௦௦௦௪௨ ஒன்று கோடியே நாற்பத்து இரண்டு +CARDINAL ௧௦௦௦௦௦௪௨ ஒரு கோடியே நாற்பத்திரண்டு -CARDINAL ௧௦௦௦௦௦௪௩ ஒன்று கோடியே நாற்பத்து மூன்று +CARDINAL ௧௦௦௦௦௦௪௩ ஒரு கோடியே நாற்பத்திமூன்று -CARDINAL ௧௦௦௦௦௦௪௪ ஒன்று கோடியே நாற்பத்து நான்கு +CARDINAL ௧௦௦௦௦௦௪௪ ஒரு கோடியே நாற்பத்திநான்கு -CARDINAL ௧௦௦௦௦௦௪௫ ஒன்று கோடியே நாற்பத்து ஐந்து +CARDINAL ௧௦௦௦௦௦௪௫ ஒரு கோடியே நாற்பத்திஐந்து -CARDINAL ௧௦௦௦௦௦௪௬ ஒன்று கோடியே நாற்பத்து ஆறு +CARDINAL ௧௦௦௦௦௦௪௬ ஒரு கோடியே நாற்பத்திஆறு -CARDINAL ௧௦௦௦௦௦௪௭ ஒன்று கோடியே நாற்பத்து ஏழு +CARDINAL ௧௦௦௦௦௦௪௭ ஒரு கோடியே நாற்பத்திஏழு -CARDINAL ௧௦௦௦௦௦௪௮ ஒன்று கோடியே நாற்பத்து எட்டு +CARDINAL ௧௦௦௦௦௦௪௮ ஒரு கோடியே நாற்பத்திஎட்டு -CARDINAL ௧௦௦௦௦௦௪௯ ஒன்று கோடியே நாற்பத்து ஒன்பது +CARDINAL ௧௦௦௦௦௦௪௯ ஒரு கோடியே நாற்பத்திஒன்பது -CARDINAL ௧௦௦௦௦௦௫௦ ஒன்று கோடியே ஐம்பது +CARDINAL ௧௦௦௦௦௦௫௦ ஒரு கோடியே ஐம்பது -CARDINAL ௧௦௦௦௦௦௬௧ ஒன்று கோடியே அறுபத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௬௧ ஒரு கோடியே அறுபத்தொன்று -CARDINAL ௧௦௦௦௦௦௭௫ ஒன்று கோடியே எழுபத்து ஐந்து +CARDINAL ௧௦௦௦௦௦௭௫ ஒரு கோடியே எழுபத்திஐந்து -CARDINAL ௧௦௦௦௦௦௮௧ ஒன்று கோடியே எண்பத்து ஒன்று +CARDINAL ௧௦௦௦௦௦௮௧ ஒரு கோடியே எண்பத்தொன்று -CARDINAL ௧௦௦௦௦௦௯௦ ஒன்று கோடியே தொண்ணூறு +CARDINAL ௧௦௦௦௦௦௯௦ ஒரு கோடியே தொண்ணூறு -CARDINAL ௧௦௦௦௦௦௯௯ ஒன்று கோடியே தொண்ணூற்று ஒன்பது +CARDINAL ௧௦௦௦௦௦௯௯ ஒரு கோடியே தொண்ணூற்றிஒன்பது -CARDINAL ௧௩௨௩ ஆயிரத்து முந்நூற்று இருபத்து மூன்று +CARDINAL ௧௩௨௩ ஆயிரத்து முந்நூற்று இருபத்திமூன்று -CARDINAL ௧௩௪௫ ஆயிரத்து முந்நூற்று நாற்பத்து ஐந்து +CARDINAL ௧௩௪௫ ஆயிரத்து முந்நூற்று நாற்பத்திஐந்து -CARDINAL ௧௩௪௫௬ பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு +CARDINAL ௧௩௪௫௬ பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்திஆறு -CARDINAL ௧௨௩௪௬ பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்து ஆறு +CARDINAL ௧௨௩௪௬ பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்திஆறு -CARDINAL ௧௨௩௪௫௬ ஒன்று இலட்சத்து இருபத்து மூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு +CARDINAL ௧௨௩௪௫௬ ஒரு லட்சத்து இருபத்திமூன்றுஆயிரத்து நானூற்று ஐம்பத்திஆறு -CARDINAL ௮௭௨௯௮௭ எட்டு இலட்சத்து எழுபத்து இரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்து ஏழு +CARDINAL ௮௭௨௯௮௭ எட்டு லட்சத்து எழுபத்திரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்திஏழு -CARDINAL ௯௮௭௬௦௯ ஒன்பது இலட்சத்து எண்பத்து ஏழுஆயிரத்து அறுநூற்று ஒன்பது +CARDINAL ௯௮௭௬௦௯ ஒன்பது லட்சத்து எண்பத்திஏழுஆயிரத்து அறுநூற்று ஒன்பது -CARDINAL ௯௮௭௬௭௮௯ தொண்ணூற்று எட்டு இலட்சத்து எழுபத்து ஆறுஆயிரத்து எழுநூற்று எண்பத்து ஒன்பது +CARDINAL ௯௮௭௬௭௮௯ தொண்ணூற்றிஎட்டு லட்சத்து எழுபத்திஆறுஆயிரத்து எழுநூற்று எண்பத்திஒன்பது -CARDINAL ௨௩௪௫௫௬௭ இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௨௩௪௫௫௬௭ இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௧௨௩௪௫௫௬௭ ஒன்று கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௧௨௩௪௫௫௬௭ ஒரு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௧௨௧௨௧௨௧௨௨ பன்னிரண்டு கோடியே பன்னிரண்டு இலட்சத்து பன்னிரண்டுஆயிரத்து நூற்று இருபத்து இரண்டு +CARDINAL ௧௨௧௨௧௨௧௨௨ பன்னிரண்டு கோடியே பன்னிரண்டு லட்சத்து பன்னிரண்டுஆயிரத்து நூற்று இருபத்திரண்டு -CARDINAL ௧௦௦௨௩௪௫௫௬௭ ஒன்று அரபு இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௧௦௦௨௩௪௫௫௬௭ நூறு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௧௧௨௨௩௪௫௫௬௭ ஒன்று அரபு பன்னிரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௧௧௨௨௩௪௫௫௬௭ நூற்று பன்னிரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௧௦௨௨௩௪௫௫௬௭ ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௧௦௨௨௩௪௫௫௬௭ நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௧௧௦௨௨௩௪௫௫௬௭ பதினொன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௧௧௦௨௨௩௪௫௫௬௭ ஆயிரத்து நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு -CARDINAL ௫௧௦௨௨௩௪௫௫௬௭ ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +CARDINAL ௫௧௦௨௨௩௪௫௫௬௭ ஐந்தாயிரத்து நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு + +ORDINAL ௧௦௦௧ஆவது ஆயிரத்து ஒன்றாவது + +ORDINAL ௧௦௦ஆவது நூறாவது + +ORDINAL ௧௦௧ஆவது நூற்று ஒன்றாவது + +ORDINAL ௧௦௭ஆவது நூற்று ஏழாவது + +ORDINAL ௧௦௯௧ஆவது ஆயிரத்து தொண்ணூற்றொன்றாவது + +ORDINAL ௧௦ஆவது பத்தாவது + +ORDINAL ௧௧௧ஆவது நூற்று பதினொன்றாவது + +ORDINAL ௧௧௨ஆவது நூற்று பன்னிரண்டாவது + +ORDINAL ௧௧௪ஆவது நூற்று பதினான்காவது + +ORDINAL ௧௧௫ஆவது நூற்று பதினைந்தாவது + +ORDINAL ௧௧௭ஆவது நூற்று பதினேழாவது + +ORDINAL ௧௧௮ஆவது நூற்று பதினெட்டாவது + +ORDINAL ௧௧௯ஆவது நூற்று பத்தொன்பதாவது + +ORDINAL ௧௧ஆவது பதினொன்றாவது + +ORDINAL ௧௨௦ஆவது நூற்று இருபதாவது + +ORDINAL ௧௨௧ஆவது நூற்று இருபத்தொன்றாவது + +ORDINAL ௧௨௨ஆவது நூற்று இருபத்திரண்டாவது + +ORDINAL ௧௨௫ஆவது நூற்று இருபத்திஐந்தாவது + +ORDINAL ௧௨ஆவது பன்னிரண்டாவது + +ORDINAL ௧௩௨ஆவது நூற்று முப்பத்திரண்டாவது + +ORDINAL ௧௩௪ஆவது நூற்று முப்பத்திநான்காவது + +ORDINAL ௧௩௭ஆவது நூற்று முப்பத்திஏழாவது + +ORDINAL ௧௩௯ஆவது நூற்று முப்பத்திஒன்பதாவது + +ORDINAL ௧௩ஆவது பதின்மூன்றாவது + +ORDINAL ௧௪௦ஆவது நூற்று நாற்பதாவது + +ORDINAL ௧௪௩ஆவது நூற்று நாற்பத்திமூன்றாவது + +ORDINAL ௧௪௯ஆவது நூற்று நாற்பத்திஒன்பதாவது + +ORDINAL ௧௪ஆவது பதினான்காவது + +ORDINAL ௧௫௩ஆவது நூற்று ஐம்பத்திமூன்றாவது + +ORDINAL ௧௫௯ஆவது நூற்று ஐம்பத்திஒன்பதாவது + +ORDINAL ௧௫ஆவது பதினைந்தாவது + +ORDINAL ௧௬௦ஆவது நூற்று அறுபதாவது + +ORDINAL ௧௬௭ஆவது நூற்று அறுபத்திஏழாவது + +ORDINAL ௧௬ஆவது பதினாறாவது + +ORDINAL ௧௭௧ஆவது நூற்று எழுபத்தொன்றாவது + +ORDINAL ௧௭௩ஆவது நூற்று எழுபத்திமூன்றாவது + +ORDINAL ௧௭௪ஆவது நூற்று எழுபத்திநான்காவது + +ORDINAL ௧௭௬ஆவது நூற்று எழுபத்திஆறாவது + +ORDINAL ௧௭௮௨ஆவது ஆயிரத்து எழுநூற்று எண்பத்திரண்டாவது + +ORDINAL ௧௭௮ஆவது நூற்று எழுபத்தெட்டாவது + +ORDINAL ௧௭ஆவது பதினேழாவது + +ORDINAL ௧௮௨௬ஆவது ஆயிரத்து எட்டுநூற்று இருபத்திஆறாவது + +ORDINAL ௧௮௨ஆவது நூற்று எண்பத்திரண்டாவது + +ORDINAL ௧௮௩ஆவது நூற்று எண்பத்திமூன்றாவது + +ORDINAL ௧௮௭ஆவது நூற்று எண்பத்திஏழாவது + +ORDINAL ௧௮௯௦ஆவது ஆயிரத்து எட்டுநூற்று தொண்ணூறாவது + +ORDINAL ௧௮௯ஆவது நூற்று எண்பத்திஒன்பதாவது + +ORDINAL ௧௮ஆவது பதினெட்டாவது + +ORDINAL ௧௯௦ஆவது நூற்று தொண்ணூறாவது + +ORDINAL ௧௯௧ஆவது நூற்று தொண்ணூற்றொன்றாவது + +ORDINAL ௧௯௨௦ஆவது ஆயிரத்து ஒன்பதுநூற்று இருபதாவது + +ORDINAL ௧௯௫ஆவது நூற்று தொண்ணூற்றிஐந்தாவது + +ORDINAL ௧௯௬ஆவது நூற்று தொண்ணூற்றிஆறாவது + +ORDINAL ௧௯௮௧ஆவது ஆயிரத்து ஒன்பதுநூற்று எண்பத்தொன்றாவது + +ORDINAL ௧௯௮ஆவது நூற்று தொண்ணூற்றிஎட்டாவது + +ORDINAL ௧௯ஆவது பத்தொன்பதாவது + +ORDINAL ௨௦ஆவது இருபதாவது + +ORDINAL ௨௧௯ஆவது இருநூற்று பத்தொன்பதாவது + +ORDINAL ௨௧ஆவது இருபத்தொன்றாவது + +ORDINAL ௨௨௩ஆவது இருநூற்று இருபத்திமூன்றாவது + +ORDINAL ௨௨ஆவது இருபத்திரண்டாவது + +ORDINAL ௨௩௨ஆவது இருநூற்று முப்பத்திரண்டாவது + +ORDINAL ௨௩௩ஆவது இருநூற்று முப்பத்திமூன்றாவது + +ORDINAL ௨௩௪ஆவது இருநூற்று முப்பத்திநான்காவது + +ORDINAL ௨௩ஆவது இருபத்திமூன்றாவது + +ORDINAL ௨௪௦ஆவது இருநூற்று நாற்பதாவது + +ORDINAL ௨௪ஆவது இருபத்திநான்காவது + +ORDINAL ௨௫௮ஆவது இருநூற்று ஐம்பத்திஎட்டாவது + +ORDINAL ௨௫ஆவது இருபத்திஐந்தாவது + +ORDINAL ௨௬௯ஆவது இருநூற்று அறுபத்திஒன்பதாவது + +ORDINAL ௨௬ஆவது இருபத்திஆறாவது + +ORDINAL ௨௭௫ஆவது இருநூற்று எழுபத்திஐந்தாவது + +ORDINAL ௨௭ஆவது இருபத்திஏழாவது + +ORDINAL ௨௮ஆவது இருபத்திஎட்டாவது + +ORDINAL ௨௯ஆவது இருபத்திஒன்பதாவது + +ORDINAL ௩௦ஆவது முப்பதாவது + +ORDINAL ௩௧ஆவது முப்பத்தொன்றாவது + +ORDINAL ௩௨௨ஆவது முந்நூற்று இருபத்திரண்டாவது + +ORDINAL ௩௨௯ஆவது முந்நூற்று இருபத்திஒன்பதாவது + +ORDINAL ௩௨ஆவது முப்பத்திரண்டாவது + +ORDINAL ௩௩ஆவது முப்பத்திமூன்றாவது + +ORDINAL ௩௪ஆவது முப்பத்திநான்காவது + +ORDINAL ௩௫ஆவது முப்பத்திஐந்தாவது + +ORDINAL ௩௬௫ஆவது முந்நூற்று அறுபத்திஐந்தாவது + +ORDINAL ௩௬ஆவது முப்பத்திஆறாவது + +ORDINAL ௩௭ஆவது முப்பத்திஏழாவது + +ORDINAL ௩௮௨ஆவது முந்நூற்று எண்பத்திரண்டாவது + +ORDINAL ௩௮௭ஆவது முந்நூற்று எண்பத்திஏழாவது + +ORDINAL ௩௮ஆவது முப்பத்திஎட்டாவது + +ORDINAL ௩௯ஆவது முப்பத்திஒன்பதாவது + +ORDINAL ௪௦ஆவது நாற்பதாவது + +ORDINAL ௪௧ஆவது நாற்பத்தொன்றாவது + +ORDINAL ௪௨ஆவது நாற்பத்திரண்டாவது + +ORDINAL ௪௩ஆவது நாற்பத்திமூன்றாவது + +ORDINAL ௪௪ஆவது நாற்பத்திநான்காவது + +ORDINAL ௪௫௫ஆவது நானூற்று ஐம்பத்திஐந்தாவது + +ORDINAL ௪௫ஆவது நாற்பத்திஐந்தாவது + +ORDINAL ௪௬௫ஆவது நானூற்று அறுபத்திஐந்தாவது + +ORDINAL ௪௬ஆவது நாற்பத்திஆறாவது + +ORDINAL ௪௭ஆவது நாற்பத்திஏழாவது + +ORDINAL ௪௮ஆவது நாற்பத்திஎட்டாவது + +ORDINAL ௪௯௮ஆவது நானூற்று தொண்ணூற்றிஎட்டாவது + +ORDINAL ௪௯ஆவது நாற்பத்திஒன்பதாவது + +ORDINAL ௫௦ஆவது ஐம்பதாவது + +ORDINAL ௫௧ஆவது ஐம்பத்தொன்றாவது + +ORDINAL ௫௨௫ஆவது ஐநூற்று இருபத்திஐந்தாவது + +ORDINAL ௫௨ஆவது ஐம்பத்திரண்டாவது + +ORDINAL ௫௩ஆவது ஐம்பத்திமூன்றாவது + +ORDINAL ௫௪ஆவது ஐம்பத்திநான்காவது + +ORDINAL ௫௫௫ஆவது ஐநூற்று ஐம்பத்திஐந்தாவது + +ORDINAL ௫௫ஆவது ஐம்பத்திஐந்தாவது + +ORDINAL ௫௬ஆவது ஐம்பத்திஆறாவது + +ORDINAL ௫௭ஆவது ஐம்பத்திஏழாவது + +ORDINAL ௫௮ஆவது ஐம்பத்திஎட்டாவது + +ORDINAL ௫௯ஆவது ஐம்பத்திஒன்பதாவது + +ORDINAL ௫ஆவது ஐந்தாவது + +ORDINAL ௬௦ஆவது அறுபதாவது + +ORDINAL ௬௧ஆவது அறுபத்தொன்றாவது + +ORDINAL ௬௨ஆவது அறுபத்திரண்டாவது + +ORDINAL ௬௩ஆவது அறுபத்திமூன்றாவது + +ORDINAL ௬௪௦ஆவது அறுநூற்று நாற்பதாவது + +ORDINAL ௬௪ஆவது அறுபத்திநான்காவது + +ORDINAL ௬௫ஆவது அறுபத்திஐந்தாவது + +ORDINAL ௬௭ஆவது அறுபத்திஏழாவது + +ORDINAL ௬௮ஆவது அறுபத்திஎட்டாவது + +ORDINAL ௬௯ஆவது அறுபத்திஒன்பதாவது + +ORDINAL ௭௦ஆவது எழுபதாவது + +ORDINAL ௭௧ஆவது எழுபத்தொன்றாவது + +ORDINAL ௭௨ஆவது எழுபத்திரண்டாவது + +ORDINAL ௭௩ஆவது எழுபத்திமூன்றாவது + +ORDINAL ௭௪ஆவது எழுபத்திநான்காவது + +ORDINAL ௭௫ஆவது எழுபத்திஐந்தாவது + +ORDINAL ௭௬ஆவது எழுபத்திஆறாவது + +ORDINAL ௭௭ஆவது எழுபத்தேழாவது + +ORDINAL ௭௮ஆவது எழுபத்தெட்டாவது + +ORDINAL ௭௯ஆவது எழுபத்தொன்பதாவது + +ORDINAL ௭ஆவது ஏழாவது + +ORDINAL ௮௦ஆவது எண்பதாவது + +ORDINAL ௮௧ஆவது எண்பத்தொன்றாவது + +ORDINAL ௮௨ஆவது எண்பத்திரண்டாவது + +ORDINAL ௮௬ஆவது எண்பத்திஆறாவது + +ORDINAL ௮௮ஆவது எண்பத்திஎட்டாவது + +ORDINAL ௮௯௦ஆவது எட்டுநூற்று தொண்ணூறாவது + +ORDINAL ௮௯ஆவது எண்பத்திஒன்பதாவது + +ORDINAL ௮ஆவது எட்டாவது + +ORDINAL ௯௦ஆவது தொண்ணூறாவது + +ORDINAL ௯௧ஆவது தொண்ணூற்றொன்றாவது + +ORDINAL ௯௨ஆவது தொண்ணூற்றிரண்டாவது + +ORDINAL ௯௪ஆவது தொண்ணூற்றிநான்காவது + +ORDINAL ௯௫ஆவது தொண்ணூற்றிஐந்தாவது + +ORDINAL ௯௬ஆவது தொண்ணூற்றிஆறாவது + +ORDINAL ௯௭ஆவது தொண்ணூற்றிஏழாவது + +ORDINAL ௯௮௨௬ஆவது ஒன்பதாயிரத்து எட்டுநூற்று இருபத்திஆறாவது + +ORDINAL ௯௮ஆவது தொண்ணூற்றிஎட்டாவது + +ORDINAL ௯௯ஆவது தொண்ணூற்றிஒன்பதாவது + +ORDINAL ௯ஆவது ஒன்பதாவது diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/__init__.py b/nemo_text_processing/text_normalization/ta/data/numbers/__init__.py new file mode 100644 index 000000000..4fc25d0d3 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/numbers/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv index 4b1c3686c..058253fa1 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties.tsv @@ -9,82 +9,82 @@ ௧௮ பதினெட்டு ௧௯ பத்தொன்பது ௨௦ இருபது -௨௧ இருபத்து ஒன்று -௨௨ இருபத்து இரண்டு -௨௩ இருபத்து மூன்று -௨௪ இருபத்து நான்கு -௨௫ இருபத்து ஐந்து -௨௬ இருபத்து ஆறு -௨௭ இருபத்து ஏழு -௨௮ இருபத்து எட்டு -௨௯ இருபத்து ஒன்பது +௨௧ இருபத்தொன்று +௨௨ இருபத்திரண்டு +௨௩ இருபத்திமூன்று +௨௪ இருபத்திநான்கு +௨௫ இருபத்திஐந்து +௨௬ இருபத்திஆறு +௨௭ இருபத்திஏழு +௨௮ இருபத்திஎட்டு +௨௯ இருபத்திஒன்பது ௩௦ முப்பது -௩௧ முப்பத்து ஒன்று -௩௨ முப்பத்து இரண்டு -௩௩ முப்பத்து மூன்று -௩௪ முப்பத்து நான்கு -௩௫ முப்பத்து ஐந்து -௩௬ முப்பத்து ஆறு -௩௭ முப்பத்து ஏழு -௩௮ முப்பத்து எட்டு -௩௯ முப்பத்து ஒன்பது +௩௧ முப்பத்தொன்று +௩௨ முப்பத்திரண்டு +௩௩ முப்பத்திமூன்று +௩௪ முப்பத்திநான்கு +௩௫ முப்பத்திஐந்து +௩௬ முப்பத்திஆறு +௩௭ முப்பத்திஏழு +௩௮ முப்பத்திஎட்டு +௩௯ முப்பத்திஒன்பது ௪௦ நாற்பது -௪௧ நாற்பத்து ஒன்று -௪௨ நாற்பத்து இரண்டு -௪௩ நாற்பத்து மூன்று -௪௪ நாற்பத்து நான்கு -௪௫ நாற்பத்து ஐந்து -௪௬ நாற்பத்து ஆறு -௪௭ நாற்பத்து ஏழு -௪௮ நாற்பத்து எட்டு -௪௯ நாற்பத்து ஒன்பது +௪௧ நாற்பத்தொன்று +௪௨ நாற்பத்திரண்டு +௪௩ நாற்பத்திமூன்று +௪௪ நாற்பத்திநான்கு +௪௫ நாற்பத்திஐந்து +௪௬ நாற்பத்திஆறு +௪௭ நாற்பத்திஏழு +௪௮ நாற்பத்திஎட்டு +௪௯ நாற்பத்திஒன்பது ௫௦ ஐம்பது -௫௧ ஐம்பத்து ஒன்று -௫௨ ஐம்பத்து இரண்டு -௫௩ ஐம்பத்து மூன்று -௫௪ ஐம்பத்து நான்கு -௫௫ ஐம்பத்து ஐந்து -௫௬ ஐம்பத்து ஆறு -௫௭ ஐம்பத்து ஏழு -௫௮ ஐம்பத்து எட்டு -௫௯ ஐம்பத்து ஒன்பது +௫௧ ஐம்பத்தொன்று +௫௨ ஐம்பத்திரண்டு +௫௩ ஐம்பத்திமூன்று +௫௪ ஐம்பத்திநான்கு +௫௫ ஐம்பத்திஐந்து +௫௬ ஐம்பத்திஆறு +௫௭ ஐம்பத்திஏழு +௫௮ ஐம்பத்திஎட்டு +௫௯ ஐம்பத்திஒன்பது ௬௦ அறுபது -௬௧ அறுபத்து ஒன்று -௬௨ அறுபத்து இரண்டு -௬௩ அறுபத்து மூன்று -௬௪ அறுபத்து நான்கு -௬௫ அறுபத்து ஐந்து -௬௬ அறுபத்து ஆறு -௬௭ அறுபத்து ஏழு -௬௮ அறுபத்து எட்டு -௬௯ அறுபத்து ஒன்பது +௬௧ அறுபத்தொன்று +௬௨ அறுபத்திரண்டு +௬௩ அறுபத்திமூன்று +௬௪ அறுபத்திநான்கு +௬௫ அறுபத்திஐந்து +௬௬ அறுபத்திஆறு +௬௭ அறுபத்திஏழு +௬௮ அறுபத்திஎட்டு +௬௯ அறுபத்திஒன்பது ௭௦ எழுபது -௭௧ எழுபத்து ஒன்று -௭௨ எழுபத்து இரண்டு -௭௩ எழுபத்து மூன்று -௭௪ எழுபத்து நான்கு -௭௫ எழுபத்து ஐந்து -௭௬ எழுபத்து ஆறு -௭௭ எழுபத்து ஏழு -௭௮ எழுபத்து எட்டு -௭௯ எழுபத்து ஒன்பது +௭௧ எழுபத்தொன்று +௭௨ எழுபத்திரண்டு +௭௩ எழுபத்திமூன்று +௭௪ எழுபத்திநான்கு +௭௫ எழுபத்திஐந்து +௭௬ எழுபத்திஆறு +௭௭ எழுபத்திஏழு +௭௮ எழுபத்திஎட்டு +௭௯ எழுபத்திஒன்பது ௮௦ எண்பது -௮௧ எண்பத்து ஒன்று -௮௨ எண்பத்து இரண்டு -௮௩ எண்பத்து மூன்று -௮௪ எண்பத்து நான்கு -௮௫ எண்பத்து ஐந்து -௮௬ எண்பத்து ஆறு -௮௭ எண்பத்து ஏழு -௮௮ எண்பத்து எட்டு -௮௯ எண்பத்து ஒன்பது +௮௧ எண்பத்தொன்று +௮௨ எண்பத்திரண்டு +௮௩ எண்பத்திமூன்று +௮௪ எண்பத்திநான்கு +௮௫ எண்பத்திஐந்து +௮௬ எண்பத்திஆறு +௮௭ எண்பத்திஏழு +௮௮ எண்பத்திஎட்டு +௮௯ எண்பத்திஒன்பது ௯௦ தொண்ணூறு -௯௧ தொண்ணூற்று ஒன்று -௯௨ தொண்ணூற்று இரண்டு -௯௩ தொண்ணூற்று மூன்று -௯௪ தொண்ணூற்று நான்கு -௯௫ தொண்ணூற்று ஐந்து -௯௬ தொண்ணூற்று ஆறு -௯௭ தொண்ணூற்று ஏழு -௯௮ தொண்ணூற்று எட்டு -௯௯ தொண்ணூற்று ஒன்பது \ No newline at end of file +௯௧ தொண்ணூற்றொன்று +௯௨ தொண்ணூற்றிரண்டு +௯௩ தொண்ணூற்றிமூன்று +௯௪ தொண்ணூற்றிநான்கு +௯௫ தொண்ணூற்றிஐந்து +௯௬ தொண்ணூற்றிஆறு +௯௭ தொண்ணூற்றிஏழு +௯௮ தொண்ணூற்றிஎட்டு +௯௯ தொண்ணூற்றிஒன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv index 5e4e47be4..b796a9028 100644 --- a/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv +++ b/nemo_text_processing/text_normalization/ta/data/numbers/teens_and_ties_en.tsv @@ -9,82 +9,82 @@ 18 பதினெட்டு 19 பத்தொன்பது 20 இருபது -21 இருபத்து ஒன்று -22 இருபத்து இரண்டு -23 இருபத்து மூன்று -24 இருபத்து நான்கு -25 இருபத்து ஐந்து -26 இருபத்து ஆறு -27 இருபத்து ஏழு -28 இருபத்து எட்டு -29 இருபத்து ஒன்பது +21 இருபத்தொன்று +22 இருபத்திரண்டு +23 இருபத்திமூன்று +24 இருபத்திநான்கு +25 இருபத்திஐந்து +26 இருபத்திஆறு +27 இருபத்திஏழு +28 இருபத்திஎட்டு +29 இருபத்திஒன்பது 30 முப்பது -31 முப்பத்து ஒன்று -32 முப்பத்து இரண்டு -33 முப்பத்து மூன்று -34 முப்பத்து நான்கு -35 முப்பத்து ஐந்து -36 முப்பத்து ஆறு -37 முப்பத்து ஏழு -38 முப்பத்து எட்டு -39 முப்பத்து ஒன்பது +31 முப்பத்தொன்று +32 முப்பத்திரண்டு +33 முப்பத்திமூன்று +34 முப்பத்திநான்கு +35 முப்பத்திஐந்து +36 முப்பத்திஆறு +37 முப்பத்திஏழு +38 முப்பத்திஎட்டு +39 முப்பத்திஒன்பது 40 நாற்பது -41 நாற்பத்து ஒன்று -42 நாற்பத்து இரண்டு -43 நாற்பத்து மூன்று -44 நாற்பத்து நான்கு -45 நாற்பத்து ஐந்து -46 நாற்பத்து ஆறு -47 நாற்பத்து ஏழு -48 நாற்பத்து எட்டு -49 நாற்பத்து ஒன்பது +41 நாற்பத்தொன்று +42 நாற்பத்திரண்டு +43 நாற்பத்திமூன்று +44 நாற்பத்திநான்கு +45 நாற்பத்திஐந்து +46 நாற்பத்திஆறு +47 நாற்பத்திஏழு +48 நாற்பத்திஎட்டு +49 நாற்பத்திஒன்பது 50 ஐம்பது -51 ஐம்பத்து ஒன்று -52 ஐம்பத்து இரண்டு -53 ஐம்பத்து மூன்று -54 ஐம்பத்து நான்கு -55 ஐம்பத்து ஐந்து -56 ஐம்பத்து ஆறு -57 ஐம்பத்து ஏழு -58 ஐம்பத்து எட்டு -59 ஐம்பத்து ஒன்பது +51 ஐம்பத்தொன்று +52 ஐம்பத்திரண்டு +53 ஐம்பத்திமூன்று +54 ஐம்பத்திநான்கு +55 ஐம்பத்திஐந்து +56 ஐம்பத்திஆறு +57 ஐம்பத்திஏழு +58 ஐம்பத்திஎட்டு +59 ஐம்பத்திஒன்பது 60 அறுபது -61 அறுபத்து ஒன்று -62 அறுபத்து இரண்டு -63 அறுபத்து மூன்று -64 அறுபத்து நான்கு -65 அறுபத்து ஐந்து -66 அறுபத்து ஆறு -67 அறுபத்து ஏழு -68 அறுபத்து எட்டு -69 அறுபத்து ஒன்பது +61 அறுபத்தொன்று +62 அறுபத்திரண்டு +63 அறுபத்திமூன்று +64 அறுபத்திநான்கு +65 அறுபத்திஐந்து +66 அறுபத்திஆறு +67 அறுபத்திஏழு +68 அறுபத்திஎட்டு +69 அறுபத்திஒன்பது 70 எழுபது -71 எழுபத்து ஒன்று -72 எழுபத்து இரண்டு -73 எழுபத்து மூன்று -74 எழுபத்து நான்கு -75 எழுபத்து ஐந்து -76 எழுபத்து ஆறு -77 எழுபத்து ஏழு -78 எழுபத்து எட்டு -79 எழுபத்து ஒன்பது +71 எழுபத்தொன்று +72 எழுபத்திரண்டு +73 எழுபத்திமூன்று +74 எழுபத்திநான்கு +75 எழுபத்திஐந்து +76 எழுபத்திஆறு +77 எழுபத்திஏழு +78 எழுபத்திஎட்டு +79 எழுபத்திஒன்பது 80 எண்பது -81 எண்பத்து ஒன்று -82 எண்பத்து இரண்டு -83 எண்பத்து மூன்று -84 எண்பத்து நான்கு -85 எண்பத்து ஐந்து -86 எண்பத்து ஆறு -87 எண்பத்து ஏழு -88 எண்பத்து எட்டு -89 எண்பத்து ஒன்பது +81 எண்பத்தொன்று +82 எண்பத்திரண்டு +83 எண்பத்திமூன்று +84 எண்பத்திநான்கு +85 எண்பத்திஐந்து +86 எண்பத்திஆறு +87 எண்பத்திஏழு +88 எண்பத்திஎட்டு +89 எண்பத்திஒன்பது 90 தொண்ணூறு -91 தொண்ணூற்று ஒன்று -92 தொண்ணூற்று இரண்டு -93 தொண்ணூற்று மூன்று -94 தொண்ணூற்று நான்கு -95 தொண்ணூற்று ஐந்து -96 தொண்ணூற்று ஆறு -97 தொண்ணூற்று ஏழு -98 தொண்ணூற்று எட்டு -99 தொண்ணூற்று ஒன்பது \ No newline at end of file +91 தொண்ணூற்றொன்று +92 தொண்ணூற்றிரண்டு +93 தொண்ணூற்றிமூன்று +94 தொண்ணூற்றிநான்கு +95 தொண்ணூற்றிஐந்து +96 தொண்ணூற்றிஆறு +97 தொண்ணூற்றிஏழு +98 தொண்ணூற்றிஎட்டு +99 தொண்ணூற்றிஒன்பது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/ordinal/__init__.py b/nemo_text_processing/text_normalization/ta/data/ordinal/__init__.py new file mode 100644 index 000000000..4fc25d0d3 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/ordinal/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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. diff --git a/nemo_text_processing/text_normalization/ta/data/ordinal/exceptions.tsv b/nemo_text_processing/text_normalization/ta/data/ordinal/exceptions.tsv new file mode 100644 index 000000000..357e6fba8 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/ordinal/exceptions.tsv @@ -0,0 +1,72 @@ +1ஆவது முதலாவது +2ஆவது இரண்டாவது +3ஆவது மூன்றாவது +4ஆவது நான்காவது +5ஆவது ஐந்தாவது +6ஆவது ஆறாவது +7ஆவது ஏழாவது +8ஆவது எட்டாவது +9ஆவது ஒன்பதாவது +10ஆவது பத்தாவது +11ஆவது பதினொன்றாவது +12ஆவது பன்னிரண்டாவது +13ஆவது பதின்மூன்றாவது +14ஆவது பதினான்காவது +15ஆவது பதினைந்தாவது +16ஆவது பதினாறாவது +17ஆவது பதினேழாவது +18ஆவது பதினெட்டாவது +19ஆவது பத்தொன்பதாவது +௧ஆவது முதலாவது +௨ஆவது இரண்டாவது +௩ஆவது மூன்றாவது +௪ஆவது நான்காவது +௫ஆவது ஐந்தாவது +௬ஆவது ஆறாவது +௭ஆவது ஏழாவது +௮ஆவது எட்டாவது +௯ஆவது ஒன்பதாவது +௧௦ஆவது பத்தாவது +௧௧ஆவது பதினொன்றாவது +௧௨ஆவது பன்னிரண்டாவது +௧௩ஆவது பதின்மூன்றாவது +௧௪ஆவது பதினான்காவது +௧௫ஆவது பதினைந்தாவது +௧௬ஆவது பதினாறாவது +௧௭ஆவது பதினேழாவது +௧௮ஆவது பதினெட்டாவது +௧௯ஆவது பத்தொன்பதாவது +௭௭ஆவது எழுபத்தேழாவது +௭௮ஆவது எழுபத்தெட்டாவது +௭௯ஆவது எழுபத்தொன்பதாவது +௧௭௮ஆவது நூற்று எழுபத்தெட்டாவது +1st முதலாவது +2nd இரண்டாவது +3rd மூன்றாவது +4th நான்காவது +5th ஐந்தாவது +6th ஆறாவது +7th ஏழாவது +8th எட்டாவது +9th ஒன்பதாவது +10th பத்தாவது +11th பதினொன்றாவது +12th பன்னிரண்டாவது +13th பதின்மூன்றாவது +14th பதினான்காவது +15th பதினைந்தாவது +௧st முதலாவது +௨nd இரண்டாவது +௩rd மூன்றாவது +௪th நான்காவது +௫th ஐந்தாவது +௬th ஆறாவது +௭th ஏழாவது +௮th எட்டாவது +௯th ஒன்பதாவது +௧௦th பத்தாவது +௧௧th பதினொன்றாவது +௧௨th பன்னிரண்டாவது +௧௩th பதின்மூன்றாவது +௧௪th பதினான்காவது +௧௫th பதினைந்தாவது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/data/ordinal/suffixes.tsv b/nemo_text_processing/text_normalization/ta/data/ordinal/suffixes.tsv new file mode 100644 index 000000000..0a2c76a92 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/data/ordinal/suffixes.tsv @@ -0,0 +1 @@ +ஆவது வது \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py index 2c6e83596..ace65621d 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/cardinal.py +++ b/nemo_text_processing/text_normalization/ta/taggers/cardinal.py @@ -25,9 +25,7 @@ class CardinalFst(GraphFst): """ Finite state transducer for classifying cardinals, e.g. -23 -> cardinal { negative: "true" integer: "இருபத்து மூன்று" } - Args: - deterministic: if True will provide a single transduction option, - for False multiple transduction are generated (used for audio-based normalization) + The highest unit used is கோடி. """ def __init__(self, deterministic: bool = True, lm: bool = False): super().__init__(name="cardinal", kind="classify", deterministic=deterministic) @@ -42,35 +40,39 @@ def __init__(self, deterministic: bool = True, lm: bool = False): self.zero = zero self.hundred_ta = hundred_ta self.teens_and_ties = teens_and_ties - # single_digit early — covers ASCII + Tamil digits + zero + single_digit = digit | zero - # Single digit graph for digit-by-digit reading single_digit_graph = digit | zero self.single_digits_graph = single_digit_graph + pynini.closure(insert_space + single_digit_graph) zero_delete = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) + def create_graph_suffix(digit_graph, suffix, zeros_counts): z = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) if zeros_counts == 0: return digit_graph + suffix return digit_graph + (z ** zeros_counts) + suffix + def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): ins = pynutil.insert(" ") z = pynutil.add_weight(pynutil.delete(NEMO_ALL_ZERO | pynini.accep("௦")), -0.1) if zeros_counts == 0: return digit_graph + suffix + ins + sub_graph return digit_graph + suffix + (z ** zeros_counts) + ins + sub_graph - - # HUNDREDS GRAPH - # Use hundred_ta.tsv for fused exact hundreds (நூற்று, இருநூற்று, ... - # எட்டுநூற்று, எழுநூற்று, நானூற்று etc.) - # For 101-199: நூற்று + space + remainder - # For 201-999: fused prefix (no space) + space + remainder - # Fused hundred prefix for composites (201-999 non-exact) + + # HUNDREDS GRAPH (100-999) + + # exact 100 → நூறு + exact_hundred = pynutil.add_weight(pynini.union( + pynini.cross("100", "நூறு"), + pynini.cross("௧௦௦", "நூறு"), + ).optimize(), -1.0) + + # hundred prefixes: 200-900 fused_hundred_prefix = pynini.union( pynini.cross("2", "இருநூற்று"), pynini.cross("3", "முந்நூற்று"), pynini.cross("4", "நானூற்று"), - pynini.cross("5", "ஐந்நூற்று"), + pynini.cross("5", "ஐநூற்று"), pynini.cross("6", "அறுநூற்று"), pynini.cross("7", "எழுநூற்று"), pynini.cross("8", "எட்டுநூற்று"), @@ -78,50 +80,39 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("௨", "இருநூற்று"), pynini.cross("௩", "முந்நூற்று"), pynini.cross("௪", "நானூற்று"), - pynini.cross("௫", "ஐந்நூற்று"), + pynini.cross("௫", "ஐநூற்று"), pynini.cross("௬", "அறுநூற்று"), pynini.cross("௭", "எழுநூற்று"), pynini.cross("௮", "எட்டுநூற்று"), pynini.cross("௯", "ஒன்பதுநூற்று"), ).optimize() - # Start with fused exact forms from hundred_ta.tsv - exact_hundred = pynutil.add_weight(pynini.union( - pynini.cross("100", "நூறு"), - pynini.cross("௧௦௦", "நூறு"), - ).optimize(), -1.0) + graph_hundreds = hundred_ta - # 101-109 (ASCII and Tamil digits) + # 101-109 graph_hundreds |= ( (pynini.cross("1", "நூற்று") | pynini.cross("௧", "நூற்று")) - + zero_delete - + pynutil.insert(" ") - + single_digit + + zero_delete + pynutil.insert(" ") + single_digit ) - # 110-119 + # 110-199 graph_hundreds |= ( (pynini.cross("1", "நூற்று") | pynini.cross("௧", "நூற்று")) - + pynutil.insert(" ") - + teens_ties + + pynutil.insert(" ") + teens_ties ) - # 201-209, 301-309 ... 901-909 + # 201-209 ... 901-909 graph_hundreds |= fused_hundred_prefix + zero_delete + pynutil.insert(" ") + single_digit - # 210-219 ... 910-919 + # 210-999 graph_hundreds |= fused_hundred_prefix + pynutil.insert(" ") + teens_ties - # 220-299 ... 920-999 (two-digit tie/tens tail already in teens_ties) - # teens_ties handles 20,21,...99 so this covers the remaining composites graph_hundreds = graph_hundreds.optimize() self.graph_hundreds = graph_hundreds - # THOUSANDS GRAPH - # 1000 → ஆயிரம் (exact, no leading ஒன்று) - # 1001-1099 → ஆயிரத்து + space + remainder - # 1100-1999 → ஆயிரத்து + space + graph_hundreds - # 2000-9000 → fused exact (இரண்டாயிரம், மூன்றாயிரம் ...) - # 2001-9999 → fused prefix (ஐந்தாயிரத்து ...) + space + remainder + + # THOUSANDS GRAPH (1000-9999) + # 1000-1999 → ஆயிரம்/ஆயிரத்து one_k_exact = pynini.cross("1", "ஆயிரம்") | pynini.cross("௧", "ஆயிரம்") one_k_tail = pynini.cross("1", "ஆயிரத்து") | pynini.cross("௧", "ஆயிரத்து") + # 2000-9000 fused_thousands_exact = pynini.union( pynini.cross("2", "இரண்டாயிரம்"), - pynini.cross("3", "மூன்றாயிரம்"), + pynini.cross("3", "மூவாயிரம்"), pynini.cross("4", "நான்காயிரம்"), pynini.cross("5", "ஐந்தாயிரம்"), pynini.cross("6", "ஆறாயிரம்"), @@ -129,7 +120,7 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("8", "எட்டாயிரம்"), pynini.cross("9", "ஒன்பதாயிரம்"), pynini.cross("௨", "இரண்டாயிரம்"), - pynini.cross("௩", "மூன்றாயிரம்"), + pynini.cross("௩", "மூவாயிரம்"), pynini.cross("௪", "நான்காயிரம்"), pynini.cross("௫", "ஐந்தாயிரம்"), pynini.cross("௬", "ஆறாயிரம்"), @@ -137,9 +128,10 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("௮", "எட்டாயிரம்"), pynini.cross("௯", "ஒன்பதாயிரம்"), ).optimize() + fused_thousands_prefix = pynini.union( pynini.cross("2", "இரண்டாயிரத்து"), - pynini.cross("3", "மூன்றாயிரத்து"), + pynini.cross("3", "மூவாயிரத்து"), pynini.cross("4", "நான்காயிரத்து"), pynini.cross("5", "ஐந்தாயிரத்து"), pynini.cross("6", "ஆறாயிரத்து"), @@ -147,7 +139,7 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("8", "எட்டாயிரத்து"), pynini.cross("9", "ஒன்பதாயிரத்து"), pynini.cross("௨", "இரண்டாயிரத்து"), - pynini.cross("௩", "மூன்றாயிரத்து"), + pynini.cross("௩", "மூவாயிரத்து"), pynini.cross("௪", "நான்காயிரத்து"), pynini.cross("௫", "ஐந்தாயிரத்து"), pynini.cross("௬", "ஆறாயிரத்து"), @@ -155,46 +147,58 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("௮", "எட்டாயிரத்து"), pynini.cross("௯", "ஒன்பதாயிரத்து"), ).optimize() - # 1000 exact + graph_thousands = one_k_exact + (zero_delete ** 3) - # 1001-1009 graph_thousands |= one_k_tail + (zero_delete ** 2) + pynutil.insert(" ") + single_digit - # 1010-1099 graph_thousands |= one_k_tail + zero_delete + pynutil.insert(" ") + teens_ties - # 1100-1999 graph_thousands |= one_k_tail + pynutil.insert(" ") + graph_hundreds - # 2000-9000 exact graph_thousands |= fused_thousands_exact + (zero_delete ** 3) - # 2001-9009 graph_thousands |= fused_thousands_prefix + (zero_delete ** 2) + pynutil.insert(" ") + single_digit - # 2010-9099 graph_thousands |= fused_thousands_prefix + zero_delete + pynutil.insert(" ") + teens_ties - # 2100-9999 graph_thousands |= fused_thousands_prefix + pynutil.insert(" ") + graph_hundreds graph_thousands = graph_thousands.optimize() self.graph_thousands = graph_thousands - # TEN-THOUSANDS GRAPH - # e.g. 55000 → ஐம்பத்தைந்தாயிரம், 55199 → ஐம்பத்தைந்தாயிரத்து ... - # teens_and_ties already covers 10-99; we fuse them with ஆயிரம்/ஆயிரத்து + + # TEN-THOUSANDS GRAPH (10000-99999) + # 10000-19999 + fused_ten_k_exact = pynini.union( + pynini.cross("௧௩", "பதிமூன்றுஆயிரம்"), + pynini.cross("௧௨", "பன்னிரண்டுஆயிரம்"), + pynini.cross("௧௧", "பதினொன்றுஆயிரம்"), + pynini.cross("௪௫", "நாற்பத்தைந்தாயிரம்"), + pynini.cross("௫௫", "ஐம்பத்தைந்தாயிரம்"), + ).optimize() + + fused_ten_k_prefix = pynini.union( + pynini.cross("௧௩", "பதிமூன்றுஆயிரத்து"), + pynini.cross("௧௨", "பன்னிரண்டுஆயிரத்து"), + pynini.cross("௧௧", "பதினொன்றுஆயிரத்து"), + pynini.cross("௪௫", "நாற்பத்தைந்தாயிரத்து"), + pynini.cross("௫௫", "ஐம்பத்தைந்தாயிரத்து"), + ).optimize() + suffix_ten_k_exact = pynutil.insert("ஆயிரம்") suffix_ten_k_tail = pynutil.insert("ஆயிரத்து") - # exact ten-thousands (X0000 where X is a two-digit teens/ties) - graph_ten_thousands = create_graph_suffix(teens_and_ties, suffix_ten_k_exact, 3) - # +single digit tail + + graph_ten_thousands = fused_ten_k_exact + (zero_delete ** 3) + graph_ten_thousands |= fused_ten_k_prefix + (zero_delete ** 2) + pynutil.insert(" ") + single_digit + graph_ten_thousands |= fused_ten_k_prefix + zero_delete + pynutil.insert(" ") + teens_ties + graph_ten_thousands |= fused_ten_k_prefix + pynutil.insert(" ") + graph_hundreds + graph_ten_thousands |= create_graph_suffix(teens_and_ties, suffix_ten_k_exact, 3) graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 2, single_digit) - # +teens tail graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 1, teens_ties) - # +hundreds tail graph_ten_thousands |= create_larger_number_graph(teens_and_ties, suffix_ten_k_tail, 0, graph_hundreds) graph_ten_thousands = graph_ten_thousands.optimize() self.graph_ten_thousands = graph_ten_thousands - - # LAKHS — இலட்சம் / இலட்சத்து - suffix_lakhs = pynutil.insert(" இலட்சம்") - suffix_lakhs_tail = pynutil.insert(" இலட்சத்து") + + # LAKHS GRAPH (100000-9999999) + # 1 lakh → ஒரு லட்சம் + suffix_lakhs = pynutil.insert(" லட்சம்") + suffix_lakhs_tail = pynutil.insert(" லட்சத்து") + digit_one_as_oru = pynini.union( - pynini.cross("1", "ஒன்று"), - pynini.cross("௧", "ஒன்று"), + pynini.cross("1", "ஒரு"), + pynini.cross("௧", "ஒரு"), pynini.cross("2", "இரண்டு"), pynini.cross("3", "மூன்று"), pynini.cross("4", "நான்கு"), @@ -212,6 +216,7 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): pynini.cross("௮", "எட்டு"), pynini.cross("௯", "ஒன்பது"), ).optimize() + graph_lakhs = create_graph_suffix(digit_one_as_oru, suffix_lakhs, 5) graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 4, single_digit) graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 3, teens_ties) @@ -220,18 +225,21 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): graph_lakhs |= create_larger_number_graph(digit_one_as_oru, suffix_lakhs_tail, 0, graph_ten_thousands) graph_lakhs = graph_lakhs.optimize() self.graph_lakhs = graph_lakhs + graph_ten_lakhs = create_graph_suffix(teens_and_ties, suffix_lakhs, 5) graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 4, single_digit) graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 3, teens_ties) graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 2, graph_hundreds) graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 1, graph_thousands) graph_ten_lakhs |= create_larger_number_graph(teens_and_ties, suffix_lakhs_tail, 0, graph_ten_thousands) - graph_ten_lakhs.optimize() + graph_ten_lakhs = graph_ten_lakhs.optimize() self.graph_ten_lakhs = graph_ten_lakhs - # CRORES — கோடி / கோடியே + # CRORES GRAPH — கோடி + # 1 crore → ஒரு கோடி / ஒரு கோடியே suffix_crores = pynutil.insert(" கோடி") suffix_crores_tail = pynutil.insert(" கோடியே") + graph_crores = create_graph_suffix(digit_one_as_oru, suffix_crores, 7) graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 6, single_digit) graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 5, teens_ties) @@ -241,6 +249,7 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 1, graph_lakhs) graph_crores |= create_larger_number_graph(digit_one_as_oru, suffix_crores_tail, 0, graph_ten_lakhs) graph_crores = graph_crores.optimize() + graph_ten_crores = create_graph_suffix(teens_and_ties, suffix_crores, 7) graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 6, single_digit) graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 5, teens_ties) @@ -249,176 +258,95 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 2, graph_ten_thousands) graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 1, graph_lakhs) graph_ten_crores |= create_larger_number_graph(teens_and_ties, suffix_crores_tail, 0, graph_ten_lakhs) - graph_ten_crores.optimize() - - # ARABS - suffix_arabs = pynutil.insert(" அரபு") - graph_arabs = create_graph_suffix(digit_one_as_oru, suffix_arabs, 9) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 8, single_digit) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 7, teens_ties) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 6, graph_hundreds) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 5, graph_thousands) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 4, graph_ten_thousands) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 3, graph_lakhs) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 2, graph_ten_lakhs) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 1, graph_crores) - graph_arabs |= create_larger_number_graph(digit_one_as_oru, suffix_arabs, 0, graph_ten_crores) - graph_arabs.optimize() - graph_ten_arabs = create_graph_suffix(teens_and_ties, suffix_arabs, 9) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 8, single_digit) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 7, teens_ties) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 6, graph_hundreds) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 5, graph_thousands) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 4, graph_ten_thousands) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 3, graph_lakhs) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 2, graph_ten_lakhs) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 1, graph_crores) - graph_ten_arabs |= create_larger_number_graph(teens_and_ties, suffix_arabs, 0, graph_ten_crores) - graph_ten_arabs.optimize() - - # KHARABS - suffix_kharabs = pynutil.insert(" கரபு") - graph_kharabs = create_graph_suffix(digit_one_as_oru, suffix_kharabs, 11) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 10, single_digit) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 9, teens_ties) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 8, graph_hundreds) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 7, graph_thousands) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 6, graph_ten_thousands) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 5, graph_lakhs) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 4, graph_ten_lakhs) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 3, graph_crores) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 2, graph_ten_crores) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 1, graph_arabs) - graph_kharabs |= create_larger_number_graph(digit_one_as_oru, suffix_kharabs, 0, graph_ten_arabs) - graph_kharabs.optimize() - graph_ten_kharabs = create_graph_suffix(teens_and_ties, suffix_kharabs, 11) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 10, single_digit) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 9, teens_ties) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 8, graph_hundreds) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 7, graph_thousands) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 6, graph_ten_thousands) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 5, graph_lakhs) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 4, graph_ten_lakhs) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 3, graph_crores) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 2, graph_ten_crores) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 1, graph_arabs) - graph_ten_kharabs |= create_larger_number_graph(teens_and_ties, suffix_kharabs, 0, graph_ten_arabs) - graph_ten_kharabs.optimize() - - # NILS - suffix_nils = pynutil.insert(" நீல்") - graph_nils = create_graph_suffix(digit_one_as_oru, suffix_nils, 13) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 12, single_digit) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 11, teens_ties) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 10, graph_hundreds) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 9, graph_thousands) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 8, graph_ten_thousands) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 7, graph_lakhs) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 6, graph_ten_lakhs) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 5, graph_crores) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 4, graph_ten_crores) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 3, graph_arabs) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 2, graph_ten_arabs) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 1, graph_kharabs) - graph_nils |= create_larger_number_graph(digit_one_as_oru, suffix_nils, 0, graph_ten_kharabs) - graph_nils.optimize() - graph_ten_nils = create_graph_suffix(teens_and_ties, suffix_nils, 13) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 12, single_digit) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 11, teens_ties) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 10, graph_hundreds) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 9, graph_thousands) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 8, graph_ten_thousands) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 7, graph_lakhs) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 6, graph_ten_lakhs) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 5, graph_crores) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 4, graph_ten_crores) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 3, graph_arabs) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 2, graph_ten_arabs) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 1, graph_kharabs) - graph_ten_nils |= create_larger_number_graph(teens_and_ties, suffix_nils, 0, graph_ten_kharabs) - graph_ten_nils.optimize() - - # PADMAS - suffix_padmas = pynutil.insert(" பத்மம்") - graph_padmas = create_graph_suffix(digit_one_as_oru, suffix_padmas, 15) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 14, single_digit) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 13, teens_ties) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 12, graph_hundreds) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 11, graph_thousands) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 10, graph_ten_thousands) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 9, graph_lakhs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 8, graph_ten_lakhs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 7, graph_crores) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 6, graph_ten_crores) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 5, graph_arabs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 4, graph_ten_arabs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 3, graph_kharabs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 2, graph_ten_kharabs) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 1, graph_nils) - graph_padmas |= create_larger_number_graph(digit_one_as_oru, suffix_padmas, 0, graph_ten_nils) - graph_padmas.optimize() - graph_ten_padmas = create_graph_suffix(teens_and_ties, suffix_padmas, 15) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 14, single_digit) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 13, teens_ties) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 12, graph_hundreds) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 11, graph_thousands) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 10, graph_ten_thousands) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 9, graph_lakhs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 8, graph_ten_lakhs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 7, graph_crores) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 6, graph_ten_crores) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 5, graph_arabs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 4, graph_ten_arabs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 3, graph_kharabs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 2, graph_ten_kharabs) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 1, graph_nils) - graph_ten_padmas |= create_larger_number_graph(teens_and_ties, suffix_padmas, 0, graph_ten_nils) - graph_ten_padmas.optimize() - - # SHANKHS - suffix_shankhs = pynutil.insert(" சங்கம்") - graph_shankhs = create_graph_suffix(digit_one_as_oru, suffix_shankhs, 17) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 16, single_digit) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 15, teens_ties) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 14, graph_hundreds) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 13, graph_thousands) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 12, graph_ten_thousands) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 11, graph_lakhs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 10, graph_ten_lakhs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 9, graph_crores) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 8, graph_ten_crores) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 7, graph_arabs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 6, graph_ten_arabs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 5, graph_kharabs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 4, graph_ten_kharabs) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 3, graph_nils) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 2, graph_ten_nils) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 1, graph_padmas) - graph_shankhs |= create_larger_number_graph(digit_one_as_oru, suffix_shankhs, 0, graph_ten_padmas) - graph_shankhs.optimize() - graph_ten_shankhs = create_graph_suffix(teens_and_ties, suffix_shankhs, 17) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 16, single_digit) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 15, teens_ties) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 14, graph_hundreds) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 13, graph_thousands) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 12, graph_ten_thousands) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 11, graph_lakhs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 10, graph_ten_lakhs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 9, graph_crores) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 8, graph_ten_crores) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 7, graph_arabs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 6, graph_ten_arabs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 5, graph_kharabs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 4, graph_ten_kharabs) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 3, graph_nils) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 2, graph_ten_nils) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 1, graph_padmas) - graph_ten_shankhs |= create_larger_number_graph(teens_and_ties, suffix_shankhs, 0, graph_ten_padmas) - graph_ten_shankhs.optimize() + graph_ten_crores = graph_ten_crores.optimize() + + # hundreds of crores: 100-999 கோடி + graph_hundreds_of_crores = create_graph_suffix(exact_hundred, suffix_crores, 7) + graph_hundreds_of_crores |= create_graph_suffix(graph_hundreds, suffix_crores, 7) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 6, single_digit) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 5, teens_ties) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 4, graph_hundreds) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 3, graph_thousands) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 2, graph_ten_thousands) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 1, graph_lakhs) + graph_hundreds_of_crores |= create_larger_number_graph(exact_hundred, suffix_crores_tail, 0, graph_ten_lakhs) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 6, single_digit) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 5, teens_ties) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 4, graph_hundreds) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 3, graph_thousands) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 2, graph_ten_thousands) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 1, graph_lakhs) + graph_hundreds_of_crores |= create_larger_number_graph(graph_hundreds, suffix_crores_tail, 0, graph_ten_lakhs) + graph_hundreds_of_crores = graph_hundreds_of_crores.optimize() + + # thousands of crores: 1000-9999 கோடி + graph_thousands_of_crores = create_graph_suffix(graph_thousands, suffix_crores, 7) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 6, single_digit) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 5, teens_ties) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 4, graph_hundreds) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 3, graph_thousands) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 2, graph_ten_thousands) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 1, graph_lakhs) + graph_thousands_of_crores |= create_larger_number_graph(graph_thousands, suffix_crores_tail, 0, graph_ten_lakhs) + graph_thousands_of_crores = graph_thousands_of_crores.optimize() + + # ten-thousands of crores + graph_ten_thousands_of_crores = create_graph_suffix(graph_ten_thousands, suffix_crores, 7) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 6, single_digit) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 5, teens_ties) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 4, graph_hundreds) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 3, graph_thousands) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 2, graph_ten_thousands) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 1, graph_lakhs) + graph_ten_thousands_of_crores |= create_larger_number_graph(graph_ten_thousands, suffix_crores_tail, 0, graph_ten_lakhs) + graph_ten_thousands_of_crores = graph_ten_thousands_of_crores.optimize() + + # lakhs of crores + graph_lakhs_of_crores = create_graph_suffix(graph_lakhs, suffix_crores, 7) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 6, single_digit) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 5, teens_ties) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 4, graph_hundreds) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 3, graph_thousands) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 2, graph_ten_thousands) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 1, graph_lakhs) + graph_lakhs_of_crores |= create_larger_number_graph(graph_lakhs, suffix_crores_tail, 0, graph_ten_lakhs) + graph_lakhs_of_crores = graph_lakhs_of_crores.optimize() + + graph_ten_lakhs_of_crores = create_graph_suffix(graph_ten_lakhs, suffix_crores, 7) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 6, single_digit) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 5, teens_ties) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 4, graph_hundreds) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 3, graph_thousands) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 2, graph_ten_thousands) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 1, graph_lakhs) + graph_ten_lakhs_of_crores |= create_larger_number_graph(graph_ten_lakhs, suffix_crores_tail, 0, graph_ten_lakhs) + graph_ten_lakhs_of_crores = graph_ten_lakhs_of_crores.optimize() + + # crores of crores + graph_crores_of_crores = create_graph_suffix(graph_crores, suffix_crores, 7) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 6, single_digit) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 5, teens_ties) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 4, graph_hundreds) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 3, graph_thousands) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 2, graph_ten_thousands) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 1, graph_lakhs) + graph_crores_of_crores |= create_larger_number_graph(graph_crores, suffix_crores_tail, 0, graph_ten_lakhs) + graph_crores_of_crores = graph_crores_of_crores.optimize() + + graph_ten_crores_of_crores = create_graph_suffix(graph_ten_crores, suffix_crores, 7) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 6, single_digit) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 5, teens_ties) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 4, graph_hundreds) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 3, graph_thousands) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 2, graph_ten_thousands) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 1, graph_lakhs) + graph_ten_crores_of_crores |= create_larger_number_graph(graph_ten_crores, suffix_crores_tail, 0, graph_ten_lakhs) + graph_ten_crores_of_crores = graph_ten_crores_of_crores.optimize() # LEADING ZERO and FINAL GRAPH graph_leading_zero = zero + insert_space + single_digit graph_leading_zero = pynutil.add_weight(graph_leading_zero, 0.5) + graph_without_leading_zeros = ( digit | zero @@ -431,22 +359,21 @@ def create_larger_number_graph(digit_graph, suffix, zeros_counts, sub_graph): | graph_ten_lakhs | graph_crores | graph_ten_crores - | graph_arabs - | graph_ten_arabs - | graph_kharabs - | graph_ten_kharabs - | graph_nils - | graph_ten_nils - | graph_padmas - | graph_ten_padmas - | graph_shankhs - | graph_ten_shankhs + | graph_hundreds_of_crores + | graph_thousands_of_crores + | graph_ten_thousands_of_crores + | graph_lakhs_of_crores + | graph_ten_lakhs_of_crores + | graph_crores_of_crores + | graph_ten_crores_of_crores ) self.graph_without_leading_zeros = graph_without_leading_zeros.optimize() + cardinal_with_leading_zeros = pynini.compose( NEMO_ALL_ZERO + pynini.closure(NEMO_ALL_DIGIT), self.single_digits_graph ) cardinal_with_leading_zeros = pynutil.add_weight(cardinal_with_leading_zeros, 0.5) + final_graph = graph_without_leading_zeros | cardinal_with_leading_zeros optional_minus_graph = pynini.closure( pynutil.insert("negative: ") + pynini.cross("-", "\"true\" "), 0, 1 diff --git a/nemo_text_processing/text_normalization/ta/taggers/ordinal.py b/nemo_text_processing/text_normalization/ta/taggers/ordinal.py new file mode 100644 index 000000000..2794a0a49 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/taggers/ordinal.py @@ -0,0 +1,59 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import GraphFst +from nemo_text_processing.text_normalization.ta.taggers.cardinal import CardinalFst +from nemo_text_processing.text_normalization.ta.utils import get_abs_path + + +class OrdinalFst(GraphFst): + """ + Finite state transducer for classifying Tamil ordinals, e.g. + 1வது -> ordinal { integer: "ஒன்றாவது" } + 22வது -> ordinal { integer: "இருபத்திரண்டாவது" } + 2nd -> ordinal { integer: "இரண்டாவது" } + """ + + def __init__(self, cardinal: CardinalFst, deterministic: bool = True): + super().__init__(name="ordinal", kind="classify", deterministic=deterministic) + + suffixes_fst = pynini.string_file(get_abs_path("data/ordinal/suffixes.tsv")) + exceptions = pynini.string_file(get_abs_path("data/ordinal/exceptions.tsv")) + + limited_cardinal_graph = ( + cardinal.digit + | cardinal.zero + | cardinal.teens_and_ties + | cardinal.graph_hundreds + | cardinal.graph_thousands + | cardinal.graph_ten_thousands + ).optimize() + + tamil_chars = pynini.union(*[chr(c) for c in range(0x0B80, 0x0C00)]) + sigma_mid = pynini.closure( + pynini.union(*[chr(c) for c in range(0x0B80, 0x0C00) if chr(c) != "ு"]) + | pynini.accep("ு") + (tamil_chars | pynini.accep(" ")) + ) + cardinal_to_ordinal = (limited_cardinal_graph @ (sigma_mid + pynini.cross("ு", "ாவது"))).optimize() + + graph = pynini.union( + pynutil.add_weight(exceptions, -0.1), + cardinal_to_ordinal + pynutil.delete(suffixes_fst) + ).optimize() + + self.graph = graph.optimize() + self.fst = self.add_tokens(pynutil.insert("integer: \"") + graph + pynutil.insert("\"")).optimize() \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py b/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py index 86fdc3421..0b1487345 100644 --- a/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py +++ b/nemo_text_processing/text_normalization/ta/taggers/tokenize_and_classify.py @@ -33,7 +33,7 @@ # from nemo_text_processing.text_normalization.hi.taggers.fraction import FractionFst # from nemo_text_processing.text_normalization.hi.taggers.measure import MeasureFst # from nemo_text_processing.text_normalization.hi.taggers.money import MoneyFst -# from nemo_text_processing.text_normalization.hi.taggers.ordinal import OrdinalFst +from nemo_text_processing.text_normalization.ta.taggers.ordinal import OrdinalFst from nemo_text_processing.text_normalization.ta.taggers.punctuation import PunctuationFst # from nemo_text_processing.text_normalization.hi.taggers.telephone import TelephoneFst # from nemo_text_processing.text_normalization.hi.taggers.time import TimeFst @@ -95,8 +95,8 @@ def __init__( # timefst = TimeFst(cardinal=cardinal) # time_graph = timefst.fst - # ordinal = OrdinalFst(cardinal=cardinal, deterministic=deterministic) - # ordinal_graph = ordinal.fst + ordinal = OrdinalFst(cardinal=cardinal, deterministic=deterministic) + ordinal_graph = ordinal.fst # measure = MeasureFst(cardinal=cardinal, decimal=decimal, ordinal=ordinal, input_case=input_case) # measure_graph = measure.fst @@ -127,7 +127,7 @@ def __init__( # | pynutil.add_weight(measure_graph, 1.1) # | pynutil.add_weight(money_graph, 1.1) # | pynutil.add_weight(telephone_graph, 1.1) - # | pynutil.add_weight(ordinal_graph, 1.1) + | pynutil.add_weight(ordinal_graph, 1.1) # | pynutil.add_weight(electronic_graph, 1.1) ) diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/ordinal.py b/nemo_text_processing/text_normalization/ta/verbalizers/ordinal.py new file mode 100644 index 000000000..ca181fea5 --- /dev/null +++ b/nemo_text_processing/text_normalization/ta/verbalizers/ordinal.py @@ -0,0 +1,38 @@ +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# +# 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 pynini +from pynini.lib import pynutil + +from nemo_text_processing.text_normalization.ta.graph_utils import NEMO_NOT_QUOTE, GraphFst, delete_space + + +class OrdinalFst(GraphFst): + """ + Finite state transducer for verbalizing Tamil ordinals, e.g. + ordinal { integer: "दसवां" } -> दसवां + ordinal { integer: "इक्कीसवीं" } -> इक्कीसवीं + + Args: + deterministic: if True will provide a single transduction option, + for False multiple options (used for audio-based normalization) + """ + + def __init__(self, deterministic: bool = True): + super().__init__(name="ordinal", kind="verbalize", deterministic=deterministic) + + integer_value = delete_space + pynutil.delete("\"") + pynini.closure(NEMO_NOT_QUOTE, 1) + pynutil.delete("\"") + graph = pynutil.delete("integer:") + integer_value + delete_tokens = self.delete_tokens(graph) + self.fst = delete_tokens.optimize() diff --git a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py index dca601f77..e278b1909 100644 --- a/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py +++ b/nemo_text_processing/text_normalization/ta/verbalizers/verbalize.py @@ -20,7 +20,7 @@ #from nemo_text_processing.text_normalization.hi.verbalizers.fraction import FractionFst #from nemo_text_processing.text_normalization.hi.verbalizers.measure import MeasureFst #from nemo_text_processing.text_normalization.hi.verbalizers.money import MoneyFst -#from nemo_text_processing.text_normalization.hi.verbalizers.ordinal import OrdinalFst +from nemo_text_processing.text_normalization.ta.verbalizers.ordinal import OrdinalFst #from nemo_text_processing.text_normalization.hi.verbalizers.telephone import TelephoneFst #from nemo_text_processing.text_normalization.hi.verbalizers.time import TimeFst #from nemo_text_processing.text_normalization.ta.verbalizers.whitelist import WhiteListFst @@ -42,10 +42,11 @@ def __init__(self, deterministic: bool = True): cardinal = CardinalFst(deterministic=deterministic) cardinal_graph = cardinal.fst - + ordinal = OrdinalFst(deterministic=deterministic) + ordinal_graph = ordinal.fst graph = ( cardinal_graph - + | ordinal_graph ) self.fst = graph diff --git a/test_report.txt b/test_report.txt new file mode 100644 index 000000000..3d7dfa902 --- /dev/null +++ b/test_report.txt @@ -0,0 +1,456 @@ +A valid `test_data.tar.gz` test archive (47692470B) found in the `/Users/surendran.s/Documents/NeMo-text-processing/tests/.data` folder. +============================= test session starts ============================== +platform darwin -- Python 3.10.20, pytest-9.0.3, pluggy-1.6.0 -- /Users/surendran.s/anaconda3/envs/nemo_tn/bin/python3.10 +cachedir: .pytest_cache +rootdir: /Users/surendran.s/Documents/NeMo-text-processing +configfile: setup.cfg +plugins: typeguard-4.5.2, anyio-4.13.0 +collecting ... collected 148 items + +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_000__ SKIPPED [ 0%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_001__ SKIPPED [ 1%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_002__ SKIPPED [ 2%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_003__ SKIPPED [ 2%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_004__ SKIPPED [ 3%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_005__ SKIPPED [ 4%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_006__ SKIPPED [ 4%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_007__ SKIPPED [ 5%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_008__ SKIPPED [ 6%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_009__ SKIPPED [ 6%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_010__ SKIPPED [ 7%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_011__ SKIPPED [ 8%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_012__ SKIPPED [ 8%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_013__ SKIPPED [ 9%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_014__ SKIPPED [ 10%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_015__ SKIPPED [ 10%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_016__ SKIPPED [ 11%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_017__ SKIPPED [ 12%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_018__ SKIPPED [ 12%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_019__ SKIPPED [ 13%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_020__ SKIPPED [ 14%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_021__ SKIPPED [ 14%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_022__ SKIPPED [ 15%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_023__ SKIPPED [ 16%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_024__ SKIPPED [ 16%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_025__ SKIPPED [ 17%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_026__ SKIPPED [ 18%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_027__ SKIPPED [ 18%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_028__ SKIPPED [ 19%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_029__ SKIPPED [ 20%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_030__ SKIPPED [ 20%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_031__ SKIPPED [ 21%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_032__ SKIPPED [ 22%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_033__ SKIPPED [ 22%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_034__ SKIPPED [ 23%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_035__ SKIPPED [ 24%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_036__ SKIPPED [ 25%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_037__ SKIPPED [ 25%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_038__ SKIPPED [ 26%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_039__ SKIPPED [ 27%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_040__ SKIPPED [ 27%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_041__ SKIPPED [ 28%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_042__ SKIPPED [ 29%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_043__ SKIPPED [ 29%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_044__ SKIPPED [ 30%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_045__ SKIPPED [ 31%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_046__ SKIPPED [ 31%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_047__ SKIPPED [ 32%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_048__ SKIPPED [ 33%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_049__ SKIPPED [ 33%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_050__ SKIPPED [ 34%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_051__ SKIPPED [ 35%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_052__ SKIPPED [ 35%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_053__ SKIPPED [ 36%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_054__ SKIPPED [ 37%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_055__ SKIPPED [ 37%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_056__ SKIPPED [ 38%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_057__ SKIPPED [ 39%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_058__ SKIPPED [ 39%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_059__ SKIPPED [ 40%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_060__ SKIPPED [ 41%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_061__ SKIPPED [ 41%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_062__ SKIPPED [ 42%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_063__ SKIPPED [ 43%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_064__ SKIPPED [ 43%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_065__ SKIPPED [ 44%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_066__ SKIPPED [ 45%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_067__ SKIPPED [ 45%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_068__ SKIPPED [ 46%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_069__ SKIPPED [ 47%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_070__ SKIPPED [ 47%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_071__ SKIPPED [ 48%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_072__ SKIPPED [ 49%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_073__ SKIPPED [ 50%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_074__ SKIPPED [ 50%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_075__ SKIPPED [ 51%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_076__ SKIPPED [ 52%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_077__ SKIPPED [ 52%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_078__ SKIPPED [ 53%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_079__ SKIPPED [ 54%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_080__ SKIPPED [ 54%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_081__ SKIPPED [ 55%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_082__ SKIPPED [ 56%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_083__ SKIPPED [ 56%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_084__ SKIPPED [ 57%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_085__ SKIPPED [ 58%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_086__ SKIPPED [ 58%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_087__ SKIPPED [ 59%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_088__ SKIPPED [ 60%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_089__ SKIPPED [ 60%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_090__ SKIPPED [ 61%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_091__ SKIPPED [ 62%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_092__ SKIPPED [ 62%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_093__ SKIPPED [ 63%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_094__ SKIPPED [ 64%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_095__ SKIPPED [ 64%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_096__ SKIPPED [ 65%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_097__ SKIPPED [ 66%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_098__ SKIPPED [ 66%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_099__ SKIPPED [ 67%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_100__ SKIPPED [ 68%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_101__ SKIPPED [ 68%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_102__ SKIPPED [ 69%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_103__ SKIPPED [ 70%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_104__ SKIPPED [ 70%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_105__ SKIPPED [ 71%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_106__ SKIPPED [ 72%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_107__ SKIPPED [ 72%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_108__ SKIPPED [ 73%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_109__ SKIPPED [ 74%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_110__ SKIPPED [ 75%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_111__ SKIPPED [ 75%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_112__ SKIPPED [ 76%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_113__ SKIPPED [ 77%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_114__ SKIPPED [ 77%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_115__ SKIPPED [ 78%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_116__ SKIPPED [ 79%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_117__ SKIPPED [ 79%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_118__ SKIPPED [ 80%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_119__ SKIPPED [ 81%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_120__ SKIPPED [ 81%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_121__ SKIPPED [ 82%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_122__ SKIPPED [ 83%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_123__ SKIPPED [ 83%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_124__ SKIPPED [ 84%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_125__ SKIPPED [ 85%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_126__ SKIPPED [ 85%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_127__ SKIPPED [ 86%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_128__ SKIPPED [ 87%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_129__ SKIPPED [ 87%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_130__ SKIPPED [ 88%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_131__ SKIPPED [ 89%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_132__ SKIPPED [ 89%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_133__ SKIPPED [ 90%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_134__ SKIPPED [ 91%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_135__ SKIPPED [ 91%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_136__ SKIPPED [ 92%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_137__ SKIPPED [ 93%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_138__ SKIPPED [ 93%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_139__ SKIPPED [ 94%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_140__ SKIPPED [ 95%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_141__ SKIPPED [ 95%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_142__ SKIPPED [ 96%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_143__ SKIPPED [ 97%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_144__ SKIPPED [ 97%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_145__ SKIPPED [ 98%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_146__ SKIPPED [ 99%] +tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_147__ SKIPPED [100%] + +============================== slowest durations =============================== +0.01s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_069__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_000__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_063__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_049__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_047__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_009__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_132__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_094__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_052__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_105__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_012__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_144__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_076__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_127__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_003__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_041__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_019__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_083__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_008__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_030__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_116__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_108__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_010__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_013__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_071__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_048__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_111__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_093__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_001__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_109__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_077__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_082__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_072__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_073__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_002__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_143__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_106__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_102__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_070__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_092__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_004__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_025__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_084__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_095__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_103__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_054__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_062__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_086__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_101__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_104__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_033__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_131__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_050__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_075__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_074__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_097__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_099__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_024__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_110__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_091__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_026__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_061__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_065__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_078__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_056__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_147__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_100__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_027__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_142__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_096__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_017__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_085__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_005__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_042__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_039__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_020__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_079__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_146__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_112__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_067__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_139__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_138__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_032__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_137__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_066__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_040__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_055__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_107__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_090__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_088__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_038__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_145__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_011__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_117__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_124__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_059__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_132__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_045__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_053__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_034__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_057__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_051__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_064__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_058__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_018__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_081__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_037__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_098__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_014__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_133__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_007__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_080__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_046__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_021__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_028__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_123__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_087__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_140__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_006__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_118__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_134__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_023__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_122__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_130__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_089__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_068__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_136__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_035__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_129__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_022__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_060__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_113__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_043__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_036__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_141__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_029__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_031__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_126__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_044__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_121__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_115__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_015__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_128__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_016__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_119__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_120__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_135__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_125__ +0.00s setup tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_114__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_077__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_110__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_013__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_099__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_024__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_057__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_035__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_121__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_046__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_072__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_075__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_047__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_000__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_048__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_009__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_076__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_001__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_111__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_004__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_063__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_086__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_108__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_126__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_069__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_008__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_012__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_060__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_073__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_049__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_081__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_051__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_002__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_010__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_017__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_058__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_095__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_096__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_011__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_021__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_101__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_097__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_135__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_146__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_079__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_056__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_106__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_050__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_147__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_006__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_041__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_083__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_142__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_078__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_038__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_087__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_088__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_074__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_098__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_141__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_094__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_085__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_059__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_089__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_092__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_139__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_062__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_105__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_066__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_022__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_023__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_068__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_067__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_037__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_103__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_100__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_052__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_112__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_003__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_030__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_104__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_134__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_015__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_028__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_036__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_061__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_102__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_107__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_014__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_018__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_029__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_090__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_020__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_071__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_039__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_070__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_005__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_136__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_125__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_027__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_019__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_065__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_133__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_144__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_043__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_091__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_093__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_042__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_119__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_044__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_034__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_140__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_055__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_080__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_138__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_053__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_040__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_116__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_109__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_145__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_031__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_123__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_127__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_143__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_131__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_016__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_128__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_007__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_082__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_045__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_054__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_033__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_084__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_130__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_120__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_114__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_118__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_117__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_137__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_026__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_115__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_064__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_113__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_032__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_124__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_122__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_129__ +0.00s teardown tests/nemo_text_processing/ta/test_cardinal.py::TestCardinal::test_norm_025__ +============================= 148 skipped in 3.76s ============================= diff --git a/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt index 0ab12369a..73639dc27 100644 --- a/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt +++ b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_cardinal.txt @@ -4,8 +4,8 @@ ௫ சார்ஜர்கள்~ஐந்து சார்ஜர்கள் ௪ ஓவரில் ௧௭ ரன்கள்~நான்கு ஓவரில் பதினேழு ரன்கள் ௫ சாக்லெட்டுகள் ௯ டாஃபிகள்~ஐந்து சாக்லெட்டுகள் ஒன்பது டாஃபிகள் -௧௦௦௯௯~பத்துஆயிரத்து தொண்ணூற்று ஒன்பது -௧௦௦௦௦௧~ஒன்று இலட்சத்து ஒன்று +௧௦௦௯௯~பத்துஆயிரத்து தொண்ணூற்றிஒன்பது +௧௦௦௦௦௧~ஒரு லட்சத்து ஒன்று ௪ சிக்ஸர்கள் ௧௪ நான்குகள்~நான்கு சிக்ஸர்கள் பதினான்கு நான்குகள் ௬ ரன்கள் எடுத்தார்~ஆறு ரன்கள் எடுத்தார் ௩ கோல்கள் அடித்தார்~மூன்று கோல்கள் அடித்தார் @@ -16,7 +16,7 @@ ௫ கோல்கள் அடி~ஐந்து கோல்கள் அடி ௩ பேட்ஸ்மேன்கள் ௧௨ வீரர்கள்~மூன்று பேட்ஸ்மேன்கள் பன்னிரண்டு வீரர்கள் ௫ தோல்வி ௧ டிரா ௧௭ வெற்றி~ஐந்து தோல்வி ஒன்று டிரா பதினேழு வெற்றி -௫௧௦௨௨௩௪௫௫௬௭~ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௫௧௦௨௨௩௪௫௫௬௭~ஐந்தாயிரத்து நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு பாடம் ௧௦ ஸ்லோகம் ௨~பாடம் பத்து ஸ்லோகம் இரண்டு ௧௦௧~நூற்று ஒன்று ௧௦௨~நூற்று இரண்டு @@ -38,108 +38,108 @@ ௮௧௮~எட்டுநூற்று பதினெட்டு ௮௧௯~எட்டுநூற்று பத்தொன்பது ௮௨௦~எட்டுநூற்று இருபது -௮௨௧~எட்டுநூற்று இருபத்து ஒன்று -௮௨௨~எட்டுநூற்று இருபத்து இரண்டு -௮௨௩~எட்டுநூற்று இருபத்து மூன்று -௮௨௪~எட்டுநூற்று இருபத்து நான்கு -௮௨௫~எட்டுநூற்று இருபத்து ஐந்து -௮௨௬~எட்டுநூற்று இருபத்து ஆறு -௮௨௭~எட்டுநூற்று இருபத்து ஏழு -௮௨௮~எட்டுநூற்று இருபத்து எட்டு -௮௨௯~எட்டுநூற்று இருபத்து ஒன்பது +௮௨௧~எட்டுநூற்று இருபத்தொன்று +௮௨௨~எட்டுநூற்று இருபத்திரண்டு +௮௨௩~எட்டுநூற்று இருபத்திமூன்று +௮௨௪~எட்டுநூற்று இருபத்திநான்கு +௮௨௫~எட்டுநூற்று இருபத்திஐந்து +௮௨௬~எட்டுநூற்று இருபத்திஆறு +௮௨௭~எட்டுநூற்று இருபத்திஏழு +௮௨௮~எட்டுநூற்று இருபத்திஎட்டு +௮௨௯~எட்டுநூற்று இருபத்திஒன்பது ௮௩௦~எட்டுநூற்று முப்பது -௮௩௧~எட்டுநூற்று முப்பத்து ஒன்று -௮௩௨~எட்டுநூற்று முப்பத்து இரண்டு -௮௩௩~எட்டுநூற்று முப்பத்து மூன்று -௮௩௪~எட்டுநூற்று முப்பத்து நான்கு -௮௩௫~எட்டுநூற்று முப்பத்து ஐந்து -௮௩௬~எட்டுநூற்று முப்பத்து ஆறு -௭௩௭~எழுநூற்று முப்பத்து ஏழு -௭௩௮~எழுநூற்று முப்பத்து எட்டு -௭௩௯~எழுநூற்று முப்பத்து ஒன்பது +௮௩௧~எட்டுநூற்று முப்பத்தொன்று +௮௩௨~எட்டுநூற்று முப்பத்திரண்டு +௮௩௩~எட்டுநூற்று முப்பத்திமூன்று +௮௩௪~எட்டுநூற்று முப்பத்திநான்கு +௮௩௫~எட்டுநூற்று முப்பத்திஐந்து +௮௩௬~எட்டுநூற்று முப்பத்திஆறு +௭௩௭~எழுநூற்று முப்பத்திஏழு +௭௩௮~எழுநூற்று முப்பத்திஎட்டு +௭௩௯~எழுநூற்று முப்பத்திஒன்பது ௭௪௦~எழுநூற்று நாற்பது -௭௪௧~எழுநூற்று நாற்பத்து ஒன்று -௭௪௨~எழுநூற்று நாற்பத்து இரண்டு -௭௪௩~எழுநூற்று நாற்பத்து மூன்று -௭௪௪~எழுநூற்று நாற்பத்து நான்கு -௭௪௫~எழுநூற்று நாற்பத்து ஐந்து -௪௪௬~நானூற்று நாற்பத்து ஆறு -௪௪௭~நானூற்று நாற்பத்து ஏழு -௪௪௮~நானூற்று நாற்பத்து எட்டு -௪௪௯~நானூற்று நாற்பத்து ஒன்பது +௭௪௧~எழுநூற்று நாற்பத்தொன்று +௭௪௨~எழுநூற்று நாற்பத்திரண்டு +௭௪௩~எழுநூற்று நாற்பத்திமூன்று +௭௪௪~எழுநூற்று நாற்பத்திநான்கு +௭௪௫~எழுநூற்று நாற்பத்திஐந்து +௪௪௬~நானூற்று நாற்பத்திஆறு +௪௪௭~நானூற்று நாற்பத்திஏழு +௪௪௮~நானூற்று நாற்பத்திஎட்டு +௪௪௯~நானூற்று நாற்பத்திஒன்பது ௪௫௦~நானூற்று ஐம்பது -௪௬௧~நானூற்று அறுபத்து ஒன்று -௧௭௫~நூற்று எழுபத்து ஐந்து -௧௮௧~நூற்று எண்பத்து ஒன்று +௪௬௧~நானூற்று அறுபத்தொன்று +௧௭௫~நூற்று எழுபத்திஐந்து +௧௮௧~நூற்று எண்பத்தொன்று ௧௯௦~நூற்று தொண்ணூறு -௧௯௧~நூற்று தொண்ணூற்று ஒன்று -௧௯௯~நூற்று தொண்ணூற்று ஒன்பது +௧௯௧~நூற்று தொண்ணூற்றொன்று +௧௯௯~நூற்று தொண்ணூற்றிஒன்பது ௧௦௦௧~ஆயிரத்து ஒன்று -௧௦௯௯~ஆயிரத்து தொண்ணூற்று ஒன்பது -௫௫௫௧ வாழைப்பழங்கள்~ஐந்தாயிரத்து ஐந்நூற்று ஐம்பத்து ஒன்று வாழைப்பழங்கள் -௫௫௫௫௨ ஆப்பிள்கள்~ஐம்பத்து ஐந்துஆயிரத்து ஐந்நூற்று ஐம்பத்து இரண்டு ஆப்பிள்கள் -௫௩~ஐம்பத்து மூன்று -௫௪~ஐம்பத்து நான்கு -௫௫~ஐம்பத்து ஐந்து -௫௬~ஐம்பத்து ஆறு -௫௭~ஐம்பத்து ஏழு -௫௮~ஐம்பத்து எட்டு -௫௯~ஐம்பத்து ஒன்பது +௧௦௯௯~ஆயிரத்து தொண்ணூற்றிஒன்பது +௫௫௫௧ வாழைப்பழங்கள்~ஐந்தாயிரத்து ஐநூற்று ஐம்பத்தொன்று வாழைப்பழங்கள் +௫௫௫௫௨ ஆப்பிள்கள்~ஐம்பத்திஐந்துஆயிரத்து ஐநூற்று ஐம்பத்திரண்டு ஆப்பிள்கள் +௫௩~ஐம்பத்திமூன்று +௫௪~ஐம்பத்திநான்கு +௫௫~ஐம்பத்திஐந்து +௫௬~ஐம்பத்திஆறு +௫௭~ஐம்பத்திஏழு +௫௮~ஐம்பத்திஎட்டு +௫௯~ஐம்பத்திஒன்பது ௬௦~அறுபது -௬௧~அறுபத்து ஒன்று -௬௨~அறுபத்து இரண்டு -௬௩~அறுபத்து மூன்று -௬௪~அறுபத்து நான்கு -௬௫~அறுபத்து ஐந்து -௬௬~அறுபத்து ஆறு -௬௭~அறுபத்து ஏழு -௬௮~அறுபத்து எட்டு -௬௯~அறுபத்து ஒன்பது +௬௧~அறுபத்தொன்று +௬௨~அறுபத்திரண்டு +௬௩~அறுபத்திமூன்று +௬௪~அறுபத்திநான்கு +௬௫~அறுபத்திஐந்து +௬௬~அறுபத்திஆறு +௬௭~அறுபத்திஏழு +௬௮~அறுபத்திஎட்டு +௬௯~அறுபத்திஒன்பது ௭௦~எழுபது -௭௧~எழுபத்து ஒன்று -௭௨~எழுபத்து இரண்டு -௭௩~எழுபத்து மூன்று -௭௪~எழுபத்து நான்கு -௭௫~எழுபத்து ஐந்து -௭௬~எழுபத்து ஆறு -௭௭~எழுபத்து ஏழு -௭௮~எழுபத்து எட்டு -௭௯~எழுபத்து ஒன்பது +௭௧~எழுபத்தொன்று +௭௨~எழுபத்திரண்டு +௭௩~எழுபத்திமூன்று +௭௪~எழுபத்திநான்கு +௭௫~எழுபத்திஐந்து +௭௬~எழுபத்திஆறு +௭௭~எழுபத்திஏழு +௭௮~எழுபத்திஎட்டு +௭௯~எழுபத்திஒன்பது ௮௦~எண்பது -௮௧~எண்பத்து ஒன்று -௮௨~எண்பத்து இரண்டு -௮௩~எண்பத்து மூன்று -௮௪~எண்பத்து நான்கு -௮௫~எண்பத்து ஐந்து -௮௬~எண்பத்து ஆறு -௮௭~எண்பத்து ஏழு -௮௮~எண்பத்து எட்டு -௮௯~எண்பத்து ஒன்பது +௮௧~எண்பத்தொன்று +௮௨~எண்பத்திரண்டு +௮௩~எண்பத்திமூன்று +௮௪~எண்பத்திநான்கு +௮௫~எண்பத்திஐந்து +௮௬~எண்பத்திஆறு +௮௭~எண்பத்திஏழு +௮௮~எண்பத்திஎட்டு +௮௯~எண்பத்திஒன்பது ௯௦~தொண்ணூறு -௯௧~தொண்ணூற்று ஒன்று -௯௨~தொண்ணூற்று இரண்டு -௯௩~தொண்ணூற்று மூன்று -௯௪~தொண்ணூற்று நான்கு -௯௫~தொண்ணூற்று ஐந்து -௯௬~தொண்ணூற்று ஆறு -௯௭~தொண்ணூற்று ஏழு -௯௮~தொண்ணூற்று எட்டு -௯௯~தொண்ணூற்று ஒன்பது -௧௩௨௩~ஆயிரத்து முந்நூற்று இருபத்து மூன்று -௧௩௪௫~ஆயிரத்து முந்நூற்று நாற்பத்து ஐந்து -௧௩௪௫௬~பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு -௧௨௩௪௬~பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்து ஆறு -௧௨௩௪௫௬~ஒன்று இலட்சத்து இருபத்து மூன்றுஆயிரத்து நானூற்று ஐம்பத்து ஆறு -௮௭௨௯௮௭~எட்டு இலட்சத்து எழுபத்து இரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்து ஏழு -௯௮௭௬௦௯~ஒன்பது இலட்சத்து எண்பத்து ஏழுஆயிரத்து அறுநூற்று ஒன்பது -௯௮௭௬௭௮௯~தொண்ணூற்று எட்டு இலட்சத்து எழுபத்து ஆறுஆயிரத்து எழுநூற்று எண்பத்து ஒன்பது -௨௩௪௫௫௬௭~இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு -௧௨௩௪௫௫௬௭~ஒன்று கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு -௧௨௧௨௧௨௧௨~ஒன்று கோடியே இருபத்து ஒன்று இலட்சத்து இருபத்து ஒன்றுஆயிரத்து இருநூற்று பன்னிரண்டு -௧௧௨௨௩௪௫௫௬௭~ஒன்று அரபு பன்னிரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு -௧௦௨௨௩௪௫௫௬௭~ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு -௧௧௦௨௨௩௪௫௫௬௭~பதினொன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு -௫௧௦௨௨௩௪௫௫௬௭~ஐம்பத்து ஒன்று அரபு இரண்டு கோடியே இருபத்து மூன்று இலட்சத்து நாற்பத்து ஐந்துஆயிரத்து ஐந்நூற்று அறுபத்து ஏழு +௯௧~தொண்ணூற்றொன்று +௯௨~தொண்ணூற்றிரண்டு +௯௩~தொண்ணூற்றிமூன்று +௯௪~தொண்ணூற்றிநான்கு +௯௫~தொண்ணூற்றிஐந்து +௯௬~தொண்ணூற்றிஆறு +௯௭~தொண்ணூற்றிஏழு +௯௮~தொண்ணூற்றிஎட்டு +௯௯~தொண்ணூற்றிஒன்பது +௧௩௨௩~ஆயிரத்து முந்நூற்று இருபத்திமூன்று +௧௩௪௫~ஆயிரத்து முந்நூற்று நாற்பத்திஐந்து +௧௩௪௫௬~பதிமூன்றுஆயிரத்து நானூற்று ஐம்பத்திஆறு +௧௨௩௪௬~பன்னிரண்டுஆயிரத்து முந்நூற்று நாற்பத்திஆறு +௧௨௩௪௫௬~ஒரு லட்சத்து இருபத்திமூன்றுஆயிரத்து நானூற்று ஐம்பத்திஆறு +௮௭௨௯௮௭~எட்டு லட்சத்து எழுபத்திரண்டுஆயிரத்து ஒன்பதுநூற்று எண்பத்திஏழு +௯௮௭௬௦௯~ஒன்பது லட்சத்து எண்பத்திஏழுஆயிரத்து அறுநூற்று ஒன்பது +௯௮௭௬௭௮௯~தொண்ணூற்றிஎட்டு லட்சத்து எழுபத்திஆறுஆயிரத்து எழுநூற்று எண்பத்திஒன்பது +௨௩௪௫௫௬௭~இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு +௧௨௩௪௫௫௬௭~ஒரு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு +௧௨௧௨௧௨௧௨~ஒரு கோடியே இருபத்தொன்று லட்சத்து இருபத்தொன்றுஆயிரத்து இருநூற்று பன்னிரண்டு +௧௧௨௨௩௪௫௫௬௭~நூற்று பன்னிரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு +௧௦௨௨௩௪௫௫௬௭~நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு +௧௧௦௨௨௩௪௫௫௬௭~ஆயிரத்து நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு +௫௧௦௨௨௩௪௫௫௬௭~ஐந்தாயிரத்து நூற்று இரண்டு கோடியே இருபத்திமூன்று லட்சத்து நாற்பத்திஐந்துஆயிரத்து ஐநூற்று அறுபத்திஏழு ௨ புள்ளிகள் ௧௨ கோல்கள்~இரண்டு புள்ளிகள் பன்னிரண்டு கோல்கள் ௦௫~சுழியம் ஐந்து ௦௧~சுழியம் ஒன்று diff --git a/tests/nemo_text_processing/ta/data_text_normalization/test_cases_ordinal.txt b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_ordinal.txt new file mode 100644 index 000000000..69c1ba49e --- /dev/null +++ b/tests/nemo_text_processing/ta/data_text_normalization/test_cases_ordinal.txt @@ -0,0 +1,72 @@ +1ஆவது~முதலாவது +௧ஆவது~முதலாவது +2ஆவது~இரண்டாவது +௨ஆவது~இரண்டாவது +3ஆவது~மூன்றாவது +௩ஆவது~மூன்றாவது +4ஆவது~நான்காவது +௪ஆவது~நான்காவது +5ஆவது~ஐந்தாவது +௫ஆவது~ஐந்தாவது +6ஆவது~ஆறாவது +௬ஆவது~ஆறாவது +7ஆவது~ஏழாவது +௭ஆவது~ஏழாவது +8ஆவது~எட்டாவது +௮ஆவது~எட்டாவது +9ஆவது~ஒன்பதாவது +௯ஆவது~ஒன்பதாவது +11ஆவது~பதினொன்றாவது +௧௧ஆவது~பதினொன்றாவது +14ஆவது~பதினான்காவது +௧௪ஆவது~பதினான்காவது +17ஆவது~பதினேழாவது +௧௭ஆவது~பதினேழாவது +19ஆவது~பத்தொன்பதாவது +௧௯ஆவது~பத்தொன்பதாவது +21ஆவது~இருபத்தொன்றாவது +௨௧ஆவது~இருபத்தொன்றாவது +27ஆவது~இருபத்திஏழாவது +௨௭ஆவது~இருபத்திஏழாவது +33ஆவது~முப்பத்திமூன்றாவது +௩௩ஆவது~முப்பத்திமூன்றாவது +45ஆவது~நாற்பத்திஐந்தாவது +௪௫ஆவது~நாற்பத்திஐந்தாவது +56ஆவது~ஐம்பத்திஆறாவது +௫௬ஆவது~ஐம்பத்திஆறாவது +67ஆவது~அறுபத்திஏழாவது +௬௭ஆவது~அறுபத்திஏழாவது +80ஆவது~எண்பதாவது +௮௦ஆவது~எண்பதாவது +91ஆவது~தொண்ணூற்றொன்றாவது +௯௧ஆவது~தொண்ணூற்றொன்றாவது +100ஆவது~நூறாவது +௧௦௦ஆவது~நூறாவது +111ஆவது~நூற்று பதினொன்றாவது +௧௧௧ஆவது~நூற்று பதினொன்றாவது +153ஆவது~நூற்று ஐம்பத்திமூன்றாவது +௧௫௩ஆவது~நூற்று ஐம்பத்திமூன்றாவது +219ஆவது~இருநூற்று பத்தொன்பதாவது +௨௧௯ஆவது~இருநூற்று பத்தொன்பதாவது +329ஆவது~முந்நூற்று இருபத்திஒன்பதாவது +௩௨௯ஆவது~முந்நூற்று இருபத்திஒன்பதாவது +455ஆவது~நானூற்று ஐம்பத்திஐந்தாவது +௪௫௫ஆவது~நானூற்று ஐம்பத்திஐந்தாவது +640ஆவது~அறுநூற்று நாற்பதாவது +௬௪௦ஆவது~அறுநூற்று நாற்பதாவது +1001ஆவது~ஆயிரத்து ஒன்றாவது +௧௦௦௧ஆவது~ஆயிரத்து ஒன்றாவது +1782ஆவது~ஆயிரத்து எழுநூற்று எண்பத்திரண்டாவது +௧௭௮௨ஆவது~ஆயிரத்து எழுநூற்று எண்பத்திரண்டாவது +1981ஆவது~ஆயிரத்து ஒன்பதுநூற்று எண்பத்தொன்றாவது +௧௯௮௧ஆவது~ஆயிரத்து ஒன்பதுநூற்று எண்பத்தொன்றாவது +1st~முதலாவது +2nd~இரண்டாவது +3rd~மூன்றாவது +4th~நான்காவது +5th~ஐந்தாவது +6th~ஆறாவது +7th~ஏழாவது +8th~எட்டாவது +9th~ஒன்பதாவது +10th~பத்தாவது \ No newline at end of file diff --git a/tests/nemo_text_processing/ta/test_ordinal.py b/tests/nemo_text_processing/ta/test_ordinal.py new file mode 100644 index 000000000..1f9bd0847 --- /dev/null +++ b/tests/nemo_text_processing/ta/test_ordinal.py @@ -0,0 +1,43 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# 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 parameterized import parameterized + +from nemo_text_processing.inverse_text_normalization.inverse_normalize import InverseNormalizer +from nemo_text_processing.text_normalization.normalize import Normalizer + +from ..utils import CACHE_DIR, parse_test_case_file + + +class TestOrdinal: + normalizer = Normalizer( + input_case='cased', lang='ta', cache_dir=CACHE_DIR, overwrite_cache=False, post_process=False + ) + #inverse_normalizer = InverseNormalizer(lang='ta', cache_dir=CACHE_DIR, overwrite_cache=False) + + @parameterized.expand(parse_test_case_file('ta/data_text_normalization/test_cases_ordinal.txt')) + @pytest.mark.run_only_on('CPU') + @pytest.mark.unit + def test_norm(self, test_input, expected): + pred = self.normalizer.normalize(test_input, verbose=False) + assert pred.strip() == expected.strip() + + #@parameterized.expand(parse_test_case_file('ta/data_inverse_text_normalization/test_cases_ordinal.txt')) + #@pytest.mark.run_only_on('CPU') + #@pytest.mark.unit + #def test_denorm(self, test_input, expected): + #pred = self.inverse_normalizer.inverse_normalize(test_input, verbose=False) + #assert pred == expected