語音合成學(xué)習(xí)(六)學(xué)習(xí)筆記

語音合成學(xué)習(xí)(六)學(xué)習(xí)筆記


文本歸一化

一坟瓢、介紹

簡介

文本正則化是將文本數(shù)據(jù)轉(zhuǎn)化為標(biāo)準(zhǔn)形式的過程近她,以便于進(jìn)行自然語言處理和文本分析。文本歸一化通常包括以下步驟:

  • 文本清理:刪除文本中的無用信息愤兵,如HTML標(biāo)記铁蹈,特殊字符,URL和標(biāo)點(diǎn)符號等拉队。
  • 大小寫統(tǒng)一:將文本中的所有字符轉(zhuǎn)換為小寫或大寫字母弊知。
  • 停用詞過濾:刪除指定的停用詞,如“的”粱快、“在”秩彤、“是”等常用詞語。
  • 詞干提取或詞形還原:將不同形式的詞匯轉(zhuǎn)換為其原始形式事哭,如將“running”轉(zhuǎn)換為“run”或?qū)ⅰ癱ats”轉(zhuǎn)換為“cat”漫雷。
  • 拼寫糾正:修正文本中的拼寫錯(cuò)誤。

文本歸一化的目的是消除文本中的噪聲和不規(guī)則性鳍咱,提高自然語言處理和文本分析的準(zhǔn)確性和效率降盹。


TN全稱Text Normalization,意思是文本規(guī)整谤辜、文本正則化 蓄坏。

TN是 TTS (Text-to-speech,文本轉(zhuǎn)語音) 系統(tǒng)中的重要組成部分丑念,主要功能是將文本中的數(shù)字涡戳、符號、縮寫等轉(zhuǎn)換成語言文字脯倚。如:

# delete english characters
# e.g. "你好aBC" -> "你 好"

# fractionation
# e.g. "現(xiàn)場有7/12的觀眾投出了贊成票"  -> "現(xiàn)場有十二分之七的觀眾投出了贊成票"

# time
# e.g. "2:10pm出門" -> "下午兩點(diǎn)十分出門"
  • 使用歸一化的好處:

