2022年 11月 4日

Python中拼音库PyPinyin的使用

PyPinyin库是一个支持中文转拼音输出的Python第三方库,它可以根据词组智能匹配最正确的拼音,并且支持多音字,简单的繁体, 注音,多种不同拼音/注音风格的转换。

目录

PyPinyin库的安装与引用

安装

引用

PyPinyin库的使用

pypin方法

lazy_pinyin方法

PyPinyin库的风格转换 

PyPyin库的错误处理 

errors = ignore

errors = lambda item:

自定义拼音


PyPinyin库的安装与引用

安装

可以在cmd下输入:

pip install pypinyin

在pycharm中:

打开 settings(设置),打开 Project Interpreter ,点击 + 号,搜索 pypinyin ,install Package即可

引用

本库的引用需要具体引入第三方库中的具体方法才能更有效的使用本库,如果不理解,可以参考本篇第二节PyPinyin库的使用

import pypinyin

PyPinyin库的使用

pypin方法

结果会是一个二维的列表,每个元素都另外成了一个列表,其中包含了每个字的读音( pinyin 方法默认使用了 TONE 的风格,即有声调的风格模式

def pinyin(hans, style=Style.TONE, heteronym=False, errors='default', strict=True)
  1. from pypinyin import pinyin
  2. print(pinyin("七月"))
  3. >>> [['qī'], ['yuè']]

如果这个词是多音词,需添加 heteronym 参数并设置为 True 

这里的多音词并不是指单个字的多音字,而是这个词语本身就有两种读音

  1. from pypinyin import pinyin
  2. print(pinyin('朝阳', heteronym=True))
  3. >>> [['zhāo', 'cháo'], ['yáng']]
  4. # 这里的多音词并不是指单个字的多音字,而是这个词语本身就有两种读音
  5. print(pinyin('大夫', heteronym=True))
  6. >>> [['dài'], ['fū']]
  7. # 此处就不会输出“da” 因为大夫只有一个读法

通过这个例子,我们也明白了结果为什么是一个二维列表,因为里面的一维的结果可能是多个,比如多音字的情况

lazy_pinyin方法

有没有一个方法直接给我们一个一维列表呢,我们可以使用 lazy_pinyin 方法来实现(lazy_pinyin 方法默认使用了 NORMAL,即无声调的风格模式

def lazy_pinyin(hans, style=Style.NORMAL, errors='default', strict=True)
  1. from pypinyin import lazy_pinyin
  2. print(lazy_pinyin('四月是你的谎言'))
  3. >>> ['si', 'yue', 'shi', 'ni', 'de', 'huang', 'yan']

PyPinyin库的风格转换 

我们可以对结果进行一些风格转换,比如不带声调风格、标准声调风格、声调在拼音之后、声调在韵母之后、注音风格等等

  1. from pypinyin import lazy_pinyin, Style
  2. print(lazy_pinyin('四月是你的谎言',style = Style.TONE3))
  3. >>> ['si4', 'yue4', 'shi4', 'ni3', 'de', 'huang3', 'yan2']

可以看到运行结果每个拼音后面就多了一个声调,这就是其中的一个风格,叫做 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

PyPyin库的错误处理 

如果我们输入的语句中,有无法转换成拼音的字符存在,我们就会引入PyPinyin库自带的errors参数

  1. print(lazy_pinyin('今天☀明媚!'))
  2. >>> ['jin', 'tian', '☀', 'ming', 'mei', '!']

当处理没有拼音的字符的时候,errors 的不同参数会有不同的处理结果

errors = ignore

将不能转拼音的字符去掉

  1. from pypinyin import lazy_pinyin
  2. print(lazy_pinyin('今天☀明媚!', errors = 'ignore'))
  3. >>> ['jin', 'tian', 'ming', 'mei']

errors = lambda item:

把特定符号转换成指定字符

  1. from pypinyin import lazy_pinyin
  2. print(lazy_pinyin('今天☀明媚!', errors=lambda item: ''.join(['*' if i == '☀' else i for i in item])))
  3. >>> ['jin', 'tian', '*', 'ming', 'mei', '!']

自定义拼音

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

load_single_dict 和 load_phrases_dict 

  1. from pypinyin import lazy_pinyin, load_phrases_dict
  2. print(lazy_pinyin('大夫'))
  3. personalized_dict = {
  4. '大夫': [['da'], ['fu']]
  5. }
  6. load_phrases_dict(personalized_dict)
  7. print(lazy_pinyin('大夫'))
  8. >>> ['dai', 'fu']
  9. >>> ['da', 'fu']

我们自定义了一个词典,然后使用 load_phrases_dict 方法设置了一下就可以了

另外我们还可以注册样式实现自定义

  1. from pypinyin.style import register
  2. from pypinyin import lazy_pinyin
  3. @register('change')
  4. def change(pinyin, **kwargs):
  5. if pinyin == 'tiān':
  6. return f':☀:{pinyin}'
  7. return pinyin
  8. print(lazy_pinyin('天天向上', style='change'))
  9. >>> [':☀:tiān', ':☀:tiān', 'xiàng', 'shàng']

这里我们调用 register 方法注册了一个样式 style,然后转换的时候指定即可使用