# 文本分析與程式設計筆記 ###### 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up