decimal.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import pynini
  2. from fun_text_processing.inverse_text_normalization.tl.graph_utils import DAMO_NOT_QUOTE, GraphFst, delete_space
  3. from pynini.lib import pynutil
  4. class DecimalFst(GraphFst):
  5. """
  6. Finite state transducer for verbalizing decimal, e.g.
  7. decimal { negative: "true" integer_part: "12" fractional_part: "5006" quantity: "billion" } -> -12.5006 billion
  8. """
  9. def __init__(self):
  10. super().__init__(name="decimal", kind="verbalize")
  11. optionl_sign = pynini.closure(pynini.cross("negative: \"true\"", "-") + delete_space, 0, 1)
  12. integer = (
  13. pynutil.delete("integer_part:")
  14. + delete_space
  15. + pynutil.delete("\"")
  16. + pynini.closure(DAMO_NOT_QUOTE, 1)
  17. + pynutil.delete("\"")
  18. )
  19. optional_integer = pynini.closure(integer + delete_space, 0, 1)
  20. fractional = (
  21. pynutil.insert(".")
  22. + pynutil.delete("fractional_part:")
  23. + delete_space
  24. + pynutil.delete("\"")
  25. + pynini.closure(DAMO_NOT_QUOTE, 1)
  26. + pynutil.delete("\"")
  27. )
  28. optional_fractional = pynini.closure(fractional + delete_space, 0, 1)
  29. quantity = (
  30. pynutil.delete("quantity:")
  31. + delete_space
  32. + pynutil.delete("\"")
  33. + pynini.closure(DAMO_NOT_QUOTE, 1)
  34. + pynutil.delete("\"")
  35. )
  36. optional_quantity = pynini.closure(pynutil.insert(" ") + quantity + delete_space, 0, 1)
  37. graph = optional_integer + optional_fractional + optional_quantity
  38. self.numbers = graph
  39. graph = optionl_sign + graph
  40. delete_tokens = self.delete_tokens(graph)
  41. self.fst = delete_tokens.optimize()