|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from text_processing.vi.graph_utils import ( |
|
NEMO_NOT_QUOTE, |
|
GraphFst, |
|
delete_space, |
|
) |
|
|
|
try: |
|
import pynini |
|
from pynini.lib import pynutil |
|
|
|
PYNINI_AVAILABLE = True |
|
except (ModuleNotFoundError, ImportError): |
|
PYNINI_AVAILABLE = False |
|
|
|
|
|
class DecimalFst(GraphFst): |
|
""" |
|
Finite state transducer for verbalizing decimal, e.g. |
|
decimal { negative: "true" integer_part: "12" fractional_part: "5006" quantity: "tỷ" } -> -12.5006 tỷ |
|
""" |
|
|
|
def __init__(self): |
|
super().__init__(name="decimal", kind="verbalize") |
|
optionl_sign = pynini.closure(pynini.cross('negative: "true"', "-") + delete_space, 0, 1) |
|
integer = ( |
|
pynutil.delete("integer_part:") |
|
+ delete_space |
|
+ pynutil.delete('"') |
|
+ pynini.closure(NEMO_NOT_QUOTE, 1) |
|
+ pynutil.delete('"') |
|
) |
|
optional_integer = pynini.closure(integer + delete_space, 0, 1) |
|
fractional = ( |
|
pynutil.insert(".") |
|
+ pynutil.delete("fractional_part:") |
|
+ delete_space |
|
+ pynutil.delete('"') |
|
+ pynini.closure(NEMO_NOT_QUOTE, 1) |
|
+ pynutil.delete('"') |
|
) |
|
optional_fractional = pynini.closure(fractional + delete_space, 0, 1) |
|
quantity = ( |
|
pynutil.delete("quantity:") |
|
+ delete_space |
|
+ pynutil.delete('"') |
|
+ pynini.closure(NEMO_NOT_QUOTE, 1) |
|
+ pynutil.delete('"') |
|
) |
|
optional_quantity = pynini.closure(pynutil.insert(" ") + quantity + delete_space, 0, 1) |
|
graph = optional_integer + optional_fractional + optional_quantity |
|
self.numbers = graph |
|
graph = optionl_sign + graph |
|
delete_tokens = self.delete_tokens(graph) |
|
self.fst = delete_tokens.optimize() |
|
|