如何使用Python為生僻字批量注音

      網友投稿 886 2025-03-31

      裝13的冷場

      “龍生九子,各不相同…”

      囚牛、睚眥、嘲風、蒲牢、狻猊、霸下、狴犴、負屃、螭吻。

      都說提筆忘字丟人,可至少還有提筆的機會。隨著信息化時代的普及,原來越多的人成了半文盲。怎么說?電腦前打字敲的一二一,可提起筆來就忘字。從前特別喜歡鋼筆,筆袋里放的凌美、百利、永生、英雄一堆,買的北碳、畢加索、派克、百利金各式牌子的墨水。結果感覺半年多都沒動過這些陳年老貨了。

      下午聊天裝13說到龍生九子,本來吹得正歡,結果朋友問老七 bì àn怎么寫,然后…瞬間懵逼了,這個13裝的有點冷場啊。

      最近項目有些忙,晚上構思該寫點什么。想到下午的尷尬,決定發一篇之前寫的Python為生僻字歌詞注音的文章。

      抖音配樂—生僻字

      首次聽到生僻字就是從抖音了,隨著生僻字配樂使用的人越來越多,很多人翻唱、模仿甚至有講解成語出處和寓意的段子,可謂百家爭鳴。

      但,有一類視頻很不討喜,就是把歌詞用諧音字代替,好讓人一眼認識。

      如果是那些哈韓哈日的朋友們,想唱歌但又沒有語言基礎,那你配上諧音的字沒毛病。可歌詞中的成語和漢字就是老祖宗傳下來的文化,你卻用諧音字去讓自己容易辨識,不覺得臉紅嗎?

      如果不認識,你可以查字典,找度娘,然后標注上拼音啊!即娛樂又長知識了。

      當然有人覺得這樣一個一個的查太麻煩,那是因為——你不會Python啊!

      今天,我就來教教你們,怎么把文本內容自動標注拼音。

      Python的拼音模塊

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

      那么Python的拼音模塊是什么? pypinyin

      特性

      根據詞組智能匹配最正確的拼音。

      支持多音字。

      簡單的繁體支持, 注音支持。

      支持多種不同拼音/注音風格。

      安裝

      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) ?# 設置拼音風格

      [['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'中心' 即可):

      實現分析

      起初想著,既然有了這個強大的拼音模塊,那么文本批量添加拼音,豈不是分分鐘的事情了嗎?然后,打臉接踵而來!

      首先,要實現文字上一一對應的標注拼音,每個字與拼音的長度肯定不同,沒辦法對其。如果要對其,就得將文字進行拆分,字與字之間添加間距。有人說簡單啊,每個字的拼音最多不過6位,那我們使用列表解析式[i.just(6) for i in line]不就完了?

      聽起來沒毛病,但是…

      歌詞也有語氣詞啊,這句Wu 又雙叒叕你直接按照字符串拆開成了什么鬼

      一個中文在文本中占兩個字符的長度,如果對齊的話,還需要識別中文和英文字符!

      有效字符的辨識,Wu被認為是是個有效字段,模塊會對其進行合并

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

      中文識別

      本來考慮使用正則去判斷中文的,因為網上查到正則的匹配中文是[\u4e00-\u9fa5],簡單測試了下,貌似沒毛病

      然后…代碼都快寫完了發現有些生僻字不再這個范圍內,我擦!

      '\u4e00'<='生'<='\u9fa5'

      True

      '\u4e00'<='僻'<='\u9fa5'

      True

      '\u4e00'<='字'<='\u9fa5'

      True

      '\u4e00'<='?'<='\u9fa5'

      False

      解決辦法

      針對正則匹配問題,深入去研究,就脫離了學Python的初衷,即便解決了也收獲甚微,不如換個思路。

      utf-8字符編碼下,一個中文字符占3個字節,但是字符的長度僅為1,那么解析中文的方式是否可以變通為:

      len(bytes(str,'utf-8) == 3 and len(string) == 1)

      關于文本書寫,我們判斷中文后,如果是漢字str.ljust(5),否則str.ljust(6)不就行了(因為一個漢字占兩個字符長度)。

      代碼實現

      # -*- coding: utf-8 -*-

      # @Author ?: 王翔

      # @公眾號 ? : 清風Python

      # @WeChat ?: King_Uranus

      # @Date ? ?: 2019/9/6 01:33

      # Software : PyCharm

      # version ?:Python 3.7.3

      # @File ? ?: TextAddPinyin.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)

      如何使用Python為生僻字批量注音

      for line in self.lyric:

      # print(line)

      if line.strip() == '':

      continue

      _new_line = re.sub(r'\s', '', line)

      # 行內容轉拼音

      _pinyin = ''.join(map(lambda x: x[0].ljust(6), pinyin(_new_line)))

      # 根據中英文,將行內容進行字符與漢字的拆分

      _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()

      看看最后的實現效果吧,是不是格式很工整!

      錄屏軟件為LICEcap

      它是一款屏幕錄制工具,支持導出 GIF 動畫圖片格式,輕量級、使用簡單,錄制過程中可以隨意改變錄屏范圍。

      好了,今天的內容就到這里,希望大家喜歡,如果覺得文章有用,記得關注支持我啊。

      The End

      本文來自“清風Python”公眾號

      python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:在WPS表格多項目如何求和(wps表格多個表格求和)
      下一篇:怎么在excel2013的表格中添加背景圖片(如何在excel中添加背景圖片)
      相關文章
      国内成人精品亚洲日本语音| 亚洲成?v人片天堂网无码| 亚洲中文字幕久久精品无码喷水| 亚洲精品无播放器在线播放| 久久亚洲精品国产亚洲老地址| 亚洲人成激情在线播放| 亚洲女人影院想要爱| 亚洲国产精品成人精品小说| 亚洲欧洲国产精品久久| 亚洲另类春色国产精品| 亚洲色欲或者高潮影院| 亚洲欧洲国产经精品香蕉网| 亚洲国产精品乱码在线观看97| 亚洲精品mv在线观看| 亚洲av永久无码精品天堂久久 | 亚洲制服丝袜一区二区三区| 亚洲剧场午夜在线观看| 亚洲精品456人成在线| 亚洲熟女综合一区二区三区| 亚洲日本一线产区和二线产区对比| 亚洲熟女综合一区二区三区| MM1313亚洲国产精品| 亚洲Aⅴ无码一区二区二三区软件| 国产成人综合久久精品亚洲| 亚洲精品国产电影| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久亚洲精品成人无码| 国产亚洲精品美女2020久久| 亚洲区小说区图片区| 在线观看午夜亚洲一区| 国产AV无码专区亚洲AV男同| 亚洲av无码不卡| 亚洲网址在线观看| 亚洲人成人网毛片在线播放| 亚洲欧美日本韩国| 亚洲国产V高清在线观看| 国产gv天堂亚洲国产gv刚刚碰| 国产亚洲A∨片在线观看| 亚洲一区二区三区首页| 亚洲乱码日产精品BD在线观看| 中文字幕亚洲男人的天堂网络|