清理CKIP-Transformer輸出結果的技巧與程式範例

更新於 發佈於 閱讀時間約 20 分鐘

CKIP-Transformer是一個繁體中文的自然語言處理(NLP) 模型,雖然速度偏慢,但是在切詞、詞性標記和命名實體識別等方面都有很優秀的表現。然而,CKIP-Transformer 的輸出並非完美無缺,有時需要額外的資料清理才能進行後續應用。在這篇文章中,我將分享一些清理CKIP-Transformer輸出結果的技巧與Python程式範例。

您也可以在這份官方 PDF 文件中查看詞性(parts of speech)的定義。我也在Python程式碼中將所有詞性定義寫成一個list,這樣使用上更為方便。

import pandas as pd
import re
from ckip_transformers.nlp import CkipWordSegmenter, CkipPosTagger, CkipNerChunker


def str_remove_emoji(text):
'''
Remove emoji from text
- This function will preserve traditional Chinese characters
'''
emoji_pattern = re.compile("["
u"\U0001F000-\U0001F9FF" # Extended emoticons and symbols
u"\U0001FA00-\U0001FA6F" # Extended-A
u"\U0001FA70-\U0001FAFF" # Extended-B
u"\U00002600-\U000027BF" # Miscellaneous Symbols and Dingbats
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
u"\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs
"]+", flags=re.UNICODE)

return emoji_pattern.sub(r'', text)


def get_pos_definition():

li = [
['A', 'A', 'A', '/*非謂形容詞*/'],
['C', 'Caa', 'Caa', '/*對等連接詞,如:和、跟*/'],
['POST', 'Cab', 'Cab', '/*連接詞,如:等等*/'],
['POST', 'Cba', 'Cbab', '/*連接詞,如:的話*/'],
['C', 'Cbb', 'Cbaa, Cbba, Cbbb, Cbca, Cbcb', '/*關聯連接詞*/'],
['ADV', 'Da', 'Daa', '/*數量副詞*/'],
['ADV', 'Dfa', 'Dfa', '/*動詞前程度副詞*/'],
['ADV', 'Dfb', 'Dfb', '/*動詞後程度副詞*/'],
['ASP', 'Di', 'Di', '/*時態標記*/'],
['ADV', 'Dk', 'Dk', '/*句副詞*/'],
['ADV', 'D', 'Dab, Dbaa, Dbab, Dbb, Dbc, Dc, Dd, Dg, Dh, Dj', '/*副詞*/'],
['N', 'Na', 'Naa, Nab, Nac, Nad, Naea, Naeb', '/*普通名詞*/'],
['N', 'Nb', 'Nba, Nbc', '/*專有名稱*/'],
['N', 'Nc', 'Nca, Ncb, Ncc, Nce', '/*地方詞*/'],
['N', 'Ncd', 'Ncda, Ncdb', '/*位置詞*/'],
['N', 'Nd', 'Ndaa, Ndab, Ndc, Ndd', '/*時間詞*/'],
['DET', 'Neu', 'Neu', '/*數詞定詞*/'],
['DET', 'Nes', 'Nes', '/*特指定詞*/'],
['DET', 'Nep', 'Nep', '/*指代定詞*/'],
['DET', 'Neqa', 'Neqa', '/*數量定詞*/'],
['POST', 'Neqb', 'Neqb', '/*後置數量定詞*/'],
['M', 'Nf', 'Nfa, Nfb, Nfc, Nfd, Nfe, Nfg, Nfh, Nfi', '/*量詞*/'],
['POST', 'Ng', 'Ng', '/*後置詞*/'],
['N', 'Nh', 'Nhaa, Nhab, Nhac, Nhb, Nhc', '/*代名詞*/'],
['Nv', 'Nv', 'Nv1,Nv2,Nv3,Nv4', '/*名物化動詞*/'],
['T', 'I', 'I', '/*感嘆詞*/'],
['P', 'P', 'P*', '/*介詞*/'],
['T', 'T', 'Ta, Tb, Tc, Td', '/*語助詞*/'],
['Vi', 'VA', 'VA11,12,13,VA3,VA4', '/*動作不及物動詞*/'],
['Vt', 'VAC', 'VA2', '/*動作使動動詞*/'],
['Vi', 'VB', 'VB11,12,VB2', '/*動作類及物動詞*/'],
['Vt', 'VC', 'VC2, VC31,32,33', '/*動作及物動詞*/'],
['Vt', 'VCL', 'VC1', '/*動作接地方賓語動詞*/'],
['Vt', 'VD', 'VD1, VD2', '/*雙賓動詞*/'],
['Vt', 'VE', 'VE11, VE12, VE2', '/*動作句賓動詞*/'],
['Vt', 'VF', 'VF1, VF2', '/*動作謂賓動詞*/'],
['Vt', 'VG', 'VG1, VG2', '/*分類動詞*/'],
['Vi', 'VH', 'VH11,12,13,14,15,17,VH21', '/*狀態不及物動詞*/'],
['Vi', 'VHC', 'VH16, VH22', '/*狀態使動動詞*/'],
['Vi', 'VI', 'VI1,2,3', '/*狀態不及物動詞*/'],
['Vt', 'VJ', 'VJ1,2,3', '/*狀態及物動詞*/'],
['Vt', 'VK', 'VK1,2', '/*狀態句賓動詞*/'],
['Vt', 'VL', 'VL1,2,3,4', '/*狀態謂賓動詞*/'],
['Vt', 'V_2', 'V_2', '/*有*/'],
['T', 'DE', '/*的、之、得、地*/', ''],
['Vt', 'SHI', '', '/*是*/'],
['FW', 'FW', '', '/*外文標記*/'],
['COLONCATEGORY', '', '', '/*冒號*/'],
['COMMACATEGORY', '', '', '/* 逗號 */'],
['DASHCATEGORY', '', '', '/* 破折號 */'],
['ETCCATEGORY', '', '', '/* 刪節號 */'],
['EXCLANATIONCATEGORY', '', '', '/* 驚嘆號 */'],
['PARENTHESISCATEGORY', '', '', '/* 括弧 */'],
['PAUSECATEGORY', '', '', '/* 頓號 */'],
['PERIODCATEGORY', '', '', '/* 句號 */'],
['QUESTIONCATEGORY', '', '', '/* 問號 */'],
['SEMICOLONCATEGORY', '', '', '/* 分號 */'],
['SPCHANGECATEGORY', '', '', '/* 雙直線 */']
]
df = pd.DataFrame(
li, columns=['short_label', 'label', 'all_label', 'description'])
return df


def get_excluded_pos():
'''
Get excluded pos
'''
li = ['WHITESPACE', 'COLONCATEGORY', 'COMMACATEGORY',
'DASHCATEGORY', 'ETCCATEGORY', 'EXCLANATIONCATEGORY',
'PARENTHESISCATEGORY', 'PAUSECATEGORY', 'PERIODCATEGORY',
'QUESTIONCATEGORY', 'SEMICOLONCATEGORY', 'SPCHANGECATEGORY',
'EXCLAMATIONCATEGORY']
return li


def clean_word_pos(word_pos):
'''
Clean word pos
'''
exclude_pos = get_excluded_pos()
word_pos = word_pos[['word', 'pos']]
word_pos['word'] = word_pos['word'].str.replace(' ', '')
# remove zero width joiner
word_pos['word'] = word_pos['word'].str.replace('\u200d', '')
# Convert to lower case
word_pos['word'] = word_pos['word'].str.lower()
# Remove emoji
word_pos['word'] = word_pos['word'].apply(str_remove_emoji)
# Remove abnormal words
word_pos = word_pos[(~word_pos['pos'].isin(exclude_pos))
& (~word_pos['word'].str.contains('http'))
& (~word_pos['word'].str.contains('@'))
& (word_pos['word'].str.len() <= 30)
& (word_pos['word'] != '')
]
word_pos = (word_pos
.groupby(['word', 'pos'])
.size()
.reset_index(name='word_count'))

return word_pos


def clean_word_ner(ner):
'''
Clean word ner
'''
ner = ner[['word', 'ner']]
ner['word'] = ner['word'].str.replace(' ', '')
# remove zero width joiner
ner['word'] = ner['word'].str.replace('\u200d', '')
# Convert to lower case
ner['word'] = ner['word'].str.lower()
# Remove emoji
ner['word'] = ner['word'].apply(str_remove_emoji)
# Remove abnormal words
ner = ner[(ner['word'].str.len() <= 30)
& (ner['ner'].str.len() <= 20)
& (ner['word'] != '')
]
ner = (ner
.groupby(['word', 'ner'])
.size()
.reset_index(name='word_count'))
return ner


def run_ckip_transofomer():
'''
Duplicated and adjusted from official GitHub
https://github.com/ckiplab/ckip-transformers/blob/master/example/example.py
'''

# Show version
print(__version__)

# Initialize drivers
print("Initializing drivers ... WS")
ws_driver = CkipWordSegmenter(model="bert-base")
print("Initializing drivers ... POS")
pos_driver = CkipPosTagger(model="bert-base")
print("Initializing drivers ... NER")
ner_driver = CkipNerChunker(model="bert-base")
print("Initializing drivers ... done")
print()

# Input text
text = [
"傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。",
"美國參議院針對今天總統布什所提名的勞工部長趙小蘭展開認可聽證會,預料她將會很順利通過參議院支持,成為該國有史以來第一位的華裔女性內閣成員。",
"空白 也是可以的~",
]

