Python為文檔批量注音(生僻字歌詞為例)

抖音配樂--生僻字

首次聽到生僻字就是從抖音了,隨著生僻字配樂使用的人越來越多,很多人翻唱、模仿甚至有講解成語出處和寓意的段子,可謂百家爭鳴。
但,有一類視頻很不討喜,就是把歌詞用諧音字代替,好讓人一眼認識。
如果是那些哈韓哈日的朋友們,想唱歌但又沒有語言基礎(chǔ),那你配上諧音的字沒毛病。可歌詞中的成語和漢子就是老祖宗傳下來的文化,你卻用諧音字去讓自己容易辨識,不覺得臉紅嗎?
如果不認識,你可以查字典,找度娘,然后標注上拼音??!即娛樂又長知識了。
當然有人覺得這樣一個一個的查太麻煩,那是因為----你不會Python啊!
今天,我就來教教你們,怎么把文本內(nèi)容自動標注拼音。

Python的拼音模塊

Python的模塊庫API,每次進去習慣第一動作,就是右鍵翻譯為中文。(好羞愧,個人太愛國了,所以一直排斥學英語,好不要臉的借口...)可Python的拼音模塊不需要這么做,因為涉及拼音等模塊肯定和中文有關(guān)系,文檔自然是中文的嘍。
那么Python的拼音模塊是什么? pypinyin

  • 特性
    • 根據(jù)詞組智能匹配最正確的拼音。
    • 支持多音字。
    • 簡單的繁體支持, 注音支持。
    • 支持多種不同拼音/注音風格。
  • 安裝
    pip install pypinyin
  • 使用示例
>>> from pypinyin import pinyin, lazy_pinyin, Style
>>> pinyin('中心')
[['zhōng'], ['xīn']]
>>> pinyin('中心', heteronym=True)  # 啟用多音字模式
[['zhōng', 'zhòng'], ['xīn']]
>>> pinyin('中心', style=Style.FIRST_LETTER)  # 設(shè)置拼音風格
[['z'], ['x']]
>>> pinyin('中心', style=Style.TONE2, heteronym=True)
[['zho1ng', 'zho4ng'], ['xi1n']]
>>> pinyin('中心', style=Style.BOPOMOFO)  # 注音風格
[['ㄓㄨㄥ'], ['ㄒㄧㄣ']]
>>> pinyin('中心', style=Style.CYRILLIC)  # 俄語字母風格
[['чжун1'], ['синь1']]
>>> lazy_pinyin('中心')  # 不考慮多音字的情況
['zhong', 'xin']
# Python 3(Python 2 下把 '中心' 替換為 u'中心' 即可):

實現(xiàn)分析

起初想著,既然有了這個強大的拼音模塊,那么文本批量添加拼音,豈不是分分鐘的事情了嗎?然后,打臉接踵而來!
首先,要實現(xiàn)文字上一一對應的標注拼音,每個字與拼音的長度肯定不同,沒辦法對其。如果要對其,就得將文字進行拆分,字與字之間添加間距。有人說簡單啊,每個字的拼音最多不過6為,那我們使用列表解析式[i.just(6) for i in line]不就完了?
聽起來沒毛病,但是...

  • 歌詞也有語氣詞啊,這句Wu 又雙叒叕你直接按照字符串拆開成了什么鬼?
  • 一個中文在文本中占兩個字符的長度,如果對齊的話,還需要識別中文和英文字符!
  • 有效字符的辨識,Wu被認為是是個有效字段,模塊會對其進行合并

    pinyin('Wu 又雙叒叕') -->[['Wu '], ['yòu'], ['shuāng'], ['ruò'], ['zhuó']]

中文識別

本來考慮使用正則去判斷中文的,因為網(wǎng)上查到正則的匹配中文是[\u4e00-\u9fa5],簡單測試了下,貌似沒毛病
然后...代碼都快寫完了發(fā)現(xiàn)有些生僻字不再這個范圍內(nèi),我擦!

