首页Python【Python计算生态】p...

【Python计算生态】pypinyin——汉字转拼音

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

pypinyin是一个用于将汉字转换为拼音的Python第三方库,可以用于汉字注音、排序、检索。具有以下特性:
  • 根据词组智能匹配最正确的拼音;
  • 支持多音字;
  • 简单的繁体支持,注音支持,威妥玛拼音支持;
  • 支持多种不同拼音/注音风格;
  • 允许用户加载自定义的词语拼音库,以满足特定场景下的需求。
直接使用pip安装:
pip install pypinyin
GitHub页面:
https://github.com/mozillazg/python-pinyin

02
使用

  • 1、基本使用:

pinyin()函数将汉字转换为拼音,返回的是一个二维列表,每个子列表对应一个汉字的拼音列表。

from pypinyin import pinyin

# 转换单个汉字
result_single = pinyin('中')
print(result_single)
# 输出:[['zhōng']]

# 转换多个汉字组成的词语
result_multi = pinyin('中心')
print(result_multi)
# 输出:[['zhōng'], ['xīn']]

使用lazy_pinyin()函数可以以懒加载的方式获取拼音,该函数返回的是一个一维列表,会忽略多音字的多种拼音情况,默认情况下会原样输出没有拼音的字符。

from pypinyin import lazy_pinyin

result = lazy_pinyin('中心')
print(result)
# 输出:['zhong', 'xin']


  • 2、指定拼音风格:

Style 类提供了多种预定义的拼音风格,通过指定不同的风格,可以得到不同格式的拼音输出:

  • Style.NORMAL:不带声调的拼音;
  • Style.TONE:带声调的拼音,声调以标调符号(ā, á, ǎ, à)形式呈现;
  • Style.TONE2:带声调的拼音,声调以数字形式放在韵母之后;
  • Style.TONE3:带声调的拼音,声调以数字形式放在拼音之后;
  • Style.INITIALS:只输出拼音的声母部分;
  • Style.FIRST_LETTER:只输出拼音的首字母;
  • Style.FINALS:只输出拼音的韵母部分,不带声调;
  • Style.FINALS_TONE:只输出拼音的韵母部分,且带标调符号的声调;
  • Style.FINALS_TONE2:只输出拼音的韵母部分,声调以数字形式放在韵母之后;
  • Style.FINALS_TONE3:只输出拼音的韵母部分,声调以数字形式放在韵母之后;
  • Style.BOPOMOFO:将汉字转换为注音符号形式,带声调;
  • Style.BOPOMOFO_FIRST:只输出注音符号的第一个字符;
  • Style.CYRILLIC:将汉字转换为西里尔字母(俄语字母)形式的拼音,带声调;
  • Style.CYRILLIC_FIRST:只输出西里尔字母形式拼音的第一个字符;
  • Style.WADEGILES:输出威妥玛拼音(一种旧式拼音系统)。
from pypinyin import pinyin, Style

# 不带声调的拼音
no_tone = pinyin('中国', style=Style.NORMAL)
print(no_tone)
# 输出:[['zhong'], ['guo']]

# 声调以数字形式放在拼音末尾
tone_number = pinyin('中国', style=Style.TONE2)
print(tone_number)
# 输出:[['zho1ng'], ['guo2']]


  • 3、处理多音字:

设置参数heteronym=True启用多音字模式,pinyin()函数会输出其所有可能的拼音。

from pypinyin import pinyin

# 启用多音字模式
result = pinyin('中心', heteronym=True)  
print(result)
# 输出:[['zhōng', 'zhòng'], ['xīn']]


  • 4、特殊情况:

lazy_pinyin()函数默认情况下无声调相关拼音风格下的结果会使用 v 表示 ü,可以通过参数 v_to_u=True 开启使用 ü 代替 v

print(lazy_pinyin('战略'))
# 输出:['zhan', 'lve']

print(lazy_pinyin('战略', v_to_u=True))  # 不使用 v 表示 ü
# 输出:['zhan', 'lüe']

默认情况下拼音结果不会标明哪个韵母是轻声,轻声的韵母没有声调或数字标识,可以通过参数neutral_tone_with_five=True开启使用5标识轻声。

在汉语拼音中,轻声是一种特殊的声调,发音时声音轻而短,没有固定的音高。轻声通常不标声调符号(即不标数字),但在某些拼音标注系统中,会用数字5来表示轻声。

# 默认情况
print(lazy_pinyin('衣裳', style=Style.TONE3))
# 输出:['yi1', 'shang']
print(pinyin('衣裳', style=Style.TONE3))
# 输出:[['yi1'], ['shang']]

# 使用 5 标识轻声
print(lazy_pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True))
# 输出:['yi1', 'shang5']
print(pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True))
# 输出:[['yi1'], ['shang5']]

可以通过参数 tone_sandhi=True 进行变调。

# 默认情况
print(lazy_pinyin('你好', style=Style.TONE2))
# 输出:['ni3', 'ha3o']

# 变调  nǐ hǎo -> ní hǎo
print(lazy_pinyin('你好', style=Style.TONE2, tone_sandhi=True))
# 输出:['ni2', 'ha3o']


  • 5、处理不包含拼音的字符:

