Text Normalization (Chinese)#

  • text_normalizer_zh.py

  • Including functions for:

    • word-seg chinese texts

    • clean up texts by removing duplicate spaces and line breaks

    • remove incompatible weird characters

import unicodedata
import re
#from nltk.corpus import wordnet
#import collections
from nltk.tokenize.toktok import ToktokTokenizer
from bs4 import BeautifulSoup
import requests
import pandas as pd
import text_normalizer_zh as tnz

Normalization Functions#

# %load text_normalizer_zh.py
"""

Notes
-----

    These functions are based on the text normalization functions 
    provided in Text Analytics with Python 2ed.

"""

import unicodedata
import re
# from nltk.tokenize.toktok import ToktokTokenizer
import pandas as pd
import jieba

## Initialize Trad Chinese dictionary
jieba.set_dictionary('../../../RepositoryData/data/jiaba/dict.txt.jiebatw.txt')


## Normalize unicode characters
def remove_weird_chars(text):
    #     ```
    #     (NFKD) will apply the compatibility decomposition, i.e.
    #     replace all compatibility characters with their equivalents.
    #     ```
    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
def remove_symbols(text):
    """
    
    Unicode 6.0 has 7 character categories, and each category has subcategories:

    Letter (L): lowercase (Ll), modifier (Lm), titlecase (Lt), uppercase (Lu), other (Lo)
    Mark (M): spacing combining (Mc), enclosing (Me), non-spacing (Mn)
    Number (N): decimal digit (Nd), letter (Nl), other (No)
    Punctuation (P): connector (Pc), dash (Pd), initial quote (Pi), final quote (Pf), open (Ps), close (Pe), other (Po)
    Symbol (S): currency (Sc), modifier (Sk), math (Sm), other (So)
    Separator (Z): line (Zl), paragraph (Zp), space (Zs)
    Other (C): control (Cc), format (Cf), not assigned (Cn), private use (Co), surrogate (Cs)
    
    
    There are 3 ranges reserved for private use (Co subcategory): 
    U+E000—U+F8FF (6,400 code points), U+F0000—U+FFFFD (65,534) and U+100000—U+10FFFD (65,534). 
    Surrogates (Cs subcategory) use the range U+D800—U+DFFF (2,048 code points).
    
    
    """

    ## Brute-force version: list all possible unicode ranges, but this list is not complete.
    #   text = re.sub('[\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e\u00a1-\u00bf\u2000-\u206f\u2013-\u204a\u20a0-\u20bf\u2100-\u214f\u2150-\u218b\u2190-\u21ff\u2200-\u22ff\u2300-\u23ff\u2460-\u24ff\u2500-\u257f\u2580-\u259f\u25a0-\u25ff\u2600-\u26ff\u2e00-\u2e7f\u3000-\u303f\ufe50-\ufe6f\ufe30-\ufe4f\ufe10-\ufe1f\uff00-\uffef─◆╱]+','',text)

    text = ''.join(ch for ch in text
                   if unicodedata.category(ch)[0] not in ['P', 'S'])
    return text


## Remove numbers
def remove_numbers(text):
    return re.sub('\\d+', "", text)


## Remove alphabets
def remove_alphabets(text):
    return re.sub('[a-zA-Z]+', '', text)


## Combine every step
def normalize_corpus(corpus,
                     is_remove_extra_linebreaks=True,
                     is_remove_weird_chars=True,
                     is_seg=True,
                     is_remove_symbols=True,
                     is_remove_numbers=True,
                     is_remove_alphabets=True):

    normalized_corpus = []
    # normalize each document in the corpus
    for doc in corpus:

        if is_remove_extra_linebreaks:
            doc = remove_extra_linebreaks(doc)

        if is_remove_weird_chars:
            doc = remove_weird_chars(doc)

        if is_seg:
            doc = seg(doc)

        if is_remove_symbols:
            doc = remove_symbols(doc)

        if is_remove_alphabets:
            doc = remove_alphabets(doc)

        if is_remove_numbers:
            doc = remove_numbers(doc)

        normalized_corpus.append(remove_extra_spaces(doc))

    return normalized_corpus

Extract an Article#

  • Grab the first article from Google news for demonstration

url = 'https://news.google.com/topics/CAAqJQgKIh9DQkFTRVFvSUwyMHZNRFptTXpJU0JYcG9MVlJYS0FBUAE?hl=zh-TW&gl=TW&ceid=TW%3Azh-Hant'
r = requests.get(url)
web_content = r.text
soup = BeautifulSoup(web_content, 'lxml')
title = soup.find_all('a', class_='DY5T1d')
first_art_link = title[0]['href'].replace('.', 'https://news.google.com', 1)

