_tone_rule.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. """
  4. 标调位置
  5. 有 ɑ 不放过,
  6.   没 ɑ 找 o、e;
  7.   ɑ、o、e、i、u、ü
  8.   标调就按这顺序;
  9.   i、u 若是连在一起,
  10.   谁在后面就标谁。
  11. http://www.hwjyw.com/resource/content/2010/06/04/8183.shtml
  12. https://www.zhihu.com/question/23655297
  13. https://github.com/mozillazg/python-pinyin/issues/160
  14. http://www.pinyin.info/rules/where.html
  15. """
  16. # TODO: 增加测试用例:使用 pinyin_dict 中的数据收集所有带声调拼音测试这个规则的正确性
  17. # 1. 收集所有带声调拼音
  18. # 2. 转换为数字声调拼音(tone3),然后再转换为声调拼音
  19. # 3. 比对转换后的声调拼音跟原始拼音,确保结果一致
  20. def right_mark_index(pinyin_no_tone):
  21. # 'iou', 'uei', 'uen': 还原原始韵母后,还需要按照还原前的声调进行标记
  22. if 'iou' in pinyin_no_tone:
  23. return pinyin_no_tone.index('u')
  24. if 'uei' in pinyin_no_tone:
  25. return pinyin_no_tone.index('i')
  26. if 'uen' in pinyin_no_tone:
  27. return pinyin_no_tone.index('u')
  28. # 有 ɑ 不放过, 没 ɑ 找 o、e
  29. for c in ['a', 'o', 'e']:
  30. if c in pinyin_no_tone:
  31. return pinyin_no_tone.index(c) + len(c) - 1
  32. # i、u 若是连在一起,谁在后面就标谁
  33. for c in ['iu', 'ui']:
  34. if c in pinyin_no_tone:
  35. return pinyin_no_tone.index(c) + len(c) - 1
  36. # ɑ、o、e、i、u、ü
  37. for c in ['i', 'u', 'v', 'ü']:
  38. if c in pinyin_no_tone:
  39. return pinyin_no_tone.index(c) + len(c) - 1
  40. # n, m, ê
  41. for c in ['n', 'm', 'ê']:
  42. if c in pinyin_no_tone:
  43. return pinyin_no_tone.index(c) + len(c) - 1