python -- pypinyin详解

文档敬上

GitHub: https://github.com/mozillazg/python-pinyin
文档: https://pypinyin.readthedocs.io/zh_CN/master/
PyPi: https://pypi.org/project/pypinyin/

特性

  • 根据词组智能匹配最正确的拼音。
  • 支持多音字。
  • 简单的繁体支持, 注音支持。
  • 支持多种不同拼音/注音风格。

安装

pip install pypinyin

装完成之后导入一下这个库,如果不报错,那就说明安装成功了

 import pypinyin

详解

基本用法

from pypinyin import pinyin
print(pinyin('中心'))

# 输出: [['zhōng'], ['xīn']]

多音字

from pypinyin import pinyin
print(pinyin('朝阳', heteronym=True))

# 输出: [['zhāo', 'cháo'], ['yáng']]

不带拼音的输出

import pypinyin
str1 = '你好在哪来'
print(pypinyin.lazy_pinyin(str1))

# 输出: ['ni', 'hao', 'zai', 'na', 'lai']

风格转换

可以对结果进行一些风格转换,比如不带声调风格、标准声调风格、声调在拼音之后、声调在韵母之后、注音风格等等,比如想要声调放在拼音后面,可以这么来实现:

from pypinyin import lazy_pinyin, Style
 
style = Style.TONE3
print(lazy_pinyin('聪明的小兔子', style=style))

输出: ['cong1', 'ming2', 'de', 'xiao3', 'tu4', 'zi']

可以看到运行结果每个拼音后面就多了一个声调,这就是其中的一个风格,叫做 TONE3,其实还有很多风格,下面是我从源码里面找出来的定义:

#: 普通风格,不带声调。如: 中国 -> ``zhong guo``
NORMAL = 0

#: 标准声调风格,拼音声调在韵母第一个字母上(默认风格)。如: 中国 -> ``zhōng guó``
TONE = 1

#: 声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``zho1ng guo2``
TONE2 = 2

#: 声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``zhong1 guo2``
TONE3 = 8

#: 声母风格,只返回各个拼音的声母部分(注:有的拼音没有声母,详见 `#27`_)。如: 中国 -> ``zh g``
INITIALS = 3

#: 首字母风格,只返回拼音的首字母部分。如: 中国 -> ``z g``
FIRST_LETTER = 4

#: 韵母风格,只返回各个拼音的韵母部分,不带声调。如: 中国 -> ``ong uo``
FINALS = 5

#: 标准韵母风格,带声调,声调在韵母第一个字母上。如:中国 -> ``ōng uó``
FINALS_TONE = 6

#: 韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``o1ng uo2``
FINALS_TONE2 = 7

#: 韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``ong1 uo2``
FINALS_TONE3 = 9

#: 注音风格,带声调,阴平(第一声)不标。如: 中国 -> ``ㄓㄨㄥ ㄍㄨㄛˊ``
BOPOMOFO = 10

#: 注音风格,仅首字母。如: 中国 -> ``ㄓ ㄍ``
BOPOMOFO_FIRST = 11

#: 汉语拼音与俄语字母对照风格,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``чжун1 го2``
CYRILLIC = 12

#: 汉语拼音与俄语字母对照风格,仅首字母。如: 中国 -> ``ч г``
CYRILLIC_FIRST = 13

lazy_pinyin与pinyin源码解析

为什么 pinyin 的方法默认带声调,而 lazy_pinyin 方法不带声调,答案就是:它们二者使用的默认风格不同,我们看下它的函数定义就知道了:

pinyin 方法的定义如下:

def pinyin(hans, style=Style.TONE, heteronym=False, errors='default', strict=True)

lazy_pinyin 方法的定义如下:

def lazy_pinyin(hans, style=Style.NORMAL, errors='default', strict=True)

pinyin 方法默认使用了 TONE 的风格,而 lazy_pinyin 方法默认使用了 NORMAL 的风格,所以就导致二者返回风格不同了。

特殊符号处理

默认不处理特殊符号,例如:

