相信大家讀完前兩篇的內容後,對於自然語言處理都已經有些基本的認識。接下來,在執行 NLP 操作以及在實際進入 code 之前,讓我們一起來理解 NLP 任務的執行流程,幫助大家熟悉,且在實際操作時有個步驟依據,才不會在執行過程中迷失方向~
簡單來說,NLP 的步驟可以分為 3 個部分:
預處理(Pre-processing) -> 建立語言模型(Modeling) -> 執行任務/產出結果
本篇著重於 Pre-processing 的過程
資料的預處理是 NLP 的第一個步驟,也是最重要且過程最繁瑣的一步。重要的原因是資料呈現的型態與研究目的、任務執行目的息息相關,即必須要明確知道自己要執行的目標是什麼,才能決定最初的語料要處理到什麼程度、以什麼格式呈現、刪除哪些資料等等......而繁瑣的原因也是因此而來,不僅要符合目的,更要整理與適應各式各樣資訊紛雜的語料。由上述可知,所謂的預處理,即是將原始資料 (raw data) 中遺漏或不需要的資料去除的過程。去除不需要的資料後,我們還需將剩下的資料進行整理、分類或重新編排,以利未來建立模型時存取與執行。在 NLP 任務中,最常見的 Pre-processing 步驟包括使用爬蟲 (crawler) 獲得語料、運用正規表達式 (regular expression) 篩選、整理文字內容和斷詞 (tokenization)。因為根據不同的需求,爬取的資料大不相同,故這邊從 regular expression 開始講解,也就是預設大家手邊已經有需要處理的 raw data 了!
regular expression 可以用來尋找、驗證、抽取資料,接下來就來看一些實作練習吧!
新建一個 R Markdown 的檔案
讀取 .txt 檔案
text = scan('/Users/biaoyun/Documents/Ithome/example_sentence.txt', sep='\n', what = character()) # 運用 scan() 讀取檔案,以 \n 即 enter 分割
head (text) # head() 可以瀏覽前六筆資料
讀取後結果如下圖
grep("^t", text, ignore.case = T, perl = T, value = T) # ^符號表示開頭
找出符合 t 開頭的句子 (ignore.case = T 表示忽略大小寫,改為 F 則是不忽略大小寫)
執行結果為: "This is the first example sentence." , "There are four sentences." 這兩個句子。
grep("es\\.$", text, ignore.case = T, perl = T, value = T) # $符號表示結尾
找出結尾為 es. 的字串,這邊值得注意的是「.」這個符號。因為 . 在 regular expression 中有其他意義,等下會提到,故需要「\」來告訴電腦,這邊要找的是「.」本身
執行結果為:"There are four sentences." 只有這個句子符合要求
grep("s.c", text, ignore.case = T, perl = T, value = T) # .代表任意字元
這邊就是前面提到的「.」在 regular expression 中的作用,此方法會刪選出 s_c,空格是任意字元的組合。
執行結果為:"And this is the second example sentence." 只有此句裡面的 second 符合這個規則。
grep("f...t", text, ignore.case = T, perl = T, value = T)
執行結果為:"This is the first example sentence."
這邊可以看到「.」代表空的字元數量,也可用以下程式碼代替
grep("f.{3}t", text, ignore.case = T, perl = T, value = T) # {} 內代表這個字元出現的次數
gsub(".", "!", text) # 將 text 中的.替換成!
這個 code 執行後會發現變成下圖這樣了!!!
想必有認真看到這裡的大家已經知道為什麼了吧~答案就是「.」是特殊字元,故需要「\」來讓電腦知道現在只是單純要找「.」,因此,修改一下 code
gsub("\\.", "!", text) # 將 text 中的.替換成!
執行結果為:
[1] "This is the first example sentence!"
[2] "And this is the second example sentence!"
[3] "Other example sentence!"
[4] "There are four sentences!"
new_text = gsub("\\.", "!", text) # 將結果儲存成新的vector
這邊附上 regular expression 的 cheat sheet 供大家參考和進行更多練習喔(https://cheatography.com/davechild/cheat-sheets/regular-expressions/)
最後給大家一個作業練習看看吧!
Day 3 Assignment : 將 dates 改成 dd/mm/yyyy 格式
# 練習作業
dates = "American dates: ’8/15/2022’, ’9.13.2021’, ’2.7.2020’. "
執行結果為:"American dates: ’8/15/2022’, ’9.13.2021’, ’2.7.2020’"
也就是經過 regular expression 處理之後最終要看到以下這樣的結果:
"8/15/2022, 9.13.2021, 2.7.2020"