中文转拼音及其他需求

日常工作中,有涉及到单个字,词语,句子等文本转成拼音,且有时带声调的拼音文本做数据分析时不太好处理,遂当前有个需求: 批量将文本转换为拼音,且声调转成数字,数字放在单个字拼音后
1、先处理文本转拼音,拼音声调转成数字,数字放在拼音串后面
如:练习 —————》 lian4 xi2
本次主要将网上学习代码结合自己实际需求做整理
①常用的文本转拼音用 pypinyin这个库,具体代码为:

#coding:utf-8
import pypinyin
import re
from string import digits

def ConvertToneNumbersPinyin(lineIn):
    mapVowelTone2Unicode = {'a1': 'ā',
                        'a2': 'á',
                        'a3': 'ǎ',
                        'a4': 'à',
                        'e1': 'ē',
                        'e2': 'é',
                        'e3': 'ě',
                        'e4': 'è',
                        'i1': 'ī',
                        'i2': 'í',
                        'i3': 'ǐ',
                        'i4': 'ì',
                        'o1': 'ō',
                        'o2': 'ó',
                        'o3': 'ǒ',
                        'o4': 'ò',
                        'u1': 'ū',
                        'u2': 'ú',
                        'u3': 'ǔ',
                        'u4': 'ù',
                        'v1': 'ǜ',
                        'v2': 'ǘ',
                        'v3': 'ǚ',
                        'v4': 'ǜ',
                       }
    assert type(lineIn) is str
    lineOut = lineIn
    # mapVowelTone2Unicode
    for x, y in mapVowelTone2Unicode.items():
      lineOut = lineOut.replace(y, x).replace(y.upper(), x.upper())
    return lineOut.replace('Ü', 'V').replace('ü', 'v')

def convertDigit(word):
    #中文转换为拼音
    s = ''
    for i in pypinyin.pinyin(word,heteronym=True):
        s = s+''.join(i) + " "

    #拼音声调转数字
    result = ConvertToneNumbersPinyin(s)

    #声调数字放拼音后
    result2=result.split()
    value = ''
    for i in result2:
        if bool(re.search(r'\d',i)) is True:
            aa = re.sub("\D","",i)
        else:
            pass
        bb=i.translate(str.maketrans("","",digits))
        dd = bb + aa
        value += ' '+dd
    print(value)

if __name__ == "__main__":
    convertDigit("练习")

测试“练习”这个词语的拼音效果


image.png

看来是成功的。
2、批量处理数据,将待转的文本放在excel表中,通过读取表中数据,将测试结果写入表中对应列
本次读写excel文件用的传统的库:xlrd,xlwt ,后续建议使用openpyxl,处理数据量比较大的文件时,优势更明显点。
我的表是这样的:


image.png
import xlrd,xlwt,os
    #读取excel
    excel_path = r'F:\TestScript\待转拼音文本.xlsx'
    old_excel = xlrd.open_workbook(excel_path)
    old_sheet = old_excel.sheet_by_index(0)
    #读取第2列数据
    TxtResult = old_sheet.col_values(1)

后面就是将处理好的结果放到excel表中
处理完结果:


image.png

贴上完整的代码:

#encoding:utf-8
import pypinyin
import re
from string import digits
import xlrd,xlwt,os

def ConvertToneNumbersPinyin(lineIn):
    mapVowelTone2Unicode = {'a1': 'ā',
                        'a2': 'á',
                        'a3': 'ǎ',
                        'a4': 'à',
                        'e1': 'ē',
                        'e2': 'é',
                        'e3': 'ě',
                        'e4': 'è',
                        'i1': 'ī',
                        'i2': 'í',
                        'i3': 'ǐ',
                        'i4': 'ì',
                        'o1': 'ō',
                        'o2': 'ó',
                        'o3': 'ǒ',
                        'o4': 'ò',
                        'u1': 'ū',
                        'u2': 'ú',
                        'u3': 'ǔ',
                        'u4': 'ù',
                        'v1': 'ǜ',
                        'v2': 'ǘ',
                        'v3': 'ǚ',
                        'v4': 'ǜ',
                       }
    assert type(lineIn) is str
    lineOut = lineIn
    # mapVowelTone2Unicode
    for x, y in mapVowelTone2Unicode.items():
      lineOut = lineOut.replace(y, x).replace(y.upper(), x.upper())
    return lineOut.replace('Ü', 'V').replace('ü', 'v')

def convertDigit(word):
    #中文转换为拼音
    s = ''
    for i in pypinyin.pinyin(word,heteronym=True):
        s = s+''.join(i) + " "
    #拼音声调转数字
    result = ConvertToneNumbersPinyin(s)
    #声调数字放拼音后
    result2=result.split()
    value = ''
    for i in result2:
        global aa,bb,dd
        if bool(re.search(r'\d',i)) is True:
            aa = re.sub("\D","",i)
        else:
            pass
        bb=i.translate(str.maketrans("","",digits))
        dd = bb + aa
        value += ' '+dd
    return value

def readExcel():
    #读取excel
    excel_path = r'F:\TestScript\待转拼音文本.xlsx'
    old_excel = xlrd.open_workbook(excel_path)
    old_sheet = old_excel.sheet_by_index(0)

    #读取第2列数据
    TxtResult = old_sheet.col_values(1)
    #新建表格保存数据
    new_workbook = xlwt.Workbook()
    new_sheet = new_workbook.add_sheet('拼音识别')
    new_sheet.write(0,0,'编号')
    new_sheet.write(0,1,'待识别文本')
    new_sheet.write(0,2,'拼音文本')

    for i in range(1,len(TxtResult)):
        pinResult = convertDigit(TxtResult[i])
        print(TxtResult[i],pinResult)
        if TxtResult[i] is None or TxtResult[i] == 'null':
            continue
        else:
            new_sheet.write(i,0,i)
            new_sheet.write(i,1,TxtResult[i])
            new_sheet.write(i,2,pinResult)

    new_workbook.save(r'F:\TestScript\转换结果.xlsx')
    print('已完成')
    os.system('pause')
if __name__ == "__main__":
    readExcel()

目前问题:因为汉字有多音字,pypinyin这个库会将单个字的所有读音都会返回,若想根据字词语境选择合适读音,可能需要找其他的库,或者其他处理方式。
本次主要还是分享中文转拼音,声调转数字,数字放拼音串后面。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354