Text Preprocessing Method
Why we need to preprocess text?
在現實世界中取得的數據非常凌亂,因此在使用機器學習處理NLP問題前,首先需要將數據進行適當處理,才能過濾有效資料。
然而在文字預處理同時,也會做feature engineering,將一些重要的特徵保留下來,以便後續模型的訓練 ?
General Text Preprocess
根據數據取得的平臺,處理的方式會有所不同。比如:twitter的tweets 會有@mention,#hashtag, URL…etc;Instagram有 #hashtag。另外,現今emoji、縮寫語和網路用語十分發達,這些文字與表情符號都需要經過一定程度的處理才能用來訓練模型。
基本上,一般文字預處理有以下幾個步驟:
- remove punctuations/ emoji
- remove numbers
- lowercase
- remove stopwords
- stemming/ lemmatization
- remove frequent and infrequent words
- tokenization
以上是很簡略的敘述文字預處理,但就像我先前提過的不同的raw text會需要不同的處理方式才能更大地發揮數據的價值。在此以sentiment analysis - based on social media為例記錄下自己遇到的問題:
Emoji
😊😭😤😂emoji是一個重要的情感判定因素,因此remove all emojis 不是一個好方法,可以運用一些python package將其轉換為emoji description。(BTW 這是我在社群媒體上最常用的emoji: 😂,又哭又笑地是要逼死做sentiment analysis的人嗎哈哈哈)
Punctuations
在social media上,常有"what???" or "oh my god!!!"類似這種consequent punctuations出現的時候。通常會給人一種語氣加重/強調/驚訝的情感,因此remove all punctuations may not seem a good way. 另一個可能發生的問題是: hyphenated words. 例如: well-known, one-year-old,若將中間符號(-)移除,意義可能改變。在處理標點符號問題,因取決於文本分析問題的目的。
縮寫語/網路用語
以中文"爺青回"為例,進行分詞後變成:爺/青/回,三字單看無特殊意義,但實際上三字合在一起時,意思為:爺的青春回來了。以英文為例,像是"OMG","SOTY"也是一樣的。在這一類處理上,我目前想到的是透過一個dictionary來記錄所有縮寫語/網路用語,並透過mapping將其替換為日常用語。
Stop words/高頻詞&低頻詞
在一個句子中經常出現但並沒有帶出太多意義的詞,我們稱之為Stop words。在英文中常見的停用詞像是:a, is, the, not…etc. 在情感分析案例上,移除所有停用詞會是一個災難。舉個例子,“I am not happy to be with you"原意是負面的,但在移除全部停用詞後,整句只留下正面的"happy”。因此要視所解決的問題,和EDA之後了解所有Data,才決定停用詞的增減或去留。
而在高頻和低頻詞也是一樣的,建議將高頻和低頻詞移除,才能過濾出真實有效的數據。這裡可以使用TF-IDF model來做計算。
Conclusion
Text preprocessing(NLP in machine learning) 是一個需要花時間FEATURE ENGINEERING/FINE-TUNING的領域,如前言所提,文字真的太雜了XD。
*後記:這2年Deep learning興起,許多大規模的pre-trained models 像是 BERT, GPT-3在NLP上取得了相當大的進展。但我的hands-on experience相對較少,還得趕緊練功去!
|