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
字 (word): 句子裡的獨立意義段落
字符 (character): 字碼表裡的獨立符號
詞 (phrase): 字+詞綴(構詞/句法)
符記 (token): 自定切分規格後的結果
詞彙 (lexicon): 字典中列出的獨立項目
詞條 (entry): 資料庫中列出的獨立項目
語言是「語音」+「意義(語意)」+「結構(句法)」
文字是「語言的記號」
文本分析的目標在處理「語言記號」(音/意/結構),而不是單純的「符號分佈」而已
在自然語言處理中, 詞是最小而且有意義單位
這句話是有問題的!(ex:小朋友->小 朋 友 獨自皆有意義)
人類:
自然語言
句子的結構 - 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., 頭痛、臉紅、腦殘、
並列:「字 + 字」,但兩個字符的意義相近。
花園城堡、機關團體、
偏正:「字 + 字」,但意義由後者決定。
攻擊直升機、電腦硬碟、消費者
述補:「字 + 字」,但意義由前者決定。
吃不起、笑死人、吃壞肚子
述賓:「字 + 字」
主謂:「字 + 字」
整數 (interger): 程式語言的「整數」值
浮點數 (float): 程式語言的「小數」值
字串 (string): 程式語言裡的「字符串」
符記 (token): 自定切分規格後的結果
詞彙 (lexicon): 字典中列出的獨立項目
詞條 (entry): 資料庫中列出的獨立項目
透過「二元」的句法樹 (Syntax Tree),單一一個句法樹,就能處理人類全部的自然語言
自然語言都有「遞迴」的結構。
遞迴確認了一件事:世界上不存在最長的句子。
遞迴暗示了一件事:句子具有最小結構
你稱之為「句子」,事實上只是一個「變數」(variable)
指代消解 (Coreference Resolution)
C-Command 關係:
尋找句子的終點
對「語言」而言,不存在最長的句子!
任何句子都可再加上多個形容詞、副詞、子句來延長。
對「文本」而言,句子的長度則有限。
前處理
文本處理很像一種「漁業」
網眼太大:只撈得到大魚和大型垃圾
網眼太小:大小魚和垃圾都一起撈起來
適當處理手法:
斷句 (a.k.a. 去除標點符號)
斷詞 (今天以 "Jieba" 斷詞為例)
去除語意意含較低的詞彙 (HOW?)
TF-IDF 就是 "keyword (關鍵詞)" 嗎?
斷詞要做什麼:CWS (Chinese Word Segmentation)
N-Gram
https://medium.com/手寫筆記/自然語言處理-使用-n-gram-實現輸入文字預測-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/機器學習應用-垃圾訊息偵測-與-tf-idf介紹-含範例程式-2cddc7f7b2c5
def 關鍵字_人的直覺():
具有代表性意義的詞彙
def TF-IDF():
和別的文件相比最不一樣的字串
定義:
停用詞大致分為兩類。一類是人類語言中包含的功能詞…與其他詞相比,功能詞沒有什麼實際含義,比如'the'、'is'、'at'、'which'、'on'等…。另一類詞包括詞彙詞,比如'want'等,這些詞應用十分廣泛,但是對這樣的詞搜尋引擎無法保證能夠給出真正相關的搜索結果,難以幫助縮小搜索範圍,同時還會降低搜索的效率,所以通常會把這些詞從問題中移去,從而提高搜索性能。
思考:
對中文而言,停用詞應該具有什麼特徵?
功能詞 (詞性)
短 (單一字符「的」、「是」…)
列個完整的停用詞表,對中文而言是最佳方案嗎?
https://zh.wikipedia.org/wiki/停用词
利用「正規表示式」(regular expression) 擷取資訊
依句法學原理設計的中文 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/#
NLTK 是英文 (及其它西方語系) 自然語言處理的經典工具
回憶一下 NLP 進行文本前處理的幾個項目:
sentence segmentation (斷句)
lemmatization (字型還原)
stopword (停用詞)
word segmentation (斷詞)
pos (詞性標記)
ner (命名實體辨識)
nltk.sent_tokenize()
Lemmatization => 找出「word 的原型」(沒有時態標記,沒有單複數標記)
Stemming => 找出「word 的字根」(字根不像一個字是正常,但要挖多深?)
兩種主要的 stemming 錯誤:overstemming (挖太深)、understemming (挖太淺)
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()
剩下自己去看文檔
詞頻?
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 任務上,變得比較有用一點點。)
事件
語意學(semantic)和程式語言(python,java)
lambda abstraction 是同一件事
事件應用
解數學題
輿情分析
自動學習知識表徵
知識圖普
知識表
機器學習 (Machine Learning) 在 NLP 領域裡是一個「逐步失真」的過程
從「頻率」到「維度」
one hot encoding
用機率計算前後文關係
兩種視角之一:CBOW (連續詞袋模型)
兩種視角之二:Skip-gram (跳詞)
不只是 word 可以 2vec 哦!就連 sentence 也能把它 2vec
把所有的文件都向量化後,就能計算兩篇文章「像不像?有多像?」
word2vec 解決 NLP 的文法/語意問題
https://medium.com/pyladies-taiwan/自然語言處理入門-word2vec小實作-f8832d9677c8
重新思考:word2vec 在中文裡,究竟代表了什麼?
和印歐語系的語言相比之下,中文的詞綴非常貧乏,因此「前後上下文」沒有幾個會固定出現的元素。
word2vec 使用時機:
假如我們擁有大量文體相似的語料 (光是幾篇狗咬人的文章是不夠的)
每個詞都能被它前後文算出向量,並用這個向量來表示它在維度空間的位置
文體相似 (例如新聞體裁、朋友對話體裁、正式書信體裁…),表示句型會類似。句型類似,表示「詞彙順序」變化不大。
大量語料,表示「在變化不大的情況」下,模型幾乎已經涵蓋了所有可能的變化。如果語料的「量不夠大」,則模型沒辦法涵蓋所有可能的變化。如果語料的「文體不相似」,則變化太大,模型一樣無法涵蓋所有可能的變化。