# 文本分析與程式設計筆記 ###### tags: `learn` `AI` `course` class: 台灣師範大學 109 學年上學期通識課程:文本分析與程式設計 source: https://www.youtube.com/watch?v=BBJohKMkBsA&list=PLA2WqPu6vscClEI-30pvr9esIJt_cpUFd&ab_channel=DroidtownDroidtown github: https://github.com/PeterWolf-tw/NTNU_TextProcessing_2021 ppt: https://bit.ly/TextProc_Week13 GPT-3: https://en.wikipedia.org/wiki/GPT-3 ## L1 ### 中文裡,什麼是一個「字」? 字 (word): 句子裡的獨立意義段落 字符 (character): 字碼表裡的獨立符號 詞 (phrase): 字+詞綴(構詞/句法) 符記 (token): 自定切分規格後的結果 詞彙 (lexicon): 字典中列出的獨立項目 詞條 (entry): 資料庫中列出的獨立項目 語言是「語音」+「意義(語意)」+「結構(句法)」 文字是「語言的記號」 文本分析的目標在處理「語言記號」(音/意/結構),而不是單純的「符號分佈」而已 在自然語言處理中, 詞是最小而且有意義單位 這句話是有問題的!(ex:小朋友->小 朋 友 獨自皆有意義) ## L2 ### 語言的基礎是結構! 人類: 自然語言 句子的結構 - Syntax (句法) 詞彙的結構 - Morphology (構詞) 電腦: 程式語言 程式的結構 - Syntax (語法) 詞彙的結構 - Reserved Keywords (保留關鍵字)、Statement (陳述)、class (類別) 和 function (函式) ### 自然語言 Syntax tree (一句一樹) 語言學(假設): 所有的人類大腦結構是一致的 所有的人類都具有一樣的語言處理機制 人類的語言習得機制允許參數改變 所有語言的差異是來自參數的差異 參數的變化是有限的 日文動詞:參數為 ”head final”: sakanao taberu 中文動詞:參數為 ”head first”: eat fish 句子裡都會有一個用來表示它的型別的東西,像中文問句的「嗎」表示它是一個 yes-no 問句,而「是不是」也是一個 yes-no 問句,所以你就不會說「你是不是沒吃飯嗎」,因為同一個功能在句法樹上只有一個結點,而一個結點不能塞兩個東西。  ### 中文:字的常見結構 並列:「字符 + 字符」,但兩個字符的意義相近。 e.g., 語言、價值、嘲諷、花草 偏正:「字符 + 字符」,但意義由後者決定。 e.g., 皮鞋、鐵路、火車、微笑 述補:「字符 + 字符」,但意義由前者決定。 e.g., 擊敗、推翻、摔破、改善 述賓:「字符 + 字符」,第一個「字符」通常可做獨立的動詞「字」,第二個字符則是前者的受詞。 e.g., 爬山、解題、傷心、賣命 主謂:「字符 + 字符」,第一個字符通常可做獨立的名詞「字」,第二個字符則為獨立的動詞或形容/副詞 e.g., 頭痛、臉紅、腦殘、 ### 中文:詞的常見結構 並列:「字 + 字」,但兩個字符的意義相近。 花園城堡、機關團體、 偏正:「字 + 字」,但意義由後者決定。 攻擊直升機、電腦硬碟、消費者 述補:「字 + 字」,但意義由前者決定。 吃不起、笑死人、吃壞肚子 ### 句法層次 述賓:「字 + 字」 主謂:「字 + 字」 ## 自然語言 in 程式語言 整數 (interger): 程式語言的「整數」值 浮點數 (float): 程式語言的「小數」值 字串 (string): 程式語言裡的「字符串」 符記 (token): 自定切分規格後的結果 詞彙 (lexicon): 字典中列出的獨立項目 詞條 (entry): 資料庫中列出的獨立項目 ## L3 透過「二元」的句法樹 (Syntax Tree),單一一個句法樹,就能處理人類全部的自然語言 自然語言都有「遞迴」的結構。 遞迴確認了一件事:世界上不存在最長的句子。 遞迴暗示了一件事:句子具有最小結構  ## L4 你稱之為「句子」,事實上只是一個「變數」(variable)   ## L5 選擇控制及句法學 指代消解 (Coreference Resolution)   C-Command 關係:  ## L6 迴圈控制及句法學 尋找句子的終點 對「語言」而言,不存在最長的句子! 任何句子都可再加上多個形容詞、副詞、子句來延長。 對「文本」而言,句子的長度則有限。 ## L7 文本前處理:Jieba 斷詞、詞性標記與句法學 前處理 文本處理很像一種「漁業」 網眼太大:只撈得到大魚和大型垃圾 網眼太小:大小魚和垃圾都一起撈起來 適當處理手法: 斷句 (a.k.a. 去除標點符號) 斷詞 (今天以 "Jieba" 斷詞為例) 去除語意意含較低的詞彙 (HOW?) TF-IDF 就是 "keyword (關鍵詞)" 嗎? 斷詞要做什麼:CWS (Chinese Word Segmentation) N-Gram https://medium.com/%E6%89%8B%E5%AF%AB%E7%AD%86%E8%A8%98/%E8%87%AA%E7%84%B6%E8%AA%9E%E8%A8%80%E8%99%95%E7%90%86-%E4%BD%BF%E7%94%A8-n-gram-%E5%AF%A6%E7%8F%BE%E8%BC%B8%E5%85%A5%E6%96%87%E5%AD%97%E9%A0%90%E6%B8%AC-10ac622aab7a Jieba 結巴斷詞 https://github.com/fxsjy/jieba 背景: 1998 人民日報 新詞基於 HMM (隱馬可夫模型 Hidden Markov Model) 隱馬可夫模型  重點: TF-IDF TF(term frequency): 詞頻 IDF(inverse document frequency): 逆向文件頻率 TF是處理每一個「文件」中所有「詞」的問題。 IDF是處理每一個「詞」在所有「文件」中的問題。 https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E6%87%89%E7%94%A8-%E5%9E%83%E5%9C%BE%E8%A8%8A%E6%81%AF%E5%81%B5%E6%B8%AC-%E8%88%87-tf-idf%E4%BB%8B%E7%B4%B9-%E5%90%AB%E7%AF%84%E4%BE%8B%E7%A8%8B%E5%BC%8F-2cddc7f7b2c5 def 關鍵字_人的直覺(): 具有代表性意義的詞彙 def TF-IDF(): 和別的文件相比最不一樣的字串 #### 停用詞 (stop word) 定義: 停用詞大致分為兩類。一類是人類語言中包含的功能詞…與其他詞相比,功能詞沒有什麼實際含義,比如'the'、'is'、'at'、'which'、'on'等…。另一類詞包括詞彙詞,比如'want'等,這些詞應用十分廣泛,但是對這樣的詞搜尋引擎無法保證能夠給出真正相關的搜索結果,難以幫助縮小搜索範圍,同時還會降低搜索的效率,所以通常會把這些詞從問題中移去,從而提高搜索性能。 思考: 對中文而言,停用詞應該具有什麼特徵? 功能詞 (詞性) 短 (單一字符「的」、「是」…) 列個完整的停用詞表,對中文而言是最佳方案嗎? https://zh.wikipedia.org/wiki/%E5%81%9C%E7%94%A8%E8%AF%8D ## L8 文本前處理:CKIPTagger 斷詞、詞性標記與句法學 https://www.datasciencecentral.com/profiles/blogs/is-bert-always-the-better-cheaper-faster-answer-in-nlp-apparently 利用「正規表示式」(regular expression) 擷取資訊 ## L9 文本前處理:Articut NLP 系統與句法學 依句法學原理設計的中文 NLP 系統 Articut 不靠資料訓練,而依句法結構計算斷詞、詞性及命名實體。因為不需資料訓練,對隱私保護具有先天的優勢。 CWS + POS + NER 同時完成降低因分段訓練造成的良率下滑問題,使最終應用產品良率基準提高。 ArticutAPI:All-in-one 的工具組 使用: lv1: 極致斷詞 (斷到「構詞內部」結構) lv2: 詞組斷詞 (斷到「詞組」結構) lv3: 各種「語意」相關資訊 .getPersonLIST(): 取得全文中的「人名」 .getVerbStemLIST(): 取得全文中的「動作」(動作即事件) .getNounStemLIST(): 取得全文中的「實體」(實體即參與者) docs:https://api.droidtown.co/ArticutAPI/document/#093fdcd494 online:https://api.droidtown.co/# ## L10 NLTK 基礎功能介紹 ### NLTK: Natural Language Tool Kit NLTK 是英文 (及其它西方語系) 自然語言處理的經典工具 回憶一下 NLP 進行文本前處理的幾個項目: sentence segmentation (斷句) lemmatization (字型還原) stopword (停用詞) word segmentation (斷詞) pos (詞性標記) ner (命名實體辨識) ### Sentence tokenize (斷句) nltk.sent_tokenize() ``` import nltk sentenceLIST = nltk.sent_tokenize(inputSTR01) print(sentenceLIST) ``` ### Word Lemmatization vs. Stemming Lemmatization => 找出「word 的原型」(沒有時態標記,沒有單複數標記) Stemming => 找出「word 的字根」(字根不像一個字是正常,但要挖多深?) 兩種主要的 stemming 錯誤:overstemming (挖太深)、understemming (挖太淺) ``` import nltk nltk.download('wordnet') from nltk.stem import WordNetLemmatizer lemm = WordNetLemmatizer() from nltk.stem import PorterStemmer stem = PorterStemmer() inputWord = "communication" print(lemm.lemmatize(inputWord)) print(stem.stem(inputWord)) ``` Stopwords: 停用詞 stopwords.words("english") 斷詞 nltk.word_tokenize() Word Segmentation Part-of-speech (POS):詞性標記 nltk.pos_tag() 词性标记集: https://www.ibm.com/docs/zh/wca/3.5.0?topic=analytics-part-speech-tag-sets Named Entity Recognition (NER):命名實體辨識 nltk.ne_chunk() 剩下自己去看[文檔]([https://](https://www.nltk.org/api/nltk.html)) ## L11 字詞頻率語料分析與語意分析 詞頻? NLP 尚未出現「直接聽得懂/讀得懂」語言的工具 主因是「懂」的工程定義尚不明確,最接近的是「數學應用問題」的解題挑戰 輸入法自動選字/矯正/矯誤:https://mcbopomofo.openvanilla.org/textpool.html 文本生成 (加上 ML/DL):https://ckip.iis.sinica.edu.tw/service/gpt2/ 語言學習教材設計:https://elearning.ling.sinica.edu.tw/CWordfreq.html 用「詞頻」做語意分析 「關鍵詞」的「詞頻比較高」是一個常見假命題;「詞頻較高」則有可能為「關鍵詞」。 若「關鍵詞的詞頻比較高」此描述為真,則我們得到「台灣關係法四十週年談話」的重點是「關係法」的一系列方法,應該同樣可以得到「館長直播逐字稿」的重點才對。 換言之,若計算詞頻可以得到 X 文本的重點,而無法得到 Y 文本的重點,則這個方法就無法保証抓到的是重點。 如果一個方法無法保証抓到重點,而你卻覺得「抓到了」,可見這個重點,很有可能是你的「腦補」產生的。 如果你「一定要」用詞頻方法,請「正確、仔細、依需求」調整你的前處理步驟,而不要粗暴地跟它拼了! 最後,詞頻本身沒有什麼用,但它啟發了後續許多諸如詞/句向量和機器翻譯的方法。 (至少在西方語系的 NLP 任務上,變得比較有用一點點。) ## L12 文本事件結構分類與語意分析 事件 語意學(semantic)和程式語言(python,java) lambda abstraction 是同一件事  事件應用 解數學題 輿情分析 自動學習知識表徵 知識圖普 知識表 ## L13 詞向量文本分類模型與機器學習 機器學習 (Machine Learning) 在 NLP 領域裡是一個「逐步失真」的過程  從「頻率」到「維度」 one hot encoding 用機率計算前後文關係 兩種視角之一:CBOW (連續詞袋模型) 兩種視角之二:Skip-gram (跳詞) 不只是 word 可以 2vec 哦!就連 sentence 也能把它 2vec 把所有的文件都向量化後,就能計算兩篇文章「像不像?有多像?」 word2vec 解決 NLP 的文法/語意問題 https://medium.com/pyladies-taiwan/%E8%87%AA%E7%84%B6%E8%AA%9E%E8%A8%80%E8%99%95%E7%90%86%E5%85%A5%E9%96%80-word2vec%E5%B0%8F%E5%AF%A6%E4%BD%9C-f8832d9677c8  重新思考:word2vec 在中文裡,究竟代表了什麼? 和印歐語系的語言相比之下,中文的詞綴非常貧乏,因此「前後上下文」沒有幾個會固定出現的元素。 word2vec 使用時機: 假如我們擁有大量文體相似的語料 (光是幾篇狗咬人的文章是不夠的) 每個詞都能被它前後文算出向量,並用這個向量來表示它在維度空間的位置 文體相似 (例如新聞體裁、朋友對話體裁、正式書信體裁…),表示句型會類似。句型類似,表示「詞彙順序」變化不大。 大量語料,表示「在變化不大的情況」下,模型幾乎已經涵蓋了所有可能的變化。如果語料的「量不夠大」,則模型沒辦法涵蓋所有可能的變化。如果語料的「文體不相似」,則變化太大,模型一樣無法涵蓋所有可能的變化。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.