1.提升模型的收斂速度(即加快梯度下降求最優(yōu)解的速度

2.提升模型的精度
在涉及到一些距離計(jì)算的算法時(shí)效果顯著渔彰,比如算法要計(jì)算歐氏距離,歸一化可以讓可以讓各個(gè)特征對結(jié)果做出的貢獻(xiàn)相同推正,未歸一化就會造成精度的損失恍涂。

3.提高準(zhǔn)確性:文本歸一化可以消除文本中的噪聲和不規(guī)則性,如大小寫差異植榕、拼寫錯(cuò)誤乳丰、同義詞等,從而提高文本分析的準(zhǔn)確性内贮。

4.降低復(fù)雜性:文本歸一化可以將文本轉(zhuǎn)換為標(biāo)準(zhǔn)格式或標(biāo)準(zhǔn)形式产园,從而降低文本分析的復(fù)雜性和難度。

5.提高效率:文本歸一化可以將不同形式的詞匯轉(zhuǎn)換為其原始形式夜郁,并刪除停用詞等無用信息什燕,從而提高自然語言處理和文本分析的效率。

6.統(tǒng)一數(shù)據(jù):文本歸一化可以統(tǒng)一不同來源的文本數(shù)據(jù)竞端,使其格式和表達(dá)方式相同屎即,從而方便進(jìn)行后續(xù)的文本分析和處理。

二、常見的歸一化轉(zhuǎn)換規(guī)則與表達(dá)

# 過濾掉特殊字符
text = re.sub(r'[——《》【】<=>{}()()#&@“”^_|…\\]', '', text)
# 日期表達(dá)式
用 / 或者 - 分隔的 YY/MM/DD 或者 YY-MM-DD 日期
RE_DATE2 = re.compile(r'(\d{4})([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])')
RE_DATE21 = re.compile(r'(\d{4}|\d{2})年'
                     r'((0?[1-9]|1[0-2])月)?'
                     r'(((0?[1-9])|((1|2)[0-9])|30|31)([日號]))?')
# 時(shí)刻表達(dá)式
RE_TIME = re.compile(r'([0-1]?[0-9]|2[0-3])'
                     r':([0-5][0-9])'
                     r'(:([0-5][0-9]))?')
# 時(shí)間范圍技俐,如8:30-12:30
RE_TIME_RANGE = re.compile(r'([0-1]?[0-9]|2[0-3])'
                           r':([0-5][0-9])'
                           r'(:([0-5][0-9]))?'
                           r'(~|-)'
                           r'([0-1]?[0-9]|2[0-3])'
                           r':([0-5][0-9])'
                           r'(:([0-5][0-9]))?')
# 分?jǐn)?shù)表達(dá)式
RE_FRAC = re.compile(r'(-?)(\d+)/(\d+)')

# 百分?jǐn)?shù)表達(dá)式
RE_PERCENTAGE = re.compile(r'(-?)(\d+(\.\d+)?)%')
# 整數(shù)表達(dá)式
# 帶負(fù)號的整數(shù) -10
RE_INTEGER = re.compile(r'(-)' r'(\d+)')
# 編號-無符號整形
# 00078
RE_DEFAULT_NUM = re.compile(r'\d{3}\d*')
# 數(shù)字表達(dá)式
# 純小數(shù)
RE_DECIMAL_NUM = re.compile(r'(-?)((\d+)(\.\d+))' r'|(\.(\d+))')
# 正整數(shù) + 量詞
RE_POSITIVE_QUANTIFIERS = re.compile(r"(\d+)([多余幾\+])?" + COM_QUANTIFIERS)
RE_NUMBER = re.compile(r'(-?)((\d+)(\.\d+)?)' r'|(\.(\d+))')
# 范圍表達(dá)式
RE_RANGE = re.compile(r'((-?)((\d+)(\.\d+)?)|(\.(\d+)))[-~]((-?)((\d+)(\.\d+)?)|(\.(\d+)))')
# 規(guī)范化固話/手機(jī)號碼
# 手機(jī)
# 移動:139乘陪、138、137雕擂、136啡邑、135、134井赌、159谤逼、158、157仇穗、150流部、151、152纹坐、188枝冀、187、182耘子、183宾茂、184、178拴还、198
# 聯(lián)通:130、131欧聘、132片林、156、155怀骤、186费封、185、176
# 電信:133蒋伦、153弓摘、189、180痕届、181韧献、177
RE_MOBILE_PHONE = re.compile(r"(?<!\d)((\+?86 ?)?1([38]\d|5[0-35-9]|7[678]|9[89])\d{8})(?!\d)")
RE_TELEPHONE = re.compile(r"(?<!\d)((0(10|2[1-3]|[3-9]\d{2})-?)?[1-9]\d{7,8})(?!\d)")

# 全國統(tǒng)一的號碼400開頭
RE_NATIONAL_UNIFORM_NUMBER = re.compile(r"(400)(-)?\d{3}(-)?\d{4}")

# 溫度表達(dá)式,溫度會影響負(fù)號的讀法
# -3°C 零下三度
RE_TEMPERATURE = re.compile(r'(-?)(\d+(\.\d+)?)(°C|℃|度|攝氏度)')
## Normalize unicode characters  // 規(guī)范化unicode 字符
def remove_weird_chars(text):
    text = unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore').decode(
        'utf-8', 'ignore')
    return text
    
## Remove extra linebreaks   //刪除額外換行符
def remove_extra_linebreaks(text):
    lines = text.split(r'\n+')
    return '\n'.join(
        [re.sub(r'[\s]+', ' ', l).strip() for l in lines if len(l) != 0])
        
 
## Remove extra medial/trailing/leading spaces  // 刪除額外的中間/后面/前面的空間
def remove_extra_spaces(text):
    return re.sub("\\s+", " ", text).strip()
    
## Seg the text into words   // 分詞
def seg(text):
    text_seg = jieba.cut(text)
    out = ' '.join(text_seg)
    return out
    
## Remove punctuation/symbols  // 除去標(biāo)點(diǎn)符號
def remove_symbols(text):
text = ''.join(
        ch for ch in text if unicodedata.category(ch)[0] not in ['P', 'S'])
    return text
    
## Remove numbers  // 除去數(shù)字
def remove_numbers(text):
    return re.sub('\\d+', "", text)
    
## Remove alphabets   //除去字母
def remove_alphabets(text):
    return re.sub('[a-zA-Z]+', '', text)
  