from pypinyin import lazy_pinyin
print(lazy_pinyin('你好♥,我是xxx'))

输出: ['ni', 'hao', '♥,', 'wo', 'shi', 'xxx']

以看到结果中星号和英文字符都作为一个整体并原模原样返回了

error源码如下

def _handle_nopinyin_char(chars, errors='default'):
    """处理没有拼音的字符"""
    if callable_check(errors):
        return errors(chars)
 
    if errors == 'default':
        return chars
    elif errors == 'ignore':
        return None
    elif errors == 'replace':
        if len(chars) > 1:
            return ''.join(text_type('%x' % ord(x)) for x in chars)
        else:
            return text_type('%x' % ord(chars))

比如我们想将不能转拼音的字符去掉,则可以这么设置:

from pypinyin import lazy_pinyin
print(lazy_pinyin('你好☆☆,我是xxx', errors='ignore'))

输出: ['ni', 'hao', 'wo', 'shi']

自定义处理,比如把 ☆ 转化为 ※ ,则可以这么设置:

from pypinyin import lazy_pinyin
print(lazy_pinyin('你好☆☆,我是xxx', errors=lambda item: ''.join(['※' if c == '☆' else c for c in item])))

# 输出: ['ni', 'hao', '※※,', 'wo', 'shi', 'xxx']

严格模式

strict 参数,这个参数用于控制处理声母和韵母时是否严格遵循 《汉语拼音方案》标准。

官文:

  • 21 个声母: b p m f d t n l g k h j q x zh ch sh r z c s ( y, w 不是声母 )
  • i行的韵母,前面没有声母的时候,写成yi(衣),ya(呀),ye(耶),yao(腰),you(忧),yan(烟), yin(因),yang(央),ying(英),yong(雍)。( y 不是声母 )
  • u行的韵母,前面没有声母的时候,写成wu(乌),wa(蛙),wo(窝),wai(歪),wei(威),wan(弯), wen(温),wang(汪),weng(翁)。( w 不是声母 )
  • ü行的韵母,前面没有声母的时候,写成yu(迂),yue(约),yuan(冤),yun(晕);ü上两点省略。 ( 韵母相关风格下还原正确的韵母 ü )
  • ü行的韵跟声母j,q,x拼的时候,写成ju(居),qu(区),xu(虚),ü上两点也省略; 但是跟声母n,l拼的时候,仍然写成nü(女),lü(吕)。( 韵母相关风格下还原正确的韵母 ü )
  • iou,uei,uen前面加声母的时候,写成iu,ui,un。例如niu(牛),gui(归),lun(论)。 ( 韵母相关风格下还原正确的韵母 iou,uei,uen )

当 strict 为 False 时就是不遵守上面的规则来处理声母和韵母, 比如: y , w 会被当做声母,yu(迂) 的韵母就是一般认为的 u 等

自定义拼音

如果对库返回的结果不满意,我们还可以自定义自己的拼音库,这里用到的方法就有 load_single_dict 和 load_phrases_dict 方法了。

比如上文看到 “朝阳” 两个字的发音默认返回的是 zhao yang,我们想默认返回 chao yang,那可以这么做

from pypinyin import lazy_pinyin, load_phrases_dict

print(lazy_pinyin('朝阳'))
personalized_dict = {
    '朝阳': [['cháo'], ['yáng']]
}
load_phrases_dict(personalized_dict)
print(lazy_pinyin('朝阳'))

# 输出:
 ['zhao', 'yang']
 ['chao', 'yang']

自定义样式

可以注册样式实现自定义,比如将某个拼音前面加上 Emoji 表情,样例:

from pypinyin.style import register
from pypinyin import lazy_pinyin


@register('kiss')
def kiss(pinyin, **kwargs):
    if pinyin == 'me':
        return f':kissing_heart:{pinyin}'
    return pinyin


print(lazy_pinyin('么么哒', style='kiss'))

# 输出: [':kissing_heart:me', ':kissing_heart:me', 'dá']
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值