o
    Ti=                     @   s$  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d#ddZd#ddZG dd deZe ZeeZd$ddZeZd%ddZd%ddZd%ddZ e	j!dd
dddfddZ"e	j#ddd
dfddZ$e	j#d
ddddfd d!Z%d"S )&    )unicode_literals)chain)	text_type)PHRASES_DICTPINYIN_DICTStyleRE_HANS)DefaultConverterUltimateConverter)ToneSandhiMixin)tone2_to_tone)mmsegsegdefaultc                 C   sF   |dkr|   D ]\}}t|}|t|< qnt|  ttj dS )u   载入用户自定义的单字拼音库

    :param pinyin_dict: 单字拼音库。比如： ``{0x963F: u"ā,ē"}``
    :param style: pinyin_dict 参数值的拼音库风格. 支持 'default', 'tone2'
    :type pinyin_dict: dict
    tone2N)itemsr   r   updater   retrainr   )pinyin_dictstylekv r   A/home/ubuntu/.local/lib/python3.10/site-packages/pypinyin/core.pyload_single_dict   s   

r   c                 C   sL   |dkr|   D ]\}}dd |D }|t|< qnt|  ttj dS )u   载入用户自定义的词语拼音库

    :param phrases_dict: 词语拼音库。比如： ``{u"阿爸": [[u"ā"], [u"bà"]]}``
    :param style: phrases_dict 参数值的拼音库风格. 支持 'default', 'tone2'
    :type phrases_dict: dict
    r   c                 S   s   g | ]	}t tt|qS r   )listmapr   ).0pysr   r   r   
<listcomp>-   s    z%load_phrases_dict.<locals>.<listcomp>N)r   r   r   r   r   r   )phrases_dictr   r   valuer   r   r   r   load_phrases_dict$   s   

r#   c                   @   s\   e Zd ZdddZejdddfddZejddfd	d
Zdd Z	dd Z
dd Zdd ZdS )PinyinNc                 K   s   |pt  | _d S N)r	   
_converter)self	converterkwargsr   r   r   __init__:   s   zPinyin.__init__Fr   Tc              
      s   t |tr |}n2t  jtst  jtr2g }|D ]}t|s+| | q|	| qnt
 fdd|D  }g }	|D ]}
|	 jj|
||||d qA|	S )u2  将汉字转换为拼音，返回汉字的拼音列表。

        :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ).
                     可以使用自己喜爱的分词模块对字符串进行分词处理,
                     只需将经过分词处理的字符串列表传进来就可以了。
        :type hans: unicode 字符串或字符串列表
        :param style: 指定拼音风格，默认是 :py:attr:`~pypinyin.Style.TONE` 风格。
                      更多拼音风格详见 :class:`~pypinyin.Style`
        :param errors: 指定如何处理没有拼音的字符。详见 :ref:`handle_no_pinyin`

                       * ``'default'``: 保留原始字符
                       * ``'ignore'``: 忽略该字符
                       * ``'replace'``: 替换为去掉 ``\u`` 的 unicode 编码字符串
                         (``'\u90aa'`` => ``'90aa'``)
                       * callable 对象: 回调函数之类的可调用对象。

        :param heteronym: 是否启用多音字
        :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果
                       是否严格遵照《汉语拼音方案》来处理声母和韵母，
                       详见 :ref:`strict`
        :return: 拼音列表
        :rtype: list

        c                 3   s    | ]}  |V  qd S r%   r   )r   xr'   r   r   	<genexpr>d   s    z Pinyin.pinyin.<locals>.<genexpr>)strict)
isinstancer   r   r&   r
   r   r   matchextendappendr   convert)r'   hansr   	heteronymerrorsr.   r)   han_listhr   wordsr   r,   r   pinyin=   s(   



zPinyin.pinyinc              	   K   s   t t| j||d||d S )u  将汉字转换为拼音，返回不包含多音字结果的拼音列表.

        与 :py:func:`~pypinyin.pinyin` 的区别是每个汉字的拼音是个字符串，
        并且每个字只包含一个读音.

        :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ).
                 可以使用自己喜爱的分词模块对字符串进行分词处理,
                 只需将经过分词处理的字符串列表传进来就可以了。
        :type hans: unicode 字符串或字符串列表
        :param style: 指定拼音风格，默认是 :py:attr:`~pypinyin.Style.NORMAL` 风格。
                      更多拼音风格详见 :class:`~pypinyin.Style`。
        :param errors: 指定如何处理没有拼音的字符，详情请参考
                       :py:func:`~pypinyin.pinyin`
        :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果
                       是否严格遵照《汉语拼音方案》来处理声母和韵母，
                       详见 :ref:`strict`
        :return: 拼音列表(e.g. ``['zhong', 'guo', 'ren']``)
        :rtype: list

        Fr   r5   r6   r.   )r   r   r:   )r'   r4   r   r6   r.   r)   r   r   r   lazy_pinyinm   s   zPinyin.lazy_pinyinc                 K      dS )u  对字符串进行分词前将调用 ``pre_seg`` 方法对未分词的字符串做预处理。

        默认原样返回传入的 ``hans``。

        如果这个方法的返回值类型是 ``list``，表示返回的是一个分词后的结果，此时，
        ``seg`` 方法中将不再调用 ``seg_function`` 进行分词。

        :param hans: 分词前的字符串
        :return: ``None`` or ``list``
        Nr   )r'   r4   r)   r   r   r   pre_seg   s   zPinyin.pre_segc                 K   sD   |  |}t|tr|}n|  |}| ||}t|tr |S |S )u   对汉字进行分词。

        分词前会调用 ``pre_seg`` 方法，分词后会调用 ``post_seg`` 方法。

        :param hans:
        :return:
        )r>   r/   r   get_segpost_seg)r'   r4   r)   pre_dataseg_data	post_datar   r   r   r      s   


