人工智慧―自然語言處理與聊天機器人開發。
Part 2於8/26 ~ 8/27在成大系統系館進行,講師為A.P. Wen-Hsiang Lu。
研習內容大綱
- 自然語言處理(NLP)技術和應用簡介
- 自然語言處理工具練習
- 命名實體識別(NER)語意分析練習
- 聊天機器人(ChatBot)實作練習
筆記
- NLP的最終目標—自動化的語言理解/處理/分析/推理
- NLP的重要性—使人機互動能做到真正的「溝通」
- 語言句法結構
- 例1:日文為SOV結構(動詞在句尾)
- 例2:原民語為VSO結構(動詞在句首)
- 語言學相關知識類型
- 聲學知識(音譯)
- 詞彙學知識(字根)
- 詞性知識
- 文法知識
- 語意學知識
- 實用知識:情境如何影響句子的解釋
- 世界知識:我的理解是common sense,例如「I read an article about OOO in the paper.」,我們會「直覺」地認為句子中的paper指的是「論文」。
- NLP相關技術
- 概率與資訊理論
- 語言學知識
- 字彙/詞庫/語料庫/片語/詞義辨識
- N-gram語言建模/隱性馬可夫模型
- 詞性標記
- 文法解析
- 深度學習
- 計算語言學
- 語言描述:普遍性與跨語言研究
- 計算模型的實現
- 演算法與資料結構
- 知識表徵模型
- 推理過程模型
- 心理語言學
- 人類為語言理解可計算性的存在證明
- 心理學研究可以被用來解釋計算模型
- NLP技術問題
- 龐大的字彙量/無數的現象與規則
- 不規則變化(例外、例外中的例外...)
- 字彙/情境/文法中的歧義
- 網路時代的多語言問題
- 語言障礙(人類語言據估算約有5000到7000種)
- 資訊過載
- NLP相關應用
- 機器翻譯
- 自動語音識別
- (跨語言)資訊檢索
- (跨語言)問題回答
- 文本摘要
- 資訊抽取
- 對話系統/聊天機器人
- NLP基本機率模型
- N-gram Language Model
- Hidden Markov Model(HMM)
- NLP深度學習模型
- 模型發展:訓練結果的詞向量由非上下文相關 --> 上下文相關(詞彙於不同句子中有各自的向量表示)
- Word2Vec
- CBOW(Continuous Bag of Words):利用周圍的詞預測中心的詞
- Skip-gram:利用中心的詞預測周圍的詞,訓練時間久、結果較CBOW準確
- RNN(Recurrent Neural Network)
- LSTM(Long Short-Term Memory)
- Seq2Seq(Sequence to Seqence)
- Seq2Seq with Attention
- 命名實體識別(NER)
- 擷取文字資料中的人名、地名、組織名等目標實體進行分析、標記
- 模型構建
- Rule-based:
- Pos Tagging Pattern + statistic
- Dictionary-based
- Traditional ML-based:
- Hidden Markov Model(HMM)
- CRF(Conditional Random Field) + template
- DL-based:
- LSTM(Long Short-Term Memory)
- LSTM with Attention
- Rule-based:
- Viterbi Algorithm(維特比演算法)
- 動態規劃演算法
- 在語音辨識中,聲音訊號做為觀察到的事件序列,而文字字串被視為隱含產生聲音訊號的原因,因此可對聲音訊號應用維特比演算法尋找出最有可能的文字字串。
- CRF++:條件隨機域詞性標記工具
- 線上工具
實作練習
中文斷詞工具
此工具使用了教育部國語辭典(16萬詞)來協助斷詞比對,練習用Python實作一個中文斷詞工具,大致上的概念為「先斷句,再斷詞」。
程式範例:先用正則式比對各種標點符號進行斷句後,再逐句來處理斷詞。斷詞的部分,則是由左至右循序比對、抽取出句子中最長的詞,然後再比對剩下的句子...透過重複前述步驟來拆解句子。
python
#!usr/bin/env python3
# coding:utf-8
import re
book = {}
result = ""
def segment(sentences):
lines = re.split(r'[,。;:!?/()「」『』【】]', sentences)
end = len(lines) - 1
if lines[end] == '':
del lines[end]
return lines
def compare(txt):
end = len(txt)
res = ""
while end != 0:
if txt[0:end] in book:
res = txt[0:end]
break
end -= 1
res = res if res != "" else txt
return res
def breakSen(txt):
global result
str_len = len(txt)
start = 0
end = str_len + 1
while start < str_len:
_slice = txt[start:end]
word = compare(_slice)
result += word
start += len(word)
if start != str_len:
result += "/"
with open('words.txt', 'r', encoding='utf-8') as file:
lines = file.read().splitlines()
for line in lines:
book[line] = line
txt = "長頸鹿屬是一屬生長在非洲的反芻偶蹄動物,共有四個物種,是現存世界上最高的陸生動物。一般雄性個體高達4.8到5.5公尺高,重達900公斤。雌性個體一般要小一些。"
print("\ntxt : \n\n", txt, "\n")
sentences = segment(txt)
print("segment : \n\n", sentences, "\n")
for s in sentences:
breakSen(s)
if s != sentences[len(sentences) - 1]:
result += "/"
print("result : \n\n" + result, "\n")
聊天機器人
使用Google Dialogflow負責NLP,並與Line Channel串接為可自動回應的Chatbot。網路上基礎教學很多,因此設定過程省略,基本上就是建立一個Agent來負責處理回應的接收和傳送,在Agent底下可以建立Intents以及Entities來設定對話流程、關鍵字。
心得
透過盧老師的詳細講解,讓大家了解到自然語言處理(NLP)所涉及包含社會科學等各方面的技術知識,以及在NLP領域還有許多難題尚待解決,如果少了NLP相關技術的話,未來的人機互動將會缺少相當重要的一塊,而人類的語言是如此多元、複雜,絕非單純把數據無腦地丟進深度學習模型就能解決(自從Google DeepMind讓阿發狗秀了一波騷操作後,人們聽到AI深度學習什麼的就像聽到傳說中的EX咖哩棒Excalibur呀😂)。
經過Part 2的研習,對於NLP中所謂的「斷詞」總算是有較完整的概念了,雖然自己在工作上有寫過Line與Web聊天機器人,但我自己明白那有多粗糙,就只是抓取關鍵字做出相對的回應罷了,一點兒都不智慧😕 我想我接下來可以嘗試使用NLP來做點什麼,並從經驗中更進一步理解關於NLP的知識。
感謝A.P. Wen-Hsiang Lu與助教們的用心講解,受益良多。