MaDi's Blog

一個紀錄自己在轉職軟體工程師路上的學習小空間

0%

NLP自然語言處理的小小心得

前言

半年前接觸到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
2
3
4
from sklearn.model_selection import train_test_split

# 可以自定義參數 test_size 或 train_size 的比例
x_train, x_val, y_train, y_val = train_test_split(X_train, Y_train, test_size=VALIDATION_RATIO, random_state=RANDOM_STATE)

7. 採用有記憶的循環神經網路架構模型(RNN)

Simple RNN
LSTM
BERT

  1. 通常遇到分類問題,模型的最後一層Dense會採用: softmax(適合多分類) 或是 sigmoid(適合二分類)

    因為 softmax 與 sigmoid 能將數字作正規化(Normalization),將它們全部壓縮到 0~1 之間,並讓它們的和等於1,符合機率的特性

  2. 分類問題中常用的損失函數(loss function)cross-entropy交叉熵,用來計算模型判斷的結果與正解的結果兩者的差異,給機器自動學習。
  3. batch_size: 決定每批放入幾筆訓練資料給模型看完後更新參數
  4. num_epochs: 代表模型會重複看整個訓練資料集幾次

8. 訓練驗證資料(fit)

model.fit(…)

9. 測試資料(test)

model.predict(…)

參考: