Dec
13
Python: 汉字转拼音(带声调)
这事儿其实只要有了拼音库,就挺简单的。我从 pinyin4j 这个项目里搞了一份出来。虽然这个库是为java写的,不过要提取倒是相当简单:到这里 下载pinyin4j-2.5.0.zip,解压得到里头的 lib/pinyin4j-2.5.0.jar ,再解压得到里头的 pinyindb/unicode_to_hanyu_pinyin.txt 。
这个文件的结构很简单,每一行的基本结构是这样的:
前面的 4E04 是汉字的Unicode编码,空格分隔,然后括号里面包含了所有读音(而且看起来像是按频率排序好了的),每个读音分别给出了拼音的声母韵母以及声调。
在这个基础上解析它就相当简单了。
当然,你也可以把它存入一个key/value数据库(memcachedb什么的就挺好)。以上面的例子的话,把一个字符串中的汉字转换成拼音就很简单了:
要注意的一点是,“驴”的拼音被标记为 lu:2 ,而不是打字时习惯使用的 lv ,如果有需要的,还得再加个简单的转换逻辑。
实际上这个库里头还支持通用拼音(貌似是台湾地区使用过的)等其他转换方式,有需要的同学可以自己考据一下其结构。
p.s. 在python里头可以用 unichr(0x4E04) 得到这个unicode对应的字符,也可以用 ord('率'.decode('utf-8')) 得到这个字符的unicode编码(注意替换字符的原始编码)。至于十进制和十六进制的转换,也很简单, hex(32768) 得到 '0x8000' 而int('0x8000', 16)就能得到32768。python真好用。
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
这个文件的结构很简单,每一行的基本结构是这样的:
引用
4E04 (shang4,shang3)
前面的 4E04 是汉字的Unicode编码,空格分隔,然后括号里面包含了所有读音(而且看起来像是按频率排序好了的),每个读音分别给出了拼音的声母韵母以及声调。
在这个基础上解析它就相当简单了。
f = open("unicode_to_hanyu_pinyin.txt", "r")
py = {}
for l in f:
l = l.strip() #行末回车
key, val = l.split(' ')
sd = val[1:-1].replace('u:', 'v').split(',') #去掉左右括号,把u:转为v(驴 lv),然后按逗号分隔
arr_sd = []
for i in sd:
arr_sd.append({'py': i[0:-1], 'tone': i[-1]}) #把每个读音的声调分离出来
py[int(key, 16)] = arr_sd #把unicode编码转成10进制作为key
f.close()
py = {}
for l in f:
l = l.strip() #行末回车
key, val = l.split(' ')
sd = val[1:-1].replace('u:', 'v').split(',') #去掉左右括号,把u:转为v(驴 lv),然后按逗号分隔
arr_sd = []
for i in sd:
arr_sd.append({'py': i[0:-1], 'tone': i[-1]}) #把每个读音的声调分离出来
py[int(key, 16)] = arr_sd #把unicode编码转成10进制作为key
f.close()
当然,你也可以把它存入一个key/value数据库(memcachedb什么的就挺好)。以上面的例子的话,把一个字符串中的汉字转换成拼音就很简单了:
def convert(str, encoding = 'utf-8'):
ret = ''
for i in str.decode(encoding):
w = ord(i)
if py.has_key(w):
ret += "%s-%s " % (py[w][0]['py'] , py[w][0]['tone'])
else:
ret += i
return ret
ret = ''
for i in str.decode(encoding):
w = ord(i)
if py.has_key(w):
ret += "%s-%s " % (py[w][0]['py'] , py[w][0]['tone'])
else:
ret += i
return ret
要注意的一点是,“驴”的拼音被标记为 lu:2 ,而不是打字时习惯使用的 lv ,如果有需要的,还得再加个简单的转换逻辑。
实际上这个库里头还支持通用拼音(貌似是台湾地区使用过的)等其他转换方式,有需要的同学可以自己考据一下其结构。
p.s. 在python里头可以用 unichr(0x4E04) 得到这个unicode对应的字符,也可以用 ord('率'.decode('utf-8')) 得到这个字符的unicode编码(注意替换字符的原始编码)。至于十进制和十六进制的转换,也很简单, hex(32768) 得到 '0x8000' 而int('0x8000', 16)就能得到32768。python真好用。
欢迎扫码关注:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
哈哈
2015-12-14 15:22
师兄真的是啥都做,Holy High!!!!!
felix021 回复于 2015-12-14 15:40
三年前的东西都被你翻出来了。。
分页: 1/1 1