当遇到不包含拼音的字符(串)时,函数会根据errors参数的值做相应的处理:

  • default(默认行为):不做任何处理,原样返回;

  • ignore:忽略该字符;

  • replace替换为去掉 u 的 unicode 编码;

  • callable对象:提供一个回调函数,接受无拼音字符(串)作为参数,支持的返回值类型可以是unicodelistNone。当返回值类型为list时,会自动expend list

# default
print(pinyin('你好☆☆'))
# 输出:[['nǐ'], ['hǎo'], ['☆☆']]

# ignore
print(pinyin('你好☆☆', errors='ignore'))
# 输出:[['nǐ'], ['hǎo']]

# replace
print(pinyin('你好☆☆', errors='replace'))
# 输出:[['nǐ'], ['hǎo'], ['26062606']]

# callable对象
print(pinyin('你好☆☆', errors=lambda x: 'star'))
# 输出:[['nǐ'], ['hǎo'], ['star']]
print(pinyin('你好☆☆', errors=lambda x: None))
# 输出:[['nǐ'], ['hǎo']]
print(pinyin('你好☆☆', errors=lambda x: ['star'for _ in x]))
# 输出:[['nǐ'], ['hǎo'], ['star'], ['star']]
print(pinyin('你好☆☆', heteronym=True, errors=lambda x: [['star''☆'for _ in x]))
# 输出:[['nǐ'], ['hǎo'], ['star', '☆'], ['star', '☆']]


  • 6、自定义拼音库:

如果对输出结果不满意,可以通过load_single_dict()load_phrases_dict()函数以自定义拼音库的方式修正结果。
使用load_phrases_dict()函数可以加载自定义的词语拼音字典,从而让 pypinyin()函数按照自定义的方式处理特定词语的拼音。
from pypinyin import lazy_pinyin, load_phrases_dict, Style, load_single_dict

hans = '桔子'
print(lazy_pinyin(hans, style=Style.TONE2))
# 输出:['ju2', 'zi']

# 增加 "桔子" 词组
load_phrases_dict({'桔子': [['jú'], ['zǐ']]})
print(lazy_pinyin(hans, style=Style.TONE2))
# 输出:['ju2', 'zi3']
hans = '还没'

print(lazy_pinyin(hans , style=Style.TONE2))
# 输出:['ha2i', 'me2i']

# 调整 "还" 字的拼音顺序或覆盖默认拼音
load_single_dict({ord('还'): 'huán,hái'})  
print(lazy_pinyin(hans , style=Style.TONE2))
# 输出:['hua2n', 'me2i']

或者使用pypinyin-dict项目提供的自定义拼音库来纠正结果(需要通过pip安装pip install pypinyin-dict):

print(pinyin('扔', heteronym=True))
# 输出:[['rēng', 'rèng']]

# 使用 pinyin-data 项目中 cc_cedict.txt 文件中的拼音数据优化结果
from pypinyin_dict.pinyin_data import kxhc1983
kxhc1983.load()

print(pinyin('扔', heteronym=True))
# 输出:[['rēng']]


  • 7、自定义拼音风格:

可以通过register()来实现自定义拼音风格的需求:

from pypinyin import lazy_pinyin
from pypinyin.style import register

@register('kiss')
def kiss(pinyin, **kwargs):     # 必须包含 **kwargs 用于接收未来新增的关键字参数
    return f'😘 {pinyin}'

lazy_pinyin('么么', style='kiss')
# 输出:['😘 me', '😘 me']


  • 8、strict参数的影响:

strict参数用于控制处理声母和韵母时是否严格遵循《汉语拼音方案》标准。当strict=False时就是不遵守上面的规则来处理声母和韵母,比如y, w会被当做声母,yu(迂) 的韵母就是一般认为的 u 等。

from pypinyin import Style, lazy_pinyin

print(lazy_pinyin('乌', style=Style.TONE))
# 输出:['wū']
print(lazy_pinyin('乌', style=Style.INITIALS))
# 输出:['']
print(lazy_pinyin('乌', style=Style.INITIALS, strict=False))
# 输出:['w']
print(lazy_pinyin('迂', style=Style.TONE))
# 输出:['yū']
print(lazy_pinyin('迂', style=Style.FINALS_TONE))
# 输出:['ǖ']
print(lazy_pinyin('迂', style=Style.FINALS_TONE, strict=False))
# 输出:['ū']


  • 9、slug()函数:

slug()函数的主要功能是将输入的汉字字符串转换为拼音字符串,并且可以根据指定的分隔符将每个汉字的拼音连接起来,常用于生成友好的URL或文件名等场景。

该函数接收两个主要参数:

  • 第一个参数是需要转换为拼音的汉字字符串,该函数会遍历该字符串中的每个汉字,将其转换为拼音。

  • 第二个参数separator是可选参数,用于指定拼音之间的分隔符,默认分隔符是“-“

from pypinyin import slug

result = slug("你好世界", separator="-")
print(result)
# 输出: 'ni-hao-shi-jie'


更多内容可以前往官方文档查看:

https://pypinyin.readthedocs.io/

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments