作为一个南方人,拼音没学好那似乎已是一件非常正常的事。什么卷舌音、鼻音,也只有在近几年才算是分清了一部分。但尴尬的事情仍在继续,发短信的时候,总有些字拼得不准;说话的时候,总有些字没有卷舌、或忘了加鼻音……痛定思痛,于是有了一个用SuperMemo来强化拼音的训练方案。

要实现这个方案,得具备两个条件,一是选定汉字范围——舍得选的是一级国标汉字,共计3700余个;二是利用程序将这些汉字转化为拼音,要求拼音带上音调,这个就需要对转换精灵进行适度的改造。

舍得以HzqGhost(小强)童鞋的代码为蓝本,进行了如下的改造: 编码部分采用这份码表:下载地址

源代码为python2.x的,改造为python 3.x;

在给韵母添加声调的部分代码,原代码有个别地方出现错误,在我家傻妹的提醒下,舍得修复了这一错误;

下面是相关的部分代码,分段描述:

1、读入码表文件,转成dict: fileName = './Mandarin.dat'

self.dict = {}

for line in open(fileName):

k, v = line.split(' ')

self.dict[k] = v

2、然后对传入的中文字符串进行处理:

self.yunmu = ( 'ang','eng','ing','ong','an','en','in','un','ai','ei','ao','ou','iu','er','en','a','o','e','i','u', 'v')

self.sheng = {'a':'ā á ǎ à','o':'ō ó ǒ ò','e':'ē é ě è','i':'ī í ǐ ì','u':'ū ú ǔ ù', 'v':'ǖ ǘ ǚ ǜ'}

result = []

for char in chars:#chars为传入的中文字符串

key = "%X" % ord(char)#将汉字转为utf16编码,“码表”文件中用的是这个编码

try:

py = self.dict[key].split("")[0].strip().lower()#只取查到的拼音第一个值(当有多音字的时候),同时将结果转为小写

for ym in self.yunmu:

if re.search(ym, py):#匹配

py = getPy(py, ym)

break#只取第一个结果

result.append(py)

except:

result.append(char)

return "".join(result)

原来的self.yunmu设置不合理,在碰到'ui','iu','ie','ue'四个韵母时,音调会标在第一个字母上,舍得在元组中去除了'ui','ie','ue'这三个值,这样在匹配时根据a,o,e,i,u的顺序,这三个韵母的音调才会落在第二个字母上。而对于'iu'这个韵母,则需在下面的getPy里作一个特殊的处理:

3、给匹配到的韵母标上音调:

def getPy(py, ym):

t = py[-1:].encode('ascii','ignore')#"码表’中返回的拼音字符串最后一位是数字,表示音调值

t2 = "%d" % ord(t)

t3 = (int(t2) - 48)%4 -1

py2 = py[:-len(ym)-1]#声母

if ym == "iu":#如果韵母是iu

letter = self.sheng[ym[1]].split(' ')[t3]#音调字母要标在u上

ym = ym[0] + letter

else:

letter = self.sheng[ym[0]].split(' ')[t3]#其它情况,音调标在第一个字母上

ym = letter + ym[1:]

py = py2 + ym

return py

最终完整的代码如下:

def cnCode(self, chars):

def getPy(py, ym):

t = py[-1:].encode('ascii','ignore')#"码表’中返回的拼音字符串最后一位是数字,表示音调值

t2 = "%d" % ord(t)

t3 = (int(t2) - 48)%4 -1

py2 = py[:-len(ym)-1]#声母

if ym == "iu":#如果韵母是iu

letter = self.sheng[ym[1]].split(' ')[t3]#音调字母要标在u上

ym = ym[0] + letter

else:

letter = self.sheng[ym[0]].split(' ')[t3]#其它情况,音调标在第一个字母上

ym = letter + ym[1:]

py = py2 + ym

return py

fileName = './Mandarin.dat'

self.dict = {}

for line in open(fileName):

k, v = line.split(' ')

self.dict[k] = v

self.yunmu = ( 'ang','eng','ing','ong','an','en','in','un','ai','ei','ao','ou','iu','er','en','a','o','e','i','u', 'v')

self.sheng = {'a':'ā á ǎ à','o':'ō ó ǒ ò','e':'ē é ě è','i':'ī í ǐ ì','u':'ū ú ǔ ù', 'v':'ǖ ǘ ǚ ǜ'}

result = []

for char in chars:#chars为传入的中文字符串

key = "%X" % ord(char)#将汉字转为utf16编码,“码表”文件中用的是这个编码

try:

py = self.dict[key].split("")[0].strip().lower()#只取查到的拼音第一个值(当有多音字的时候),同时将结果转为小写

for ym in self.yunmu:

if re.search(ym, py):#匹配

py = getPy(py, ym)

break#只取第一个结果

result.append(py)

except:

result.append(char)

return "".join(result)

调用的时候,只要这样就可以了:

chars = "舍得英语魔法学苑"

print(self.cnCode(chars))

返回的结果如下图所示:

