|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from text_processing.vi.graph_utils import ( |
|
NEMO_CHAR, |
|
NEMO_NOT_QUOTE, |
|
GraphFst, |
|
delete_space, |
|
) |
|
|
|
try: |
|
import pynini |
|
from pynini.lib import pynutil |
|
|
|
PYNINI_AVAILABLE = True |
|
except (ModuleNotFoundError, ImportError): |
|
|
|
PYNINI_AVAILABLE = False |
|
|
|
|
|
class MeasureFst(GraphFst): |
|
""" |
|
Finite state transducer for verbalizing measure, e.g. |
|
measure { negative: "true" cardinal { integer: "12" } units: "kg" } -> -12 kg |
|
|
|
Args: |
|
decimal: DecimalFst |
|
cardinal: CardinalFst |
|
""" |
|
|
|
def __init__(self, decimal: GraphFst, cardinal: GraphFst): |
|
super().__init__(name="measure", kind="verbalize") |
|
optional_sign = pynini.closure(pynini.cross('negative: "true"', "-"), 0, 1) |
|
unit = ( |
|
pynutil.delete("units:") |
|
+ delete_space |
|
+ pynutil.delete('"') |
|
+ pynini.closure(NEMO_CHAR - " ", 1) |
|
+ pynutil.delete('"') |
|
+ delete_space |
|
) |
|
graph_decimal = ( |
|
pynutil.delete("decimal {") |
|
+ delete_space |
|
+ optional_sign |
|
+ delete_space |
|
+ decimal.numbers |
|
+ delete_space |
|
+ pynutil.delete("}") |
|
) |
|
graph_cardinal = ( |
|
pynutil.delete("cardinal {") |
|
+ delete_space |
|
+ optional_sign |
|
+ delete_space |
|
+ cardinal.numbers |
|
+ delete_space |
|
+ pynutil.delete("}") |
|
) |
|
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) |
|
graph = ( |
|
(graph_cardinal | graph_decimal) |
|
+ delete_space |
|
+ optional_fractional |
|
+ pynutil.insert(" ") |
|
+ unit |
|
+ delete_space |
|
) |
|
delete_tokens = self.delete_tokens(graph) |
|
self.fst = delete_tokens.optimize() |
|
|