pinyin去掉聲調

拼音表達方式多種多言,有Unicode的符號音調,也有數字音調,通常我們需要在各種格式間相互轉換。我們舉個簡單的例子做個轉換。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# map vowel-number combination to unicode
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': 'ǜ',
                       }

# map unicode to vowel-number combination
mapVowelUnicode2Tone = {'ā': 'a1',
                        'á': 'a2',
                        'ǎ': 'a3',
                        'à': 'a4',
                        'ē': 'e1',
                        'é': 'e2',
                        'ě': 'e3',
                        'è': 'e4',
                        'ī': 'i1',
                        'í': 'i2',
                        'ǐ': 'i3',
                        'ì': 'i4',
                        'ō': 'o1',
                        'ó': 'o2',
                        'ǒ': 'o3',
                        'ò': 'o4',
                        'ū': 'u1',
                        'ú': 'u2',
                        'ǔ': 'u3',
                        'ù': 'u4',
                        'ǖ': 'v1',
                        'ǘ': 'v2',
                        'ǚ': 'v3',
                        'ǜ': 'v4',
                       }

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

def ParsePinyin(iFilename, oFilename):
    wordList = []
    with open(iFilename, 'r') as fileReader:
        # read out useless information
        fileReader.readline()
        fileReader.readline()
    
        # read and parse pinyin
        while True:
            line = fileReader.readline()
            if not line:
                break
            uPinyin = line.split()[1]
            for vPinyin in uPinyin.split(','):
                for x, y in mapVowelUnicode2WithoutTone.items():
                    vPinyin = vPinyin.replace(x, y).replace(x.upper(), y.upper())
                    vPinyin = vPinyin.replace('Ü', 'V').replace('ü', 'v')
                if wordList.count(vPinyin) == 0:
                    wordList.append(vPinyin)
                print(uPinyin + " " + vPinyin)

    # write word list to file
    with open(oFilename, 'w') as fileWriter:
        for pinyin in wordList:
            fileWriter.write(pinyin)
            fileWriter.write('\n')

# parse pinyin file to remove tone information
ParsePinyin("pinyin.txt", "pinyin_dict.txt")

輸入文件“pinyin.txt”可以從https://github.com/mozillazg/pinyin-data下載,代碼中的處理是希望把所有的tone信息去掉。

這裏去掉tone是爲了匹配用戶輸入的pinyin,然後進行切詞。用戶輸入的時候一般pinyin不會帶聲調,這是不需要tone的拼音的一個應用場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章