自然語言處理 NLP 幼幼班入門課程筆記
3 |
要深入應用 LLM 免不了會涉及自然語言處理(Natural Language Processing)觀念與知識,像是 RAG 前置處理就有可能用到分詞、向量索引比對會用到 TF-IDF、BM25 等演算法。寫程式做出東西很有趣,學理論相對枯燥。
在圖書館找到一本給高中生看的 NLP 介紹,淺顯易懂又包含實作練習,我把它當成閒書翻完,先記關鍵字,日後有機會用到再深入。
節錄重點:
- NLP 分成 NLU (Understanding)、NLG (Generation)
- 自然語言的一大挑戰:同一詞彙在不同情境意義不同、換句話說/不同句子同一個意思
- 主要應用:Information Retrival 資訊檢索、Information Extraction 資訊擷取、Setiment Analysis 情緒分析、Question Answering 問答任務、Machine Translation 機器翻譯
- 傳統 NLP:資料預處理 -> 特徵工程 -> 模型建立 -> 進行預測
- 資料預處理:
Tokenization 斷詞 - 將語料 Corpus 切成小單位
Stemming 詞幹處理 - goes 轉 go, doing 轉 do
過濾無意義標點、詞彙:句號分號,無意義詞如 the, which (術語 - 停用詞 Stop Words) - 特徵工程:向量化,One-Hot、TF-IDF (需要領域專家投入)
- 使用深度學習:資料預處理 -> (詞向量層 -> 隱藏層 -> 輸出層) -> 進行預測。( ... ) 部分為類神經網路
- Tokenization 斷詞 - 將文本拆成一系列詞彙,詞彙拼接後等同原文。
折分後的詞彙是 NLP 最小單位,又名 Token。最簡單做法是「字典分詞」。 - 中研究平衡語料庫 http://asbc.iis.sinica.edu.tw 、Project Gutengerg、Brown Corpus、ChineseNlpCorpus、CKIP
- 斷詞標記方式:人工(準確但一致性差且主觀,通貨膨脹 vs 通貨+膨脹 )、自動及半自動(一致但較不準確)
- 分詞演算法:前向最大匹配(Forward-max Matching)、後向最大匹配(Backward-Max Matching)、雙向最大匹配(Bi-Directional-Max Matching)
設最大長度 max_length,先從 max_length 開始,沒匹配就移除一個字再匹配
雙向:前後各一次,依詞彙數較少、相同時取單一字較少取較優者 - Python 程式庫:Keras、TensorFlow、 CNTK(Microsoft Cognitive Toolkit)、Theano
- 結巴 Jieba 中文斷詞工具,使用普遍 / 繁中結巴 github.com/APCLab
- Jieba 功能模式:
精確模式(Default Mode) - 可還原原句
全模式(Full Mode) - 找出所有可能詞彙,無法組合原句
搜尋引擎模式(Cut for Search) - 將長詞彙再切分方便搜尋 - Jieba add_word 自訂詞彙、load_userdict 載入自訂字典
- Jieba analyse.extract_tags 取關鍵字
- 中研院 CKIP Tagger 斷詞(Word Segmentation/Tokenization)、詞性標註(Part-Of-Speech, POS Tagging)、命名實體識別(Name Entity Recognition, NER)
詞性標註標記列表 https://ckip.iis.sinica.edu.tw/service/corenlp/ws = WS('./data') # 分詞 ws_results = ws('我達達的馬蹄是美麗的錯誤') pos = POS('./data') # 詞性 pos_results = pos(ws_results) ner = NER('./data') # 命名實體 ner_results = ner(ws_results, pos_results)
- One-Hot:
keras.preprocessing.text Tokenizer fit_on_texts() 、texts_to_sequences()、texts_to_matrix()
- Bag-of-Words 詞袋表示法,字典每個字一維,數字是出現次數,不管順序數字大權重高
CountVectorizer() fit_transform()、get_feature_names()
- TF-IDF 解決詞袋文字總字數不同、無義常用詞(a, the)問題,
tf-idf(w) = tf(d, w) * idf(w)
,sklearn.feature_extration.text TfidfTransformer
- N-Gram,N 元語法,簡易 LM,常用來文本生成,透過機率填空 (nltk 套件)
原理:由前面 N 個詞預測下一詞的機率 (bigram 考慮前一字、trigram 考慮前兩字) - 2013 捷克資料科學家 Toma Mikolov 提出 Word2Vec,Word Embedding,可實現
國王 - 他 + 她 = 皇后
- 類神經網路:輸入層 + 隱藏層 + 輸出層
正向傳播:訓練資料 輸入層 -> 隱藏層 -> 輸出層
反向傳播:結果誤差 輸出層 -> 隱藏層 -> 輸入層
依誤差調權重,重覆上述過程真到誤差最小 - Skip-gram 模型:滑動視窗,中心詞彙左右為輸出詞彙,向下滑動掃完所有詞彙產生訓練資料
- CBOW 模型:由周圍詞彙預測中心詞彙
- 監督式學習(分類、迴歸)、非監督式學習(群聚,無標準答案)、自監督式學習(Skip-gram、CBOW,由原始資料整理出標準答案)
- 中文詞彙向量庫 Chinese-Word-Vectors、英文詞向量 GloVe(Global Vectors for Word Presentation)
- Python Gensim 函式庫,提供 Word2Vec 模組 (Skip-gram/CBOW)
- 深度學習:介紹兩種類神經網路:Recurrent Neural Network RNN, Long Shrt-Term Memory LSTM
- 序列資料 Sequence Data, 與時間、先後順序有相依性的資料,股票價格、句子裡的單字,順序換掉會喪失意義
- 傳統 NN:Mutli-Layered Preceptron 多層感知機、Convolutional Neural Networks CNN 卷積
無記憶功能,沒有 Sequential Memory - 1989 Time-Delay Neural Networks, TDNN,聲音辨識,延遲一段時間取下個 x,先前 x 也納入計算
- 1990 Elman Networks,隱藏層輸出用 Context Unit 神經元儲存下來,之後也做為輸入。另有變形 Jordan Networks
- RNN 被應用在語音辨別、時間序列預測(Time Series Prediction)、NLP
- RNN 種類:One to Many (一輸入對多輸出,看照片描述其中物件)、Many to One (多輸入一輸出,情緒分析)、Many to Many (多輸入多輸出,等長:Speech Enhancement、不等長:機器翻譯)
- LSTM 可彌補 RNN 記憶太短問題。 閱讀筆記 - LLM 模型發展歷程基本知識
- 練習:IMDB 電影資料庫情緒分析
TensorFlow, tf.keras.datasets.imdb.load_data() # 評論 [1,14,...,2,19,178,32] 單字索引矩陣, label = 0 負評 1 正評 imdb.get_word_index() # 索引對映單字陣列,0-2 保留 sequences.pad_sequances() # 補足長度 Sequential()、Embedding() SimpleRNN(32) # 32 維詞向量,準確率 72% LSTM(32) # 準確率 82%
- 練習:詞性標註, Natural Language ToolKit NLTK
import nltk nltk.download('treebank') # 合併 treebank, brown, conll2000 三個資料集共 72,202 筆 # 句子及詞性分別放 words 及 tags # 建立字典,將資料轉成訓練資料 # TensorFlow 三種模型建立方式:Sequential API、Functional API、Model Subclassing(定義類別) # 使用 TensorFlow data pipeline 訓練流程加速訓練 # RNN:Embedding 層、SimpleRNN 層、Dense 層、TimeDistributed 層(所有詞的隱狀態都要預測),95% 準確率 # LSTM:98% 準確率
【線上資源】
另有教學影片及簡報,佛心來著:學 AI 真簡單 Ⅲ - 輕鬆學自然語言處理-電腦這樣理解語言
Comments
# by Joker
我堂妹是中文系,我都推薦他練個python 來好好結合分詞,針對不同模型需求去建立詞彙表,繁中分詞表。 應該就是繁中大語言模型的未來。
# by Allen C.
CNTK(Microsoft Cognitive Toolkit) 和 Theano 在 2024 年的現在已不再維護了,現在比較常用的應該是 PyTorch。
# by twboy
謝謝分享,正準備學習怎麼使用 Python 斷詞統計