近年來 Thread 是個很流行的社群媒體,相信大家在滑脆的時候應該會覺得密密麻麻的文字,看得非常眼花撩亂...
在處理文字資料時,經常會遇到很雜亂的內容,像是多餘的空格、亂七八糟的標點符號、特殊符號,甚至還有錯字。這些對電腦來說都是雜訊,如果不先清理,我們就很難從中提取出有用的資訊。甚至在後續我們用來訓練模型時,也會大大影響模型的表現。
因此,文本清理是 NLP 的第一步,也是非常關鍵的一步。它決定了後續整個任務的成敗 — 正所謂「Garbage in, garbage out」!
Regex 是我們在做文本處理得好幫手~它讓我們可以用有限且特定的字符,來描述我們所讀的文字,也可以說它是一套用於「搜尋和匹配」的規則。
它最主要的用途有:
Regex | 用途 |
---|---|
\d |
數字 (0-9) |
\D |
非數字 |
\w |
字母 (大小寫Aa-Zz) 跟數字 (0-9) |
\W |
非字母跟數字 |
\s |
空白格 |
\S |
非空白格 |
\n |
換行符號 |
\t |
tab |
. |
\n 以外所有字元 |
這個要搭配它的前一個字元使用,做數量的乘法
Regex | 用途 |
---|---|
* |
0 或更多 |
+ |
1 或更多 |
? |
0 或 1 |
{n} |
n 個 |
{n,} |
最少 n 個 |
{n,m} |
n 到 m 個 |
Regex | 用途 |
---|---|
^ |
字串開頭或多行字串中每一行的開頭 |
$ |
字串結尾或多行字串中每一行的結尾 |
\A |
字串開頭 |
\Z |
字串結尾 |
\b |
詞語邊界 |
\B |
非詞語邊界 |
\< |
詞語開頭 |
\> |
詞語結尾 |
Regex | 用途 |
---|---|
(abc) |
abc 作為一個群組 |
(a|b) |
a 或 b |
[abc] |
a 或 b 或 c |
[^abc] |
非 a 或 b 或 c |
[0-9] |
數字 0-9 |
[A-Q] |
大寫字母A-Q |
[a-q] |
小寫字母a-q |
當我們真的要指涉某個特殊符號,而不是要使用它的匹配功能時,要使用 \
Regex | 用途 |
---|---|
\? |
? (不是數量匹配字元) |
當我們需要從文章中抓取某些有特定模式的資訊時,就可以使用 Regex 輕鬆匹配!
台灣的手機號碼都是09開頭,總共有十碼,我們可以用以下表達式:
09\d{8}
日期通常會有固定的格式,像是YYYY-MM-DD
,我們可以用以下表達式:
\d{4}-\d{2}-\d{2}
Email也會有固定的格式,像是以下:
aaa@gmail.com
bbb@yahoo.com.tw
ccc123@hotmail.com
我們可以用以下表達式:
\w+@[a-z]+\.com\.?[a-z]*
\w+
:開頭可能會是字母跟數字混合,並且是一個字元以上@[a-z]+
:@
後面會是不同的信箱因此不會有數字,並且也是一個字元以上\.com
:因為這裡的.
是要直接指涉.
,而不是用作匹配所有字元的功能,因此要用escape的斜線\.?
:後面的區域名不一定會出現因此用?
代表.
會出現 0 或 1 次[a-z]*
:區域名只會是字母並且不一定會出現,因此用 0 或以上Regex 真的是十分好用的文本清理工具~~雖然一開始上手會有點不習慣,也需要花比較多時間去記住規則還有去想要怎麼做轉換。在最後推薦的大家兩個練習的好幫手:
下一篇會進一步介紹 Python 中使用 Regex 的套件 re
,還有介紹幾個比較簡單且常用的功能~