## Unify upper/lower cases   //轉(zhuǎn)換大小寫
    if args.to_upper:
        text = text.upper()
    if args.to_lower:
        text = text.lower()
        
## export  const  verbalizeCardinal = (num)  => {
    // 將基數(shù)詞轉(zhuǎn)換為中文漢字表示
    let result = '';
    for (let digit of String(num)) {
        result += CARDINALS[digit];
    }
    return result;
 }

## export  const replaceDate = (match) =>  {
    // 將日期字符串中的數(shù)字轉(zhuǎn)換為中文漢字表示
    const year = match[1];
    const month = match[3];
    const day = match[5];
    let result = '';
    if (year) {
        result += `${verbalizeDigit(year)}年`;
    }
    if (month) {
        result += `${verbalizeCardinal(month)}月`;
    }
    if (day) {
        result += `${verbalizeCardinal(day)}${match[9]}`;
    }
    return result;
    
  ## export const replaceDate2 = (match)  => {
    // 將日期字符串中的數(shù)字轉(zhuǎn)換為中文漢字表示
    const year = match[1];
    const month = match[3];
    const day = match[4];
    let result = '';
    if (year) {
        result += `${verbalizeDigit(year)}年`;
    }
    if (month) {
        result += `${verbalizeCardinal(month)}月`;
    }
    if (day) {
        result += `${verbalizeCardinal(day)}日`;
    }
    return result;
## export  const replaceTime = (match)  => {
    const isRange = match[6] !== '-';
    const hour = parseInt(match[1]);
    const minute = parseInt(match[2]);
    const second = match[4] ? parseInt(match[4]) : 0;
    const hour2 = isRange ? parseInt(match[6]) : null;
    const minute2 = isRange ? parseInt(match[7]) : null;
    const second2 = isRange && match[9] ? parseInt(match[9]) : null;

    let result = `${num2str(hour)}點(diǎn)`;
    if (minute.toString().replace(/^0+/, '') !== '') {
        if (minute === 30) {
            result += '半';
        } else {
            result += `${_time_num2str(minute)}分`;
        }
    }
    if (second.toString().replace(/^0+/, '') !== '') {
        result += `${_time_num2str(second)}秒`;
    }

    if (isRange) {
        result += '至';
        result += `${num2str(hour2)}點(diǎn)`;
        if (minute2.toString().replace(/^0+/, '') !== '') {
            if (minute2 === 30) {
                result += '半';
            } else {
                result += `${_time_num2str(minute2)}分`;
            }
        }
        if (second2.toString().replace(/^0+/, '') !== '') {
            result += `${_time_num2str(second2)}秒`;
        }
    }

    return result;
}




以上主要是對歸一化的簡單介紹研叫,也整理了一部分常用的規(guī)則锤窑。


相關(guān)閱讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嚷炉,隨后出現(xiàn)的幾起案子渊啰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘证,死亡現(xiàn)場離奇詭異隧膏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嚷那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門胞枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人车酣,你說我怎么就攤上這事曲稼。” “怎么了湖员?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵贫悄,是天一觀的道長。 經(jīng)常有香客問我娘摔,道長窄坦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任凳寺,我火速辦了婚禮鸭津,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肠缨。我一直安慰自己逆趋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布晒奕。 她就那樣靜靜地躺著闻书,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脑慧。 梳的紋絲不亂的頭發(fā)上魄眉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音闷袒,去河邊找鬼坑律。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囊骤,可吹牛的內(nèi)容都是我干的晃择。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼也物,長吁一口氣:“原來是場噩夢啊……” “哼藕各!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焦除,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤激况,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乌逐,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竭讳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浙踢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绢慢。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洛波,靈堂內(nèi)的尸體忽然破棺而出胰舆,到底是詐尸還是另有隱情,我是刑警寧澤蹬挤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布缚窿,位于F島的核電站,受9級特大地震影響焰扳,放射性物質(zhì)發(fā)生泄漏倦零。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一吨悍、第九天 我趴在偏房一處隱蔽的房頂上張望扫茅。 院中可真熱鬧,春花似錦育瓜、人聲如沸葫隙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋脚。三九已至,卻和暖如春钙态,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇晃。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工册倒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磺送。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓驻子,卻偏偏與公主長得像,于是被迫代替她去往敵國和親估灿。 傳聞我的和親對象是個(gè)殘疾皇子崇呵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容