Skip to content
南科自造基地研習Part 2
📆2019-08-27 | 📂Workshop

人工智慧―自然語言處理與聊天機器人開發。


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
    • 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與助教們的用心講解,受益良多。

Last updated: