basic_class.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # -*- coding: utf-8 -*-
  2. """基本类
  3. 中文字符类
  4. 中文数字/数位类
  5. 中文数字类
  6. 中文数位类
  7. 中文数字系统类
  8. 中文数学符号类
  9. *中文其他符号类
  10. """
  11. __author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>"
  12. __data__ = "2019-05-02"
  13. from fish_speech.text.chn_text_norm.basic_constant import NUMBERING_TYPES
  14. class ChineseChar(object):
  15. """
  16. 中文字符
  17. 每个字符对应简体和繁体,
  18. e.g. 简体 = '负', 繁体 = '負'
  19. 转换时可转换为简体或繁体
  20. """
  21. def __init__(self, simplified, traditional):
  22. self.simplified = simplified
  23. self.traditional = traditional
  24. self.__repr__ = self.__str__
  25. def __str__(self):
  26. return self.simplified or self.traditional or None
  27. def __repr__(self):
  28. return self.__str__()
  29. class ChineseNumberUnit(ChineseChar):
  30. """
  31. 中文数字/数位字符
  32. 每个字符除繁简体外还有一个额外的大写字符
  33. e.g. '陆' 和 '陸'
  34. """
  35. def __init__(self, power, simplified, traditional, big_s, big_t):
  36. super(ChineseNumberUnit, self).__init__(simplified, traditional)
  37. self.power = power
  38. self.big_s = big_s
  39. self.big_t = big_t
  40. def __str__(self):
  41. return "10^{}".format(self.power)
  42. @classmethod
  43. def create(cls, index, value, numbering_type=NUMBERING_TYPES[1], small_unit=False):
  44. if small_unit:
  45. return ChineseNumberUnit(
  46. power=index + 1,
  47. simplified=value[0],
  48. traditional=value[1],
  49. big_s=value[1],
  50. big_t=value[1],
  51. )
  52. elif numbering_type == NUMBERING_TYPES[0]:
  53. return ChineseNumberUnit(
  54. power=index + 8,
  55. simplified=value[0],
  56. traditional=value[1],
  57. big_s=value[0],
  58. big_t=value[1],
  59. )
  60. elif numbering_type == NUMBERING_TYPES[1]:
  61. return ChineseNumberUnit(
  62. power=(index + 2) * 4,
  63. simplified=value[0],
  64. traditional=value[1],
  65. big_s=value[0],
  66. big_t=value[1],
  67. )
  68. elif numbering_type == NUMBERING_TYPES[2]:
  69. return ChineseNumberUnit(
  70. power=pow(2, index + 3),
  71. simplified=value[0],
  72. traditional=value[1],
  73. big_s=value[0],
  74. big_t=value[1],
  75. )
  76. else:
  77. raise ValueError(
  78. "Counting type should be in {0} ({1} provided).".format(
  79. NUMBERING_TYPES, numbering_type
  80. )
  81. )
  82. class ChineseNumberDigit(ChineseChar):
  83. """
  84. 中文数字字符
  85. """
  86. def __init__(
  87. self, value, simplified, traditional, big_s, big_t, alt_s=None, alt_t=None
  88. ):
  89. super(ChineseNumberDigit, self).__init__(simplified, traditional)
  90. self.value = value
  91. self.big_s = big_s
  92. self.big_t = big_t
  93. self.alt_s = alt_s
  94. self.alt_t = alt_t
  95. def __str__(self):
  96. return str(self.value)
  97. @classmethod
  98. def create(cls, i, v):
  99. return ChineseNumberDigit(i, v[0], v[1], v[2], v[3])
  100. class ChineseMath(ChineseChar):
  101. """
  102. 中文数位字符
  103. """
  104. def __init__(self, simplified, traditional, symbol, expression=None):
  105. super(ChineseMath, self).__init__(simplified, traditional)
  106. self.symbol = symbol
  107. self.expression = expression
  108. self.big_s = simplified
  109. self.big_t = traditional
  110. CC, CNU, CND, CM = ChineseChar, ChineseNumberUnit, ChineseNumberDigit, ChineseMath
  111. class NumberSystem(object):
  112. """
  113. 中文数字系统
  114. """
  115. pass
  116. class MathSymbol(object):
  117. """
  118. 用于中文数字系统的数学符号 (繁/简体), e.g.
  119. positive = ['正', '正']
  120. negative = ['负', '負']
  121. point = ['点', '點']
  122. """
  123. def __init__(self, positive, negative, point):
  124. self.positive = positive
  125. self.negative = negative
  126. self.point = point
  127. def __iter__(self):
  128. for v in self.__dict__.values():
  129. yield v
  130. # class OtherSymbol(object):
  131. # """
  132. # 其他符号
  133. # """
  134. #
  135. # def __init__(self, sil):
  136. # self.sil = sil
  137. #
  138. # def __iter__(self):
  139. # for v in self.__dict__.values():
  140. # yield v