| | |
| | | |
| | | |
| | | import pynini |
| | | from fun_text_processing.text_normalization.en.graph_utils import DAMO_NOT_QUOTE, DAMO_SIGMA, GraphFst, insert_space |
| | | from fun_text_processing.text_normalization.en.graph_utils import ( |
| | | DAMO_NOT_QUOTE, |
| | | DAMO_SIGMA, |
| | | GraphFst, |
| | | insert_space, |
| | | ) |
| | | from fun_text_processing.text_normalization.en.verbalizers.ordinal import OrdinalFst |
| | | from pynini.examples import plurals |
| | | from pynini.lib import pynutil |
| | |
| | | super().__init__(name="fraction", kind="verbalize", deterministic=deterministic) |
| | | suffix = OrdinalFst().suffix |
| | | |
| | | integer = pynutil.delete("integer_part: \"") + pynini.closure(DAMO_NOT_QUOTE) + pynutil.delete("\" ") |
| | | denominator_one = pynini.cross("denominator: \"one\"", "over one") |
| | | denominator_half = pynini.cross("denominator: \"two\"", "half") |
| | | denominator_quarter = pynini.cross("denominator: \"four\"", "quarter") |
| | | integer = ( |
| | | pynutil.delete('integer_part: "') |
| | | + pynini.closure(DAMO_NOT_QUOTE) |
| | | + pynutil.delete('" ') |
| | | ) |
| | | denominator_one = pynini.cross('denominator: "one"', "over one") |
| | | denominator_half = pynini.cross('denominator: "two"', "half") |
| | | denominator_quarter = pynini.cross('denominator: "four"', "quarter") |
| | | |
| | | denominator_rest = ( |
| | | pynutil.delete("denominator: \"") + pynini.closure(DAMO_NOT_QUOTE) @ suffix + pynutil.delete("\"") |
| | | pynutil.delete('denominator: "') |
| | | + pynini.closure(DAMO_NOT_QUOTE) @ suffix |
| | | + pynutil.delete('"') |
| | | ) |
| | | |
| | | denominators = plurals._priority_union( |
| | |
| | | DAMO_SIGMA, |
| | | ).optimize() |
| | | if not deterministic: |
| | | denominators |= pynutil.delete("denominator: \"") + (pynini.accep("four") @ suffix) + pynutil.delete("\"") |
| | | denominators |= ( |
| | | pynutil.delete('denominator: "') |
| | | + (pynini.accep("four") @ suffix) |
| | | + pynutil.delete('"') |
| | | ) |
| | | |
| | | numerator_one = pynutil.delete("numerator: \"") + pynini.accep("one") + pynutil.delete("\" ") |
| | | numerator_one = pynutil.delete('numerator: "') + pynini.accep("one") + pynutil.delete('" ') |
| | | numerator_one = numerator_one + insert_space + denominators |
| | | numerator_rest = ( |
| | | pynutil.delete("numerator: \"") |
| | | pynutil.delete('numerator: "') |
| | | + (pynini.closure(DAMO_NOT_QUOTE) - pynini.accep("one")) |
| | | + pynutil.delete("\" ") |
| | | + pynutil.delete('" ') |
| | | ) |
| | | numerator_rest = numerator_rest + insert_space + denominators |
| | | numerator_rest @= pynini.cdrewrite( |
| | | plurals._priority_union(pynini.cross("half", "halves"), pynutil.insert("s"), DAMO_SIGMA), |
| | | plurals._priority_union( |
| | | pynini.cross("half", "halves"), pynutil.insert("s"), DAMO_SIGMA |
| | | ), |
| | | "", |
| | | "[EOS]", |
| | | DAMO_SIGMA, |
| | |
| | | |
| | | graph = integer + graph |
| | | graph @= pynini.cdrewrite( |
| | | pynini.cross("and one half", "and a half") | pynini.cross("over ones", "over one"), "", "[EOS]", DAMO_SIGMA |
| | | pynini.cross("and one half", "and a half") | pynini.cross("over ones", "over one"), |
| | | "", |
| | | "[EOS]", |
| | | DAMO_SIGMA, |
| | | ) |
| | | |
| | | self.graph = graph |