跳转至

汉字转拼音(简码生成)

对比

pinyin

  • 不支持多音字

pypinyin

  • 根据词组智能匹配最正确的拼音。
  • 支持多音字。

  • 简单的繁体支持。

  • 支持多种不同拼音风格。

xpinyin

  • 不支持多音字

ChineseTone

  • 支持多音字
  • 判断是否为多音字
  • 获取拼音的声母部分
  • 获取某汉字的所有拼音

实现

ChineseTone在python3时打开文件需要加入encoding='utf-8

str = '重庆'

import pinyin
print(pinyin.get(str, format="strip", delimiter=" "))

from pypinyin import pinyin
import pypinyin

print(pinyin(str, style=pypinyin.NORMAL, heteronym=True))

from ChineseTone import *
print(PinyinHelper.convertToPinyinFromSentence(str, pinyinFormat=PinyinFormat.WITHOUT_TONE))

重庆:

zhong qing

[['chong'], ['qing']]

['chong', 'qing']

了解了:

le jie le

[['le', 'liao'], ['jie', 'xie'], ['le', 'liao']]

['liao', 'jie', 'le']

大夫:

da fu

[['da'], ['fu']]

['da', 'fu']

pypinyin和ChineseTone功能相近,暂用pypinyin,多次对比多音字pypinyin更为准确,但都会出错。

简码生成基础代码:

import itertools
import pypinyin
from pypinyin import pinyin

name = '重大殷乐01'

simple_code_list = pinyin(name, style=pypinyin.FIRST_LETTER, heteronym=True, errors='default')

for i in range(0, len(simple_code_list)-1):
    c = list(itertools.product(simple_code_list[i], simple_code_list[i+1]))
    d = []
    for j in c:
        d.append(''.join(j))
    simple_code_list[i+1] = d
    print(simple_code_list[i+1], len(simple_code_list[i+1]))

输出结果:

['zd', 'zt', 'cd', 'ct', 'td', 'tt'] 6

zd,zt,cd,ct,td,tt

['zdy', 'zty', 'cdy', 'cty', 'tdy', 'tty'] 6

zdy,zty,cdy,cty,tdy,tty

['zdyl', 'zdyy', 'ztyl', 'ztyy', 'cdyl', 'cdyy', 'ctyl', 'ctyy', 'tdyl', 'tdyy', 'ttyl', 'ttyy'] 12

zdyl,zdyy,ztyl,ztyy,cdyl,cdyy,ctyl,ctyy,tdyl,tdyy,ttyl,ttyy

['zdyl01', 'zdyy01', 'ztyl01', 'ztyy01', 'cdyl01', 'cdyy01', 'ctyl01', 'ctyy01', 'tdyl01', 'tdyy01', 'ttyl01', 'ttyy01'] 12

使用join 函数来拼接字符串:

print(','.join(simple_code_list[i+1]))

输出结果:zdyl01,zdyy01,ztyl01,ztyy01,cdyl01,cdyy01,ctyl01,ctyy01,tdyl01,tdyy01,ttyl01,ttyy01

print('_'.join(simple_code_list[i+1]))

输出结果:zdyl01_zdyy01_ztyl01_ztyy01_cdyl01_cdyy01_ctyl01_ctyy01_tdyl01_tdyy01_ttyl01_ttyy01

print(' '.join(simple_code_list[i+1]))

输出结果:zdyl01 zdyy01 ztyl01 ztyy01 cdyl01 cdyy01 ctyl01 ctyy01 tdyl01 tdyy01 ttyl01 ttyy01

使用split函数来拆分字符串:

c = ','.join(simple_code_list[i+1])
print(c.split(','), type(c.split(',')))

输出结果:['zdyl01', 'zdyy01', 'ztyl01', 'ztyy01', 'cdyl01', 'cdyy01', 'ctyl01', 'ctyy01', 'tdyl01', 'tdyy01', 'ttyl01', 'ttyy01']

c = ' '.join(simple_code_list[i+1])
print(c.split(' '), type(c.split(',')))

输出结果:['zdyl01', 'zdyy01', 'ztyl01', 'ztyy01', 'cdyl01', 'cdyy01', 'ctyl01', 'ctyy01', 'tdyl01', 'tdyy01', 'ttyl01', 'ttyy01']

整理完成的函数:

import itertools
import pypinyin
from pypinyin import pinyin

# 由汉字获取拼音简码字符串
# Receive ----------------------------------
# name: 汉字名称
# Return -----------------------------------
# 简码字符串 以 , 隔开
def brief_code(name=''):
    # 只获取首字母拼音 允许多音字 非汉字部分保留原始字符
    brief_codes = pinyin(name, style=pypinyin.FIRST_LETTER, heteronym=True, errors='default')

    for i in range(0, len(brief_codes) - 1):
        c = list(itertools.product(brief_codes[i], brief_codes[i + 1]))
        d = []
        for j in c:
            d.append(''.join(j))
            brief_codes[i + 1] = d
        if i == len(brief_codes) - 2:
            return ','.join(brief_codes[i + 1])
    return ''

print(brief_code('重大殷乐01'))

输出结果:zdyl01,zdyy01,ztyl01,ztyy01,cdyl01,cdyy01,ctyl01,ctyy01,tdyl01,tdyy01,ttyl01,ttyy01

https://www.biaodianfu.com/python-hanzi-to-pinyin.html