#print(first_art_link)
art_request = requests.get(first_art_link)
art_request.encoding = 'utf8'
soup_art = BeautifulSoup(art_request.text, 'lxml')

art_content = soup_art.find_all('p')
art_texts = [p.text for p in art_content]
print(art_texts)
['', '\r\n大陸中央電視台11日晚間「新聞聯播」報導,大陸國家安全機關破獲數百起台灣間諜情報機關竊密案件。隨後央視的「焦點訪談」專題報導,則以去年8月入境大陸後被捕的屏東縣枋寮鄉政顧問李孟居作為典型案例,李孟居除了在電視鏡頭前認罪,並指控其前往香港聲援反送中運動,是被現任枋寮鄉長陳亞麟「騙過去」。', '\n', '\r\n央視指稱,「去年香港持續數月的暴力示威中,『台獨』勢力的鬼影時而顯現。」李孟居除商人身分外,還是台獨組織「台灣聯合國協進會」理事,曾於去年8月赴香港執行「反送中加油」行動,並潛入深圳打探部隊集結情況,拍攝大量影音圖片向台獨組織發送報告。', '\n', '\r\n央視指出,2019年香港爆發反送中抗爭後,「台灣聯合國協進會」也立刻開始行動。李孟居的好友、「台灣聯合國協進會」候補理事陳亞麟再去年7月底找到李孟居,計畫去香港聲援黑衣人。陳亞麟另一身分是現任屏東縣枋寮鄉長。', '\n', '\r\n報導並公布李孟居與陳亞麟兩人的聊天記錄。二人曾商議,為配合蔡政府「支援香港民主運動」,受「台灣聯合國協進會」指使,兩人計畫入境香港實施「反送中加油」行動。', '\n', '\r\n聊天記錄還顯示,李孟居認為,此舉將日後可作為「政治獻禮」提升自身地位,有利於未來選立委。', '\n', '\r\n李孟居在電視認罪中供稱,他沒想到的是,臨行前,陳亞麟突然告訴他「沒有請到假,去不了了」。李孟居說,「那時候沒太多想,後來我才覺得不太對勁,是他早知道有危險,把我騙過去。」', '\n', '\r\n2019年8月18日,李孟居抵達香港,一落地就參與「反送中加油」行動,並第一時間將相關圖片發回台灣。隨後他從網上獲悉有武警在深圳集結的消息,於是第二天就進入深圳,並於當晚22時搭計程車到深圳灣體育場附近,但因天色已晚,沒有看到武警集結。', '\n', '\r\n報導稱,李孟居隨後在一棟高樓頂層的酒店裡確定了一個觀看武警集結的「最佳位置」。20日一早,李孟居起床後就搭計程車來到該酒店,並用隨身攜帶的DV和手機拍攝。隨後還下樓到深圳灣體育館一樓在警戒線附近拍攝,最終被捕。', '\n', '\r\n大陸已於去年10月31日對李孟居正式執行逮捕,並以涉嫌為境外刺探、非法提供秘密罪將案件移送檢察院審查起訴。報導稱,目前案件已進入法院審理程序。', '\n', '\r\n央視表示,「李孟居對自己被台獨思想蒙蔽,受台獨組織唆使,盲目赴香港進行『反中亂港』活動十分懊悔。」他還在供述中說:「『台獨』『港獨』是沒有出路的」、「暴力是絕對不對的,必須要把那些暴力人士繩之以法。」屏東縣枋寮鄉政顧問李孟居去年8月從香港進入深圳後被捕。(截圖自央視報導)', '\n                    大陸國家主席習近平本周將赴深圳,參加深圳經濟特區成立四十周年的紀念活動,消息人士說,習近平將會見香港特首林鄭月娥和澳門特...                  ', '\n                    日前因一席「求和說」導致國民黨前副主席王金平赴陸參加海峽論壇破局的央視主持人李紅,傳因此事件遭到封殺,但有大陸媒體發現,...                  ', '\n                    大陸央視昨報導,大陸國安機關近期破獲數百起台諜案。央視「焦點訪談」節目自十一日起將一連三天報導「台諜案」,並要求大陸大學...                  ', '\n                    屏東縣枋寮鄉公所鄉政顧問李孟居昨晚接受大陸中央電視台專訪,李認罪是台諜,並控訴是被枋寮鄉長陳亞麟「騙去」香港支持「反送中...                  ', '\n                    蔡英文總統透過國慶演說向北京喊話,強調維持兩岸穩定是雙方共同責任,願在對等尊嚴下與大陸對話,陸方顯然不接受,除了國台辦立...                  ', '\n                    大陸央視昨報導稱,大陸國安機構近期抓獲一批台灣間諜。陸委會昨晚對此駁斥,指這是對岸惡意政治炒作,誣陷我方人員從事間諜行為...                  ', '\n                    大陸國務委員兼外長王毅十日在雲南騰衝與菲律賓外長洛欽會談。王毅說,中方願與菲方推進「南海行為準則」磋商進程,確保年內簽署...                  ', '\n                    屏東縣枋寮鄉公所鄉政顧問李孟居去年被大陸指控涉嫌危害國家安全遭拘留,陸方今晚播出李孟居接受央視訪問,「被自白」成為台諜,...                  ', '\n                    中國大陸官媒央視11日在「新聞聯播」中報導,大陸國安機關近期依法打擊台灣間諜情報機關滲透破壞行動,破獲數百起間諜竊密案件...                  ', '\n                    蔡總統在國慶演說中宣示,有決心維持兩岸穩定,但中國大陸卻進一步強化全民「防台」意識。中央電視台11日晚間的「新聞聯播」報...                  ', '\n                    屏東縣枋寮鄉公所鄉政顧問李孟居去年被大陸指控涉嫌危害國家安全遭拘留,大陸那方傳出最新發展是李孟居接受央視訪問,「被自白」...                  ', '\n                    台人李孟居去年10月在深圳被以「為境外刺探、非法提供國家秘密罪」批准逮補。他今天在官媒央視節目中「認錯」,指「過去做了很...                  ', '\n', '\n', '\n', '\n', '\n', '\n']
  • Normalized results:

