要深入應用 LLM 免不了會涉及自然語言處理(Natural Language Processing)觀念與知識,像是 RAG 前置處理就有可能用到分詞、向量索引比對會用到 TF-IDF、BM25 等演算法。寫程式做出東西很有趣,學理論相對枯燥。

在圖書館找到一本給高中生看的 NLP 介紹,淺顯易懂又包含實作練習,我把它當成閒書翻完,先記關鍵字,日後有機會用到再深入。

節錄重點:

  1. NLP 分成 NLU (Understanding)、NLG (Generation)
  2. 自然語言的一大挑戰:同一詞彙在不同情境意義不同、換句話說/不同句子同一個意思
  3. 主要應用:Information Retrival 資訊檢索、Information Extraction 資訊擷取、Setiment Analysis 情緒分析、Question Answering 問答任務、Machine Translation 機器翻譯
  4. 傳統 NLP:資料預處理 -> 特徵工程 -> 模型建立 -> 進行預測
  5. 資料預處理:
    Tokenization 斷詞 - 將語料 Corpus 切成小單位
    Stemming 詞幹處理 - goes 轉 go, doing 轉 do
    過濾無意義標點、詞彙:句號分號,無意義詞如 the, which (術語 - 停用詞 Stop Words)
  6. 特徵工程:向量化,One-Hot、TF-IDF (需要領域專家投入)
  7. 使用深度學習:資料預處理 -> (詞向量層 -> 隱藏層 -> 輸出層) -> 進行預測。( ... ) 部分為類神經網路
  8. Tokenization 斷詞 - 將文本拆成一系列詞彙,詞彙拼接後等同原文。
    折分後的詞彙是 NLP 最小單位,又名 Token。最簡單做法是「字典分詞」。
  9. 中研究平衡語料庫 http://asbc.iis.sinica.edu.tw 、Project Gutengerg、Brown Corpus、ChineseNlpCorpus、CKIP
  10. 斷詞標記方式:人工(準確但一致性差且主觀,通貨膨脹 vs 通貨+膨脹 )、自動及半自動(一致但較不準確)
  11. 分詞演算法:前向最大匹配(Forward-max Matching)、後向最大匹配(Backward-Max Matching)、雙向最大匹配(Bi-Directional-Max Matching)
    設最大長度 max_length,先從 max_length 開始,沒匹配就移除一個字再匹配
    雙向:前後各一次,依詞彙數較少、相同時取單一字較少取較優者
  12. Python 程式庫:Keras、TensorFlow、 CNTK(Microsoft Cognitive Toolkit)、Theano
  13. 結巴 Jieba 中文斷詞工具,使用普遍 / 繁中結巴 github.com/APCLab
  14. Jieba 功能模式:
    精確模式(Default Mode) - 可還原原句
    全模式(Full Mode) - 找出所有可能詞彙,無法組合原句
    搜尋引擎模式(Cut for Search) - 將長詞彙再切分方便搜尋
  15. Jieba add_word 自訂詞彙、load_userdict 載入自訂字典
  16. Jieba analyse.extract_tags 取關鍵字
  17. 中研院 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)
    
  18. One-Hot:keras.preprocessing.text Tokenizer fit_on_texts() 、texts_to_sequences()、texts_to_matrix()
  19. Bag-of-Words 詞袋表示法,字典每個字一維,數字是出現次數,不管順序數字大權重高
    CountVectorizer() fit_transform()、get_feature_names()
  20. TF-IDF 解決詞袋文字總字數不同、無義常用詞(a, the)問題,tf-idf(w) = tf(d, w) * idf(w)sklearn.feature_extration.text TfidfTransformer
  21. N-Gram,N 元語法,簡易 LM,常用來文本生成,透過機率填空 (nltk 套件)
    原理:由前面 N 個詞預測下一詞的機率 (bigram 考慮前一字、trigram 考慮前兩字)
  22. 2013 捷克資料科學家 Toma Mikolov 提出 Word2Vec,Word Embedding,可實現 國王 - 他 + 她 = 皇后
  23. 類神經網路:輸入層 + 隱藏層 + 輸出層
    正向傳播:訓練資料 輸入層 -> 隱藏層 -> 輸出層
    反向傳播:結果誤差 輸出層 -> 隱藏層 -> 輸入層
    依誤差調權重,重覆上述過程真到誤差最小
  24. Skip-gram 模型:滑動視窗,中心詞彙左右為輸出詞彙,向下滑動掃完所有詞彙產生訓練資料
  25. CBOW 模型:由周圍詞彙預測中心詞彙
  26. 監督式學習(分類、迴歸)、非監督式學習(群聚,無標準答案)、自監督式學習(Skip-gram、CBOW,由原始資料整理出標準答案)
  27. 中文詞彙向量庫 Chinese-Word-Vectors、英文詞向量 GloVe(Global Vectors for Word Presentation)
  28. Python Gensim 函式庫,提供 Word2Vec 模組 (Skip-gram/CBOW)
  29. 深度學習:介紹兩種類神經網路:Recurrent Neural Network RNN, Long Shrt-Term Memory LSTM
  30. 序列資料 Sequence Data, 與時間、先後順序有相依性的資料,股票價格、句子裡的單字,順序換掉會喪失意義
  31. 傳統 NN:Mutli-Layered Preceptron 多層感知機、Convolutional Neural Networks CNN 卷積
    無記憶功能,沒有 Sequential Memory
  32. 1989 Time-Delay Neural Networks, TDNN,聲音辨識,延遲一段時間取下個 x,先前 x 也納入計算
  33. 1990 Elman Networks,隱藏層輸出用 Context Unit 神經元儲存下來,之後也做為輸入。另有變形 Jordan Networks
  34. RNN 被應用在語音辨別、時間序列預測(Time Series Prediction)、NLP
  35. RNN 種類:One to Many (一輸入對多輸出,看照片描述其中物件)、Many to One (多輸入一輸出,情緒分析)、Many to Many (多輸入多輸出,等長:Speech Enhancement、不等長:機器翻譯)
  36. LSTM 可彌補 RNN 記憶太短問題。 閱讀筆記 - LLM 模型發展歷程基本知識
  37. 練習: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%
    
  38. 練習:詞性標註, 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 斷詞統計

Post a comment