z
Pinyin.segc                 K   s   t S )u=   获取分词函数。

        :return: 分词函数
        r   )r'   r)   r   r   r   r?      s   zPinyin.get_segc                 K   r=   )u  对字符串进行分词后将调用 ``post_seg`` 方法对分词后的结果做处理。

        默认原样返回传入的 ``seg_data``。

        如果这个方法的返回值类型是 ``list``，表示对分词结果做了二次处理，此时，
        ``seg`` 方法将以这个返回的数据作为返回值。

        :param hans: 分词前的字符串
        :param seg_data: 分词后的结果
        :type seg_data: list
        :return: ``None`` or ``list``
        Nr   )r'   r4   rB   r)   r   r   r   r@      s   zPinyin.post_segr%   )__name__
__module____qualname__r*   r   TONEr:   NORMALr<   r>   r   r?   r@   r   r   r   r   r$   8   s    

0
r$   Tc                 C   s   t jd| ||| dS )N )r   r.   r   )_default_convertconvert_style)r:   r   r.   r   r   r   to_fixed      
rL   c                 C   s   t j| d ||ddS )NT)r   r6   r5   r.   )rJ   handle_nopinyin)charsr6   r5   r   r   r   rN      rM   rN   c                 C      t j| ||||dS N)r6   r.   )rJ   _single_pinyin)hanr   r5   r6   r.   r   r   r   single_pinyin   rM   rT   c                 C   rP   rQ   )rJ   _phrase_pinyin)phraser   r5   r6   r.   r   r   r   phrase_pinyin   rM   rW   Fc                 C   s$   t t||d}|j| ||||dS )u	  将汉字转换为拼音，返回汉字的拼音列表。

    :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ).
                 可以使用自己喜爱的分词模块对字符串进行分词处理,
                 只需将经过分词处理的字符串列表传进来就可以了。
    :type hans: unicode 字符串或字符串列表
    :param style: 指定拼音风格，默认是 :py:attr:`~pypinyin.Style.TONE` 风格。
                  更多拼音风格详见 :class:`~pypinyin.Style`
    :param errors: 指定如何处理没有拼音的字符。详见 :ref:`handle_no_pinyin`

                   * ``'default'``: 保留原始字符
                   * ``'ignore'``: 忽略该字符
                   * ``'replace'``: 替换为去掉 ``\u`` 的 unicode 编码字符串
                     (``'\u90aa'`` => ``'90aa'``)
                   * callable 对象: 回调函数之类的可调用对象。

    :param heteronym: 是否启用多音字
    :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果
                   是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :param v_to_u: 无声调相关拼音风格下的结果是否使用 ``ü`` 代替原来的 ``v``
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :type v_to_u: bool
    :param neutral_tone_with_five: 声调使用数字表示的相关拼音风格下的结果是否
                                   使用 5 标识轻声
    :type neutral_tone_with_five: bool
    :return: 拼音列表
    :rtype: list

    :raise AssertionError: 当传入的字符串不是 unicode 字符时会抛出这个异常

    Usage::

      >>> from pypinyin import pinyin, Style
      >>> import pypinyin
      >>> pinyin('中心')
      [['zhōng'], ['xīn']]
      >>> pinyin('中心', heteronym=True)  # 启用多音字模式
      [['zhōng', 'zhòng'], ['xīn']]
      >>> pinyin('中心', style=Style.FIRST_LETTER)  # 设置拼音风格
      [['z'], ['x']]
      >>> pinyin('中心', style=Style.TONE2)
      [['zho1ng'], ['xi1n']]
      >>> pinyin('中心', style=Style.CYRILLIC)
      [['чжун1'], ['синь1']]
      >>> pinyin('战略', v_to_u=True, style=Style.NORMAL)
      [['zhan'], ['lüe']]
      >>> pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True)
      [['yi1'], ['shang5']]
    )v_to_uneutral_tone_with_fiver;   )r$   r
   r:   )r4   r   r5   r6   r.   rX   rY   _pinyinr   r   r   r:      s   5