tnz.normalize_corpus([' '.join(art_texts)])
Building prefix dict from /Users/Alvin/GoogleDrive/_MySyncDrive/RepositoryData/data/jiaba/dict.txt.jiebatw.txt ...
Loading model from cache /var/folders/n7/ltpzwx813c599nfxfb94s_640000gn/T/jieba.u1b52b47246a0f2e6497af6bbe107adac.cache
Loading model cost 0.551 seconds.
Prefix dict has been built successfully.
['大陸 中央 電視台 日 晚間 新聞 聯播 報導 大陸 國家 安全 機關 破獲 數百 起 台灣 間諜 情報 機關 竊密 案件 隨後 央視 的 焦點 訪談 專題 報導 則以 去年 月 入境 大陸 後 被捕 的 屏東縣 枋寮鄉 政 顧問 李孟居 作為 典型 案例 李孟居 除了 在 電視 鏡頭 前 認罪 並 指控 其 前往 香港 聲援 反送 中 運動 是 被 現任 枋寮鄉 長陳 亞麟 騙 過去 央視 指稱 去年 香港 持續 數月 的 暴力 示威 中 台獨 勢力 的 鬼影 時而 顯現 李孟居除 商人 身分 外 還是 台獨 組織 台灣 聯合國 協進會 理事 曾 於 去年 月 赴 香港 執行 反送 中 加油 行動 並 潛入 深圳 打探 部隊 集結 情況 拍攝 大量 影音 圖片 向 台獨 組織 發送 報告 央視 指出 年 香港 爆發 反送 中 抗爭 後 台灣 聯合國 協進會 也 立刻 開始 行動 李孟居 的 好友 台灣 聯合國 協進會 候補 理事 陳 亞麟 再 去年 月底 找到 李孟居 計畫 去 香港 聲援 黑衣 人 陳 亞麟 另 一 身分 是 現任 屏東縣 枋寮鄉 長 報導 並 公布 李孟居 與 陳 亞麟 兩人 的 聊天 記錄 二人 曾 商議 為 配合 蔡 政府 支援 香港 民主 運動 受 台灣 聯合國 協進會 指使 兩人 計畫 入境 香港 實施 反送 中 加油 行動 聊天 記錄 還 顯示 李孟居 認為 此舉 將 日後 可 作為 政治 獻禮 提升 自身 地位 有利於 未來 選 立委 李孟居 在 電視 認罪 中 供稱 他 沒想到 的 是 臨行 前 陳 亞麟 突然 告訴 他 沒有 請到 假 去不了 了 李孟居 說 那 時候 沒 太多 想 後來 我 才 覺得 不 太 對勁 是 他 早 知道 有 危險 把 我 騙 過去 年 月 日 李孟居 抵達 香港 一 落地 就 參與 反送 中 加油 行動 並第 一時間 將 相關 圖片 發回 台灣 隨後 他 從 網上 獲悉 有 武警 在 深圳 集結 的 消息 於是 第二天 就 進入 深圳 並 於 當晚 時 搭 計程車 到 深圳 灣 體育場 附近 但 因 天色 已晚 沒有 看到 武警 集結 報導 稱 李孟居 隨後 在 一棟 高樓 頂層 的 酒店 裡 確定 了 一個 觀看 武警 集結 的 最佳 位置 日 一早 李孟居 起床 後 就 搭 計程車 來到 該 酒店 並用 隨身 攜帶 的 和 手機 拍攝 隨後 還 下樓 到 深圳 灣 體育館 一樓 在 警戒線 附近 拍攝 最終 被捕 大陸 已 於 去年 月 日 對 李孟居 正式 執行 逮捕 並以 涉嫌 為 境外 刺探 非法 提供 秘密罪 將 案件 移送 檢察院 審查 起訴 報導 稱 目前 案件 已 進入 法院 審理 程序 央視 表示 李孟居 對 自己 被 台獨 思想 蒙蔽 受 台獨 組織 唆使 盲目 赴 香港 進行 反中 亂港 活動 十分 懊悔 他 還在 供述 中說 台獨 港獨 是 沒有 出路 的 暴力 是 絕對 不 對 的 必須 要 把 那些 暴力 人士 繩之以法 屏東縣 枋寮鄉 政 顧問 李孟居 去年 月 從 香港 進入 深圳 後 被捕 截圖 自 央視 報導 大陸 國家 主席 習近平 本周 將赴 深圳 參加 深圳 經濟 特區 成立 四十 周年 的 紀念 活動 消息 人士 說 習近平 將 會見 香港 特首 林鄭月娥 和 澳門 特 日前 因一席 求和 說 導致 國民黨 前 副主席 王金平 赴陸 參加 海峽 論壇 破局 的 央視 主持人 李紅 傳 因此 事件 遭到 封殺 但 有 大陸 媒體 發現 大陸 央視 昨 報導 大陸 國安 機關 近期 破獲 數百 起台 諜案 央視 焦點 訪談 節目 自 十一日 起將 一連 三天 報導 台 諜案 並 要求 大陸 大學 屏東縣 枋寮 鄉公所 鄉政 顧問 李孟居 昨晚 接受 大陸 中央 電視台 專訪 李 認罪 是 台諜 並 控訴 是 被 枋寮鄉 長陳 亞麟 騙去 香港 支持 反送 中 蔡英文 總統 透過 國慶 演說 向 北京 喊話 強調 維持 兩岸 穩定 是 雙方 共同 責任 願 在 對等 尊嚴 下 與 大陸 對話 陸方 顯然 不 接受 除了 國台辦 立 大陸 央視 昨 報導 稱 大陸 國安 機構 近期 抓獲 一批 台灣 間諜 陸委會 昨晚 對此 駁斥 指 這是 對岸 惡意 政治 炒作 誣陷 我方 人員 從事 間諜 行為 大陸 國務 委員 兼 外長 王毅 十日 在 雲南 騰衝 與 菲律賓 外長 洛欽 會談 王毅 說 中方 願 與 菲方 推進 南海 行為 準則 磋商 進程 確保 年 內 簽署 屏東縣 枋寮 鄉公所 鄉政 顧問 李孟居 去年 被 大陸 指控 涉嫌 危害 國家 安全 遭 拘留 陸方 今晚 播出 李孟居 接受 央視 訪問 被 自白 成為 台諜 中國 大陸 官媒 央視 日 在 新聞 聯播 中 報導 大陸 國安 機關 近期 依法 打擊 台灣 間諜 情報 機關 滲透 破壞 行動 破獲 數百 起 間諜 竊密 案件 蔡 總統 在 國慶 演說 中 宣示 有 決心 維持 兩岸 穩定 但 中國 大陸 卻 進一步 強化 全民 防 台 意識 中央 電視台 日 晚間 的 新聞 聯播 報 屏東縣 枋寮 鄉公所 鄉政 顧問 李孟居 去年 被 大陸 指控 涉嫌 危害 國家 安全 遭 拘留 大陸 那方 傳出 最 新 發展 是 李孟居 接受 央視 訪問 被 自白 台人 李孟居 去年 月 在 深圳 被 以 為 境外 刺探 非法 提供 國家 秘密罪 批准 逮補 他 今天 在 官媒 央視 節目 中 認錯 指 過去 做 了 很']