不过舍得通常会读取当前文本,然后按换行符分割,再逐个传入,得到拼音,最后拼成TAB文本,这样就可以利用转换精灵制作成课程了。这里边的细节就不再一一叙述了。

附上最终完成的课程:

本文版权归舍得英语魔法学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:舍得首发:舍得@学习力博客

python拼音怎么写-[编程心得]用Python给汉字加上带音调的拼音相关推荐

  1. python 中文转带音调的拼音

    python 中文转带音调的拼音 前言 python 中文转带音调的拼音 1. 1.1 安装pinyin模块 1.2 试验 1.3 效果图 1.4 代码实现 前言 今天整理中药材,每个药材上标上带音调 ...

  2. python在哪里写编程_Python编程入门介绍

    编程-就是让计算机代为解决某个问题,对某个计算体系规定一定的计算方式,使计算体系按照计算方式运行,并最重得到结果的过程. 编程的语言有很多种,比如Python,JAVA,JavaScript,c++, ...

  3. python大神-Python代码怎么写,听听顶尖Python大神的建议

    了解K神( kennethreitz)是从它牛逼的requests库开始,号称最顶尖的Python程序员之一.大神有很多作品,而且还有一个非常励志的传奇故事,从一个胖胖的不修边幅的码农,励志减肥而变成 ...

  4. python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码

    文件名大小更新时间 <PYTHON QT GUI快速编程 PYQT编程指南>源码\chap01\answers.txt9882007-06-27 <PYTHON QT GUI快速编程 ...

  5. python拼音怎么写-【学习】python 汉语转拼音

    一.pypinyin 概述 Python 中提供了汉字转拼音的库,名字叫做 PyPinyin,可以用于汉字注音.排序.检索等等场合,是基于 hotto/pinyin 这个库开发的,一些站点链接如下: ...

  6. python编程心得体会-python核心编程____学习心得____part1

    字符编码的发展; 二进制: -->ASCII :只能存英文和拉丁字符,一个字符占一个字节,8位. ----->gb2312: 只能存6700多个中文,1980 ------------&g ...

  7. 学python怎么赚钱-有编程基础学python怎么赚点小钱?

    800左右算是要求很低了,光一项爬虫,做好开发抓一些新闻证券的信息基本上月入就3-5k了.渠道自己可以去淘宝上找,或者让是猪八戒找一些兼职.具体的下文说,这是之前回答过的一个问题:python精通后能 ...

  8. python数字计算公式_Python编程5:Python中的数字和数学运算

    #少儿编程# 小朋友们应该都玩过计算器,用计算器做算术,不论数字多大,它都能迅速的给出答案.而计算机不仅计算的更快,还能做更复杂的计算.计算机非常善于计算,它每秒能执行10亿次的计算. Python中 ...

  9. python剔除数字 青少年编程电子学会python编程等级考试二级真题解析2020年12月

    目录 python剔除数字 一.题目要求 1.编程实现 2.输入输出 3.评分标准

最新文章

  1. MIT联合波士顿咨询:全球21个行业,对话3000名高管,AI如何重塑商业形态? | 雷报
  2. Ex 5_33 实现一个关于公式长度(其中所有文字总的出现次数)为线性时间的Horn公式可满足性问题_第十次作业...
  3. 大厂动态规划面试汇总,提升内功
  4. iOS 动画系列之动画解释
  5. 28、shareSDK分享以及 QQ应用平台申请遇到的问题
  6. 解决2次查询User的问题(ThreadLocal)
  7. 16个简单实用的.htaccess技巧
  8. POJ1321(深搜)
  9. 浅析Thinkphp框架中运用phprpc扩展模式
  10. 【“elabsim”高频电子线路实验】得到输出峰峰值幅度为200mV、频率为10.7MHz正弦波信号
  11. 什么是CMMI能力成熟度模型?企业为什么要做?
  12. 2019年第十二届中国大学生计算机设计大赛总结
  13. 伺服电机抖动原因分析
  14. java jdom2_JDOM 生成和解析XML(二)
  15. PHP字符串函数strrchr(查找指定字符在字符串中的最后一次出现)
  16. iptables和防火墙_iptables的防火墙正常运行时间和安全性
  17. 猜数字游戏(c语言实现)
  18. UNIAPP nvue 地图 markers 不显示
  19. 企业上云,安全合规如何进阶 ——一文拆解亚马逊云科技云安全理念与实践
  20. 炒鸡福利:买云服务送智能摄像头

热门文章

  1. 初学5之坦克要求(做出坦克被子弹击中时的爆炸效果)
  2. 多可文档管理软件权限说明(4)——权限累加规则
  3. python 打印乘法表各种形式_Python使用while循环花式打印乘法表
  4. Qt::Key键盘按键说明
  5. 鲲鹏Arm64 openEuler 虚拟机学习
  6. 自动控制原理02 数学模型
  7. python自动产品分类_商品分类(一堆多)
  8. android手机设置固定dns,手机dns怎么设置 简单几步就搞定
  9. 盘点2011年的网络流行语
  10. 反距离加权matlab算法,ImageWarping变形算法研究---反距离加权插值(IDW)