iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
AI & Data

語言學與NLP系列 第 3

Day 3 語料預處理 (Pre-processing) 解說+實作

  • 分享至 

  • xImage
  •  

相信大家讀完前兩篇的內容後,對於自然語言處理都已經有些基本的認識。接下來,在執行 NLP 操作以及在實際進入 code 之前,讓我們一起來理解 NLP 任務的執行流程,幫助大家熟悉,且在實際操作時有個步驟依據,才不會在執行過程中迷失方向~

簡單來說,NLP 的步驟可以分為 3 個部分:
預處理(Pre-processing) -> 建立語言模型(Modeling) -> 執行任務/產出結果
本篇著重於 Pre-processing 的過程

語料預處理 Pre-processing

資料的預處理是 NLP 的第一個步驟,也是最重要且過程最繁瑣的一步。重要的原因是資料呈現的型態與研究目的、任務執行目的息息相關,即必須要明確知道自己要執行的目標是什麼,才能決定最初的語料要處理到什麼程度、以什麼格式呈現、刪除哪些資料等等......而繁瑣的原因也是因此而來,不僅要符合目的,更要整理與適應各式各樣資訊紛雜的語料。由上述可知,所謂的預處理,即是將原始資料 (raw data) 中遺漏或不需要的資料去除的過程。去除不需要的資料後,我們還需將剩下的資料進行整理、分類或重新編排,以利未來建立模型時存取與執行。在 NLP 任務中,最常見的 Pre-processing 步驟包括使用爬蟲 (crawler) 獲得語料、運用正規表達式 (regular expression) 篩選、整理文字內容和斷詞 (tokenization)。因為根據不同的需求,爬取的資料大不相同,故這邊從 regular expression 開始講解,也就是預設大家手邊已經有需要處理的 raw data 了!

Regular Expression in R

regular expression 可以用來尋找、驗證、抽取資料,接下來就來看一些實作練習吧!

  1. 新建一個 R Markdown 的檔案
    New File

  2. 讀取 .txt 檔案


text = scan('/Users/biaoyun/Documents/Ithome/example_sentence.txt', sep='\n', what = character()) # 運用 scan() 讀取檔案,以 \n 即 enter 分割

head (text) # head() 可以瀏覽前六筆資料

讀取後結果如下圖
result 1

grep()

  1. 利用 grep() 篩選資料 grep()的結構是 grep("pattern", "file", ignore.case = T, perl = T, value = T)

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

  1. 利用 gsub() 替換資料 gsub()的結構是 gsub("要替換的 pattern", "替換成的 pattern", "file")

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!"

  1. 最後記得要將修改後的 vector 存成新的 vector 喔!

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"


上一篇
Day 2 語言學與自然語言處理 環境安裝篇
下一篇
Day 4 語料預處理 斷詞與停用詞篇
系列文
語言學與NLP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言