# Run pipeline
print("Running pipeline ... WS")
ws = ws_driver(text)
print("Running pipeline ... POS")
pos = pos_driver(ws)
print("Running pipeline ... NER")
ner = ner_driver(text)
print("Running pipeline ... done")
print()

# Flag each [word, pos, ner]
word_pos_li = []
word_ner_li = []
for sentence_ws, sentence_pos, sentence_ner in zip(ws, pos, ner):
# Concatenate word, pos
for word_ws, word_pos in zip(sentence_ws, sentence_pos):
word_pos_li.append([word_ws, word_pos])

# Flag ner
for entity in sentence_ner:
word_ner_li.append([entity.word, entity.ner])

return word_pos_li, word_ner_li


def main():
word_pos_li, word_ner_li = run_ckip_transofomer()
word_pos = clean_word_pos(word_pos_li)
word_ner = clean_word_ner(word_ner_li)
print(word_pos)
print(word_ner)


if __name__ == "__main__":
main()

這段程式碼也同步發表在我的GitHub上。



本文轉載自:ARON HACK - 清理CKIP-Transformer輸出結果的技巧與程式範例

留言
avatar-img
留言分享你的想法!
avatar-img
ARON HACK 亞倫害的沙龍
23會員
34內容數
2024/10/24
pip和pipenv都是常用的Python套件管理工具,但它們的用途和運作方式略有不同。讓我們來看看它們的差異...
Thumbnail
2024/10/24
pip和pipenv都是常用的Python套件管理工具,但它們的用途和運作方式略有不同。讓我們來看看它們的差異...
Thumbnail
2024/10/24
許多大型語言模型(LLM)開始允許使用者將自己的資料餵進模型中,像是 OpenAI 的 ChatGPT 和 Anthropic 的 Claude。有了這個功能,你可以上傳你的部落格文章、程式碼或資料集來客製化模型的回應。在這篇文章中,你將學習如何從你的 WordPress 網站提取內容並餵給...
Thumbnail
2024/10/24
許多大型語言模型(LLM)開始允許使用者將自己的資料餵進模型中,像是 OpenAI 的 ChatGPT 和 Anthropic 的 Claude。有了這個功能,你可以上傳你的部落格文章、程式碼或資料集來客製化模型的回應。在這篇文章中,你將學習如何從你的 WordPress 網站提取內容並餵給...
Thumbnail
2024/10/24
在 Visual Studio Code(VSCode)或是其分支專案(如 Cursor)中,當你執行 Python 程式碼時(使用 Shift + Enter),預設會在終端機中顯示輸出結果。這種執行方式會執行整個程式,使用上非常不方便,因為你沒辦法只執行部分程式碼並檢查變數。
Thumbnail
2024/10/24
在 Visual Studio Code(VSCode)或是其分支專案(如 Cursor)中,當你執行 Python 程式碼時(使用 Shift + Enter),預設會在終端機中顯示輸出結果。這種執行方式會執行整個程式,使用上非常不方便,因為你沒辦法只執行部分程式碼並檢查變數。
Thumbnail
看更多
你可能也想看
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
利用pdftopdf.ai和先進的OCR技術,高效完成PDF轉換、文字提取與學術寫作,徹底解決文件處理拖延問題。不論是學術研究還是職場應用,只需幾分鐘即可保持排版完整與內容準確。深入講解如何在日常文件管理及企業流程優化中最大化工具效能,是提升效率的必讀全方位指南!
Thumbnail
利用pdftopdf.ai和先進的OCR技術,高效完成PDF轉換、文字提取與學術寫作,徹底解決文件處理拖延問題。不論是學術研究還是職場應用,只需幾分鐘即可保持排版完整與內容準確。深入講解如何在日常文件管理及企業流程優化中最大化工具效能,是提升效率的必讀全方位指南!
Thumbnail
CKIP-Transformer 是一個繁體中文的自然語言處理 (NLP) 模型,雖然速度偏慢,但是在切詞、詞性標記和命名實體識別等方面都有很優秀的表現。然而,CKIP-Transformer 的輸出並非完美無缺,有時需要額外的資料清理才能進行後續應用。
Thumbnail
CKIP-Transformer 是一個繁體中文的自然語言處理 (NLP) 模型,雖然速度偏慢,但是在切詞、詞性標記和命名實體識別等方面都有很優秀的表現。然而,CKIP-Transformer 的輸出並非完美無缺,有時需要額外的資料清理才能進行後續應用。
Thumbnail
剛剛試用了一個 影片轉字幕檔 的網站 SubEasy.ai 驚為天人,24分鐘的影片,辨識完後,修改不到十個地方...前所未有的經驗,超厲害。 而且,錯誤的地方,不怪它啦...同仁 辨識成 同人,中心 辨識成 中興,Co 辨識成 摳(我是要講 Copy 啦),其實這樣的錯誤,還蠻正常的...
Thumbnail
剛剛試用了一個 影片轉字幕檔 的網站 SubEasy.ai 驚為天人,24分鐘的影片,辨識完後,修改不到十個地方...前所未有的經驗,超厲害。 而且,錯誤的地方,不怪它啦...同仁 辨識成 同人,中心 辨識成 中興,Co 辨識成 摳(我是要講 Copy 啦),其實這樣的錯誤,還蠻正常的...
Thumbnail
在當今快速變化的數位時代,企業面臨著前所未有的數據處理需求。為了應對這些挑戰,企業紛紛建立自己的大型語言模型(LLM),利用大量數據進行訓練,讓模型能夠理解並生成自然語言,從而實現人機協作,優化業務流程並提升客戶體驗。然而,資料清理在這個過程中顯得至關重要。
Thumbnail
在當今快速變化的數位時代,企業面臨著前所未有的數據處理需求。為了應對這些挑戰,企業紛紛建立自己的大型語言模型(LLM),利用大量數據進行訓練,讓模型能夠理解並生成自然語言,從而實現人機協作,優化業務流程並提升客戶體驗。然而,資料清理在這個過程中顯得至關重要。
Thumbnail
這次來介紹一下NLP自然語言處理中重要的一個任務「命名實體識別(Named Entity Recognition)」, 這個任務主要識別出「人名」、「地名」、「公司」…等實體, 透過這些實體辨識結果, 可以近一步的理解意圖, 甚至判斷出該文章主要在講什麼重點…等。 關於更多NER的細節歡迎閱讀: 「
Thumbnail
這次來介紹一下NLP自然語言處理中重要的一個任務「命名實體識別(Named Entity Recognition)」, 這個任務主要識別出「人名」、「地名」、「公司」…等實體, 透過這些實體辨識結果, 可以近一步的理解意圖, 甚至判斷出該文章主要在講什麼重點…等。 關於更多NER的細節歡迎閱讀: 「
Thumbnail
前面我們介紹了「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」, 我們都知道「詞」是NLP世界中的最小單元, 關於詞的知識歡迎參考: 簡單來說,主要的目的是將文本轉換為模型可以處理的數據, But…, 他主要的任務並不是像jieba…等斷詞器一樣, 而是很單純的扮演文字與模型的橋
Thumbnail
前面我們介紹了「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」, 我們都知道「詞」是NLP世界中的最小單元, 關於詞的知識歡迎參考: 簡單來說,主要的目的是將文本轉換為模型可以處理的數據, But…, 他主要的任務並不是像jieba…等斷詞器一樣, 而是很單純的扮演文字與模型的橋
Thumbnail
新聞稿是記者在採訪後需要立即且快速進行的工作,這邊文章主要是說明如何透過輸入法將常用的「長詞 / 句」快速輸出,以及透過詞庫功能,將人名、機關單位名、各名詞簡寫、專有名詞等資訊快速學起來,有效避免後續打錯字。 1. 結合各大輸入法 2. 文字範本|一秒輸出 如何使用文字範本? 3. 個人詞庫
Thumbnail
新聞稿是記者在採訪後需要立即且快速進行的工作,這邊文章主要是說明如何透過輸入法將常用的「長詞 / 句」快速輸出,以及透過詞庫功能,將人名、機關單位名、各名詞簡寫、專有名詞等資訊快速學起來,有效避免後續打錯字。 1. 結合各大輸入法 2. 文字範本|一秒輸出 如何使用文字範本? 3. 個人詞庫
Thumbnail
這篇文章能帶你的收穫將超乎你的想像,除了可以避免你或你所在的公司浪費無數時間、金錢在一些沒有意義的事情上面虛耗(譬如調參數、重新訓練,採用錯誤的機器學習方法或架構),也可以讓你或你的公司在獲得相關知識之後,能更正確的理解當前的環境與制定出更好的市場戰略。LSTM技術的致命缺陷也在此顯現出來!
Thumbnail
這篇文章能帶你的收穫將超乎你的想像,除了可以避免你或你所在的公司浪費無數時間、金錢在一些沒有意義的事情上面虛耗(譬如調參數、重新訓練,採用錯誤的機器學習方法或架構),也可以讓你或你的公司在獲得相關知識之後,能更正確的理解當前的環境與制定出更好的市場戰略。LSTM技術的致命缺陷也在此顯現出來!
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
Thumbnail
Google 一直致力於透過機器學習改善自家翻譯系統的準確度,利用人工智慧的力量提升機器翻譯品質,並於今年八月發表新機器學習模型 Universal Transformer。隨著機器學習模型不斷演進,AI 處理翻譯時的邏輯和策略也與真人譯者越來越相似。 原文連結
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News