| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals
- from pypinyin.standard import convert_finals
- from pypinyin.style._constants import (
- _INITIALS, _INITIALS_NOT_STRICT, _FINALS,
- RE_PHONETIC_SYMBOL, PHONETIC_SYMBOL_DICT,
- PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE,
- RE_NUMBER
- )
- def get_initials(pinyin, strict):
- """获取单个拼音中的声母.
- :param pinyin: 单个拼音
- :type pinyin: unicode
- :param strict: 是否严格遵照《汉语拼音方案》来处理声母和韵母
- :return: 声母
- :rtype: unicode
- """
- if strict:
- _initials = _INITIALS
- else:
- _initials = _INITIALS_NOT_STRICT
- for i in _initials:
- if pinyin.startswith(i):
- return i
- return ''
- def get_finals(pinyin, strict):
- """获取单个拼音中的韵母.
- :param pinyin: 单个拼音,无声调拼音
- :type pinyin: unicode
- :param strict: 是否严格遵照《汉语拼音方案》来处理声母和韵母
- :return: 韵母
- :rtype: unicode
- """
- if strict:
- pinyin = convert_finals(pinyin)
- initials = get_initials(pinyin, strict=strict) or ''
- # 按声母分割,剩下的就是韵母
- finals = pinyin[len(initials):]
- # 处理既没有声母也没有韵母的情况
- if strict and finals not in _FINALS:
- # 处理 y, w 导致误判的问题,比如 yo
- initials = get_initials(pinyin, strict=False)
- finals = pinyin[len(initials):]
- if finals in _FINALS:
- return finals
- return ''
- # ń, ḿ
- if not finals and not strict:
- return pinyin
- return finals
- def replace_symbol_to_number(pinyin):
- """把声调替换为数字"""
- def _replace(match):
- symbol = match.group(0) # 带声调的字符
- # 返回使用数字标识声调的字符
- return PHONETIC_SYMBOL_DICT[symbol]
- # 替换拼音中的带声调字符
- value = RE_PHONETIC_SYMBOL.sub(_replace, pinyin)
- for symbol, to in PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE.items():
- value = value.replace(symbol, to)
- return value
- def replace_symbol_to_no_symbol(pinyin):
- """把带声调字符替换为没有声调的字符"""
- value = replace_symbol_to_number(pinyin)
- return RE_NUMBER.sub('', value)
- def has_finals(pinyin):
- """判断是否有韵母"""
- # 鼻音: 'm̄', 'ḿ', 'm̀', 'ń', 'ň', 'ǹ ' 没有韵母
- for symbol in ['m̄', 'ḿ', 'm̀', 'ń', 'ň', 'ǹ']:
- if symbol in pinyin:
- return False
- return True
|