前言
半年前接觸到NLP自然語言處理的範疇,起初對這項技術完全沒概念,只知道電腦好像可以猜出我講的話,幸好在幾個專家耐心解釋之後總算對這個領域有點眉目,自己跳下去研究後大概整理出一些分析的流程,近期工作上常常會需要用到這項技術,因此用這篇文章紀錄一下研究的心得。
何謂自然語言處理?
用一句話來形容自然語言
讓電腦擁有理解人類語言的能力,就是自然語言處理 (Natural Language Processing,NLP)
這項領域仍在大量的持續研究,比起影像辨識更難做到高分,因為語言實在太過複雜,連人類都很難定義其規則,更遑論要讓一台只懂0跟1的電腦懂我們在講什麼鬼。
至於要如何透過NLP去處理文字以便讓電腦去判讀呢? 這就是NLP在處理的問題,簡單來說,跟其他AI模型做一樣的事情,第一步準備大量資料,第二步做前處理,第三步透過不同的模型去訓練驗證,第四步讓電腦預測人類說的話,最後再判斷表現的好壞。
分析流程:
1. 文本分詞(Tokenize)
會先去掉標點符號(punctuation)與無意義的停用字(StopWords)
英文直觀上靠空白斷詞,常見套件為
nltk
(有Lemmatization
詞型還原功能)中文靠
jieba
斷詞(有詞意功能)或其他tokenizer的套件
例如:
美國總統大選開票看這裡川普拜登誰會主掌白宮
用jieba
套件斷詞後就變成
美國 總統 大選 開票 看 這裡 川普 拜登 誰 會 主掌 白宮
2. 建立字典並將文本轉成數字序列(Text to Sequence)
依照文本的詞彙量編成一個大的字典,並把詞彙轉成數字
把分詞後的各個詞彙轉成數字序列:
{'美國': 0, '總統': 1, '大選': 2, '開票': 3, '看': 4, '這裡': 5, '川普': 6, '拜登': 7, '誰': 8, '會': 9, '主掌': 10, '白宮': 11}
3. 序列的 Zero Padding
長度超過
MAX_SEQUENCE_LENGTH
的截掉長度不足
MAX_SEQUENCE_LENGTH
的在前面補零
4. 詞向量詞嵌入(Word Embedding):將詞彙表達成有意義的向量
塞入RNN模型的每個詞彙不能單單只是數字序列,應該用張量(Tensor)表示,也就是一個N維向量
因為當維度提高,才更能看出文字之間的距離(相似度)
在NLP裡,這種將一個詞彙或句子轉換成一個實數詞向量的技術被稱為詞嵌入(Word Embedding)
常見的word embedding方式有
word2Vec
,Glove
舉上例來說:
[0,1,2...]
的數字序列中的每一個數字都變成N維的向量
[ [0.077, 0.695, 0.776...], [0.624, 0.962, 0.96...], [0.456, 0.927, 0.404...] ]
透過此方法,逐步修正隨機初始化的詞向量,使得詞向量裡頭的值越來越有意義
5. 將答案做 One-Hot Encoding
把序列轉成矩陣才能讓GPU進行平行運算,提高運算速度
可以把分類結果想成機率分佈
例如:
有三個分類的問題,原先用{0:第一類, 1:第二類, 2:第三類}
,但如果轉成用[0,1,0]
表示分類成第二個的結果,就是one-hot encoding。好處是當模型分類出來的機率是[0.2,0.5,0.3]
的時候,可以很快地計算出與正解[0,1,0]
的差異,自動修正機器學習,拉近彼此的差異。
6. 切割Train & Validate的資料集
train_test_split
1 | from sklearn.model_selection import train_test_split |
7. 採用有記憶的循環神經網路架構模型(RNN)
Simple RNN
LSTM
BERT
…
- 通常遇到分類問題,模型的最後一層
Dense
會採用:softmax
(適合多分類) 或是sigmoid
(適合二分類)因為 softmax 與 sigmoid 能將數字作正規化(Normalization),將它們全部壓縮到 0~1 之間,並讓它們的和等於1,符合機率的特性。
- 分類問題中常用的損失函數(loss function) 是
cross-entropy交叉熵
,用來計算模型判斷的結果與正解的結果兩者的差異,給機器自動學習。 batch_size
: 決定每批放入幾筆訓練資料給模型看完後更新參數num_epochs
: 代表模型會重複看整個訓練資料集幾次
8. 訓練驗證資料(fit)
model.fit(…)
9. 測試資料(test)
model.predict(…)