'\u4e00'<='生'<='\u9fa5'
True
'\u4e00'<='僻'<='\u9fa5'
True
'\u4e00'<='字'<='\u9fa5'
True
'\u4e00'<='?'<='\u9fa5'
False

生僻字果然沒那么好處理,但我這么追求完美的處女座大叔,怎么能容忍特例的出現(xiàn)呢?

解決辦法

針對正則匹配問題,深入去研究,就脫離了學Python的初衷,即便解決了也收獲甚微,不如換個思路。
utf-8字符編碼下,一個中文字符占3個字節(jié),但是字符的長度僅為1,那么解析中文的方式是否可以變通為:
len(bytes(str,'utf-8) == 3 and len(string) == 1)
關(guān)于文本書寫,我們判斷中文后,如果是漢字str.ljust(5),否則str.ljust(6)不就行了(因為一個漢字占兩個字符長度)。

代碼實現(xiàn)

# -*- coding: utf-8 -*-
# @Author  : 王翔
# @JianShu : 清風Python
# @Date    : 2019/5/18 22:53
# Software : PyCharm
# version: Python 3.6.8
# @File    : ChromePassword.py

from pypinyin import pinyin
import re


class ChangePinyin:
    def __init__(self, filename):
        self.file = filename
        self.lyric = self.read_file()
        self.pinyin = []

    def read_file(self):
        with open(self.file, encoding='utf-8') as f:
            return f.readlines()

    def write_file(self):
        with open('New_%s' % self.file, 'w', encoding='utf-8') as f:
            print(self.lyric)
            for line in self.lyric:
                # print(line)
                if line.strip() == '':
                    continue
                _new_line = re.sub(r'\s', '', line)
                # 行內(nèi)容轉(zhuǎn)拼音
                _pinyin = ''.join(map(lambda x: x[0].ljust(6), pinyin(_new_line)))
                # 根據(jù)中英文,將行內(nèi)容進行字符與漢字的拆分
                _lyric = self.split_words(_new_line)
                f.write('%s\n%s\n' % (_pinyin, _lyric))

    @staticmethod
    def split_words(words):
        word_list = ""
        tmp = ""
        for string in words:
            if len(bytes(string, 'utf-8')) == 3 and len(string) == 1:
                if tmp != '':
                    word_list += tmp.ljust(6)
                    tmp = ""
                word_list += string.ljust(5)
            else:
                tmp += string
        return word_list


if __name__ == '__main__':
    Main = ChangePinyin('lyric.txt')
    Main.write_file()

看看最后的實現(xiàn)效果吧,是不是格式很工整!


文本注音效果.gif

錄屏軟件為LICEcap
它是一款屏幕錄制工具,支持導出 GIF 動畫圖片格式,輕量級、使用簡單,錄制過程中可以隨意改變錄屏范圍。
好了,今天的內(nèi)容就到這里,希望大家喜歡,如果覺得文章有用,記得關(guān)注支持我啊。

?本文由簡書作者:清風Python 原創(chuàng) 如需轉(zhuǎn)載請注明
歡迎大家關(guān)注我的公眾號 清風Python

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,337評論 0 10
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,804評論 1 118
  • 經(jīng)過了幾天的陰雨連綿,北京難得晴天,早上下樓感受了陽光打在身上的溫暖,伴著一絲涼爽的風,秋天是真的來了。 站在公司...
    毛無名閱讀 207評論 0 0
  • 明天就要期末考試了,我很興奮。 今天我和媽媽一起復習了,我還想我明天會不會考雙百呢?今天的晚上媽媽幫我削好鉛筆,媽...
    豪達兄弟閱讀 236評論 0 0
  • 《阿甘正傳》,《肖申克的救贖》以及《燃情歲月》這三部老電影,是我心頭的最愛,百看不厭。巧的是,這三部電影都出自19...
    紫九九閱讀 1,204評論 4 4

友情鏈接更多精彩內(nèi)容