什麼是自然語言處理(Natural Language Processing, NLP)?
在上一節(5-7c)我們利用Apple語音辨識與ChatGPT API做出人機對話,讓使用者開口提問,然後由程式回答,一問一答,如此反覆。程式本身不難,最難之處其實在於問題的答覆,筆者曾問一個問題:
🗣 "假如你是一位高中老師,相較於數學、英文、自然等科目,你要如何對學生表達程式設計獨特的重要性?"
這個問題想點出目前台灣程式設計教育的困境,程式設計目前雖然列為高中必修,但因為不像國、英、數這些升學考試科目,並沒有得到學生或家長應有的重視。然而,隨著人工智慧的迅速發展,加上資訊產品對生活滲透率越來越高,程式設計做為跨領域學習最佳工具,其必要性已迫在眉梢。
這個問題顯然沒有標準答案,每個人會有不同看法,也不是簡單的 Yes or No 或用關鍵字搜尋得到的。我們來看 ChatGPT 如何回答:
💡 "作為一位高中老師,我認為程式設計的獨特重要性在於它是一門全新的、革命性的學科,它把傳統的數學、英文、自然等科目融合在一起,形成了一個全新的學科體系。
首先,程式設計是一門有用的學科,它能夠幫助學生解決現實生活中的問題。現代社會越來越依賴科技和信息技術,而學習程式設計可以讓學生對科技和信息技術的發展有更深入的理解,並且可以用所學知識來創造新的技術產品,解決現實生活中的問題。
其次,程式設計是一門培養學生創新思維的學科。在程式設計的過程中,學生需要不斷創新,提出新的思路和解決方法,這能夠培養學生的創新思維和創造力。
最後,程式設計是一門有前途的學科。信息技術產業是當今社會發展速度最快、最具前景的行業之一,學習程式設計可以為學生未來的發展打下堅實的基礎,有助於他們成為有競爭力的人才。
綜上所述,我認為程式設計是一門獨特且重要的學科,學生應該認真學習,充分發揮它的優勢,為未來的發展奠定良好的基礎。"
仔細閱讀之後,不得不說,ChatGPT 的回答相當有說服力,非常有「人味」。這顯然不是單純把文字湊在一起而已,有幾點是一般 AI 不容易做到的:
1. 回答十分切題,這必須對問題的語義要有所理解。
2. 條理分明,彼此連貫,絕不是簡單的複製-貼上能做到的。
3. 邏輯嚴密,沒有明顯的錯誤或可辯駁的漏洞。
這是怎麼做到的呢?難道機器已經能夠思考了嗎?
這就是本課「自然語言處理」(NLP)的範疇,雖然本課無法學到 ChatGPT 背後的原理,但是學個起步是可以的。
從上面這個問答範例可以看出,要正確回答問題,首先必須對「問題」有所了解,不能誤解語義,才能判斷哪些答案在問題範圍內,哪些答案與問題無關。
如何教機器理解人類語言的含義呢?這是個非常困難的挑戰,也是當初(約60年前)人工智慧發展「自然語言處理」的最初目標 — 希望有朝一日,機器能聽懂人話,並且對答流利。我們何其幸運,能親身見證這個夢想成真。
隨著近年 AI 技術的發展,讓機器理解語義,現在只算是基礎功夫,由此而上,可發展出許多應用,例如這兩年非常熱門的「AI 繪圖」,以及 AI 寫文章、作曲、翻譯…等等,甚至以後 AI 可以寫劇本、拍電影!這些都是從理解語義開始。
5-8a 中文斷詞(NLTokenizer)
自然語言處理初期的發展,是從「語法分析」開始,語法(syntax)是比語義(symantics)更基本的語言規則,也就是在一個句子中,區分出主詞、動詞、受詞、介系詞…等基本單位,這個動作稱為「斷詞」(word segmentation),對東方語系(中、日、韓、阿拉伯語等)來說特別困難,是人工智慧初期的第一道關卡。
對英文(或所有拉丁語系)而言,語法規則相對單純,只要前後是空格、標點(除了連字符號 hyphen -)所隔開的就是一個單字(word),但是對中文來說,卻沒那麼容易,例如:
「全台大露營活動明天開始報名」
這句話的主詞是「全台大露營活動」,「明天」是時間副詞,「開始報名」是動詞。其中,主詞有兩種含義,一是「全台/大露營/活動」,二是「全台大/露營/活動」,得視上下文而定。
對電腦而言,要如何斷詞呢?理想的AI,應該要先斷成兩子句:
「全台大露營活動」
「明天開始報名」
再斷詞:
「全台/大露營/活動」或「全台大/露營/活動」
「明天/開始/報名」
我們用實際程式來測試看看。
本節先學習 Apple 原廠的 NaturalLanguage 自然語言框架(物件名稱以NL開頭)其中兩個基本物件:
1. NLLanguageRecognizer — 語言辨識器,用來判別文字的主要語言
2. NLTokenizer — 斷詞器,對字串進行斷句或斷詞
其中,token 的字面意思是「代幣」「令牌」或其他有象徵意義的替代事物,在自然語言處理的領域中,token 代表語法分析後的最小單位,也就是斷詞後的每個部分。例如上述「全台/大露營/活動」,包含三個 token — 「全台」「大露營」「活動」,這也是上節課 ChatGPT API收費的計算單位(每 1000 tokens 計費 0.002美元)。
我們用以下範例,對「全台大露營活動明天開始報名」這句話進行兩個動作:(1) 偵測主要語言 (2) 斷詞。
// 5-8a 自然語言處理(1):中文斷詞 NLTokenizer
// Created by Heman, 2023/05/18
import NaturalLanguage
let 文本 = "全台大露營活動明天開始報名"
// 第一段:辨識主要語言
guard let 主要語言 = NLLanguageRecognizer.dominantLanguage(for: 文本) else {
print("Error: 無法判斷主要語言")
exit(-1)
}
print(主要語言)
// 第二段:斷詞
let 斷詞器 = NLTokenizer(unit: .word)
斷詞器.setLanguage(主要語言)
斷詞器.string = 文本
// 第三段:列印
let 全文範圍 = 文本.startIndex ..< 文本.endIndex
let 索引陣列 = 斷詞器.tokens(for: 全文範圍)
for i in 索引陣列 {
print(文本[i])
}
注意程式中用到字串的索引,和一般陣列索引方式不同,字串的索引用法請參考第4單元第3課4-3c。
在主控台可以觀察到,主要語言判斷為繁體中文(zh-Hant),斷詞結果如下:
NLLanguage(_rawValue: zh-Hant)
全
台大
露營
活動
明天
開始
報名
看來「全台」或「台大」兩種斷詞方式,程式認為「台大」機率比較高。