r:   -c              
   C   s   | ttj| ||||d S )u  将汉字转换为拼音，然后生成 slug 字符串.

    :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ).
                 可以使用自己喜爱的分词模块对字符串进行分词处理,
                 只需将经过分词处理的字符串列表传进来就可以了。
    :type hans: unicode 字符串或字符串列表
    :param style: 指定拼音风格，默认是 :py:attr:`~pypinyin.Style.NORMAL` 风格。
                  更多拼音风格详见 :class:`~pypinyin.Style`
    :param heteronym: 是否启用多音字
    :param separator: 两个拼音间的分隔符/连接符
    :param errors: 指定如何处理没有拼音的字符，详情请参考
                   :py:func:`~pypinyin.pinyin`
    :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果
                   是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :return: slug 字符串.

    :raise AssertionError: 当传入的字符串不是 unicode 字符时会抛出这个异常

    ::

      >>> import pypinyin
      >>> from pypinyin import Style
      >>> pypinyin.slug('中国人')
      'zhong-guo-ren'
      >>> pypinyin.slug('中国人', separator=' ')
      'zhong guo ren'
      >>> pypinyin.slug('中国人', style=Style.FIRST_LETTER)
      'z-g-r'
      >>> pypinyin.slug('中国人', style=Style.CYRILLIC)
      'чжун1-го2-жэнь2'
    r;   )joinr   _default_pinyinr:   )r4   r   r5   	separatorr6   r.   r   r   r   slug  s   "r_   c                 C   s$   t t|||d}|j| |||dS )u
  将汉字转换为拼音，返回不包含多音字结果的拼音列表.

    与 :py:func:`~pypinyin.pinyin` 的区别是返回的拼音是个字符串，
    并且每个字只包含一个读音.

    :param hans: 汉字字符串( ``'你好吗'`` )或列表( ``['你好', '吗']`` ).
                 可以使用自己喜爱的分词模块对字符串进行分词处理,
                 只需将经过分词处理的字符串列表传进来就可以了。
    :type hans: unicode 字符串或字符串列表
    :param style: 指定拼音风格，默认是 :py:attr:`~pypinyin.Style.NORMAL` 风格。
                  更多拼音风格详见 :class:`~pypinyin.Style`。
    :param errors: 指定如何处理没有拼音的字符，详情请参考
                   :py:func:`~pypinyin.pinyin`
    :param strict: 只获取声母或只获取韵母相关拼音风格的返回结果
                   是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :param v_to_u: 无声调相关拼音风格下的结果是否使用 ``ü`` 代替原来的 ``v``
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :type v_to_u: bool
    :param neutral_tone_with_five: 声调使用数字表示的相关拼音风格下的结果是否
                                   使用 5 标识轻声
    :type neutral_tone_with_five: bool
    :param tone_sandhi: 是否按照声调 `变调规则 <https://en.wikipedia.org/wiki/Standard_Chinese_phonology#Tone_sandhi>`__
                        对拼音进行处理
                        （使用预先通过分词库进行过分词后的结果作为 ``hans``
                        参数的值效果会更好，因为变调效果依赖分词效果）
    :type tone_sandhi: bool
    :return: 拼音列表(e.g. ``['zhong', 'guo', 'ren']``)
    :rtype: list

    :raise AssertionError: 当传入的字符串不是 unicode 字符时会抛出这个异常

    Usage::

      >>> from pypinyin import lazy_pinyin, Style
      >>> import pypinyin
      >>> lazy_pinyin('中心')
      ['zhong', 'xin']
      >>> lazy_pinyin('中心', style=Style.TONE)
      ['zhōng', 'xīn']
      >>> lazy_pinyin('中心', style=Style.FIRST_LETTER)
      ['z', 'x']
      >>> lazy_pinyin('中心', style=Style.TONE2)
      ['zho1ng', 'xi1n']
      >>> lazy_pinyin('中心', style=Style.CYRILLIC)
      ['чжун1', 'синь1']
      >>> lazy_pinyin('战略', v_to_u=True)
      ['zhan', 'lüe']
      >>> lazy_pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True)
      ['yi1', 'shang5']
      >>> lazy_pinyin('你好', style=Style.TONE2, tone_sandhi=True)
      ['ni2', 'ha3o']
    )rX   rY   tone_sandhi)r   r6   r.   )r$   r
   r<   )r4   r   r6   r.   rX   rY   r`   rZ   r   r   r   r<   G  s   7r<   N)r   )T)r   T)&
__future__r   	itertoolsr   pypinyin.compatr   pypinyin.constantsr   r   r   r   pypinyin.converterr	   r
   pypinyin.contrib.tone_sandhir   pypinyin.contrib.tone_convertr   pypinyin.segr   pypinyin.seg.simplesegr   r   r#   objectr$   rJ   r]   rL   	_to_fixedrN   rT   rW   rG   r:   rH   r_   r<   r   r   r   r   <module>   s<   

 





;
,