前陣子同事文字處理的程式遇到空白段落發生異常錯誤而中斷執行。TRIM 函數可以去除半形空白、換行字元、Tab 定位字元。但是看起來空白的字元,卻無法使用 TRIM 函數去除,可能是其他的空白字元。解決方式是偵測段落內有沒有包含英文、數字、漢字,再進行後續處理。
Photo by Matt Bango on StockSnap |
問題狀況
文章段落已經前處理 (preprocessing),將段落依照換行符號分成不同句子,再進行斷詞。但是處理過程中遇到空白段落,會發生異常導致整個程式中斷。雖然已經使用 TRIM 函數去除前後空白,但是仍然遇到同樣異常狀況。
解決方式
TRIM 函數可以去除半形空白、換行字元、Tab 定位字元。但是看起來空白的字元,卻無法使用 TRIM 函數去除,可能是其他的空白字元 (whitespace character),例如:
- 全型空白 (ideographic space)
- 不換行空白 (non-breaking space) 如果是透過網路爬蟲抓取的資料,很容易遇到這種類型空白
- 控制字元 (control character)
- 非列印字元 (non-printable characters)
因為無法很快使用 TRIM 函數去除,又無法快速找到處理方式,所以反過來思考什麼「什麼是非空白」?段落中包含:
- 包含英文字
- 包含數字
- 包含漢字
只要符合「什麼是非空白」以上其中一個條件,才進入斷詞程序,就可以忽略程式本身遇到看似空白就會異常中斷的問題。使用正則表示式的語法:
[a-zA-Z0-9\x{4e00}-\x{9fa5}]+
語法說明
- [ .. ]:符合中括號內任一字元
- [ .. ]+:符合中括號內任一字元至少一字
- 英文字:上方語法 a-zA-Z
- 數字:上方語法 0-9
- 漢字:上方語法 {4e00}-\x{9fa5}
綜合上方條件,符合英文字、數字、漢字等至少一字以上 (線上測試正則表示式語法)
相關資料
- trim function - RDocumentation
- Whitespace character - Wikipedia
- Non-printing character in word processors - Wikipedia
- 漢字 - 維基百科,自由的百科全書 右邊有提到 Unicode 範圍
- 中日韓統一表意文字列表 - 維基百科,自由的百科全書 「中日韓統一表意文字(英語:CJK Unified Ideographs)是Unicode區段,收錄了現代漢語與日語最常用的漢字。 中日韓統一表意文字區段包含了20,992個漢字,編碼範圍為U+4E00–U+9FFF」
- cjk - What's the complete range for Chinese characters in Unicode? - Stack Overflow
留言
張貼留言