💡 註解
- 嚴格來說,所謂「自然語言處理」,處理的對象其實是文字;語言與文字含義稍有不同,從發展歷史來看,人類先有語言,後有文字,文字用來記錄語言。
- 但是到了現代,同一種文字所對應的,可能不只一種語言,例如日語中的漢字,與中文用的其實是相同文字(同一個Unicode編碼);又如英語、法語、德語大部分文字是相同的拉丁字母;俄語、斯拉夫語與中亞許多語言都採用西里爾文字(Cyrillic)…等等。所以程式中必須指定何種語言所用的文字。
- 上節課所提到的「金鑰」(key),在某些原文文件中,也稱為 token (令牌/權仗)。總之,token 就是某種象徵的替代物,例如令牌的意義就是替代本人(發號施令或認證)的物品。
- 在上一課5-7b ChatGPT API的範例中,有沒有注意到我們在提問時並未指定語言,顯然ChatGPT 會自動判別字串的主要語言,類似NLLanguageRecognizer的功能。
- 若不侷限於Apple的NaturalLanguage框架,一般而言,中文斷詞並沒有一定標準,以「全台大露營」為例,斷詞為「全台/大/露營」、「全/台/大/露營」、「全/台大/露營」都有可能。
- 斷詞背後需要詞組資料庫,目前中文斷詞最常用的開源詞庫為中央研究院CKIP、台北醫學大學MONPA、中國大陸的Jieba(結巴)等三種。
- 有個小地方,在本課一開始的ChatGPT回答中,使用「信息技術」一詞,乃是大陸的用語,台灣通常用「資訊科技」(兩者都是 Information Technology 的翻譯),可見ChatGPT背後的詞庫包含大陸詞彙的比例很可能超過台灣。





































































































