# 章節包:自然語言處理(NLP)W2(9/17)第 05 章「資訊檢索、索引與前處理」
影片 1:20:25–1:48:46,YouTube ID MnA5KUETSg4。Notion 章節頁 https://app.notion.com/p/3e6fc631b0308148a521f4d07ae31526(頁 ID 3e6fc631-b030-8148-a521-f4d07ae31526),頁面標題「05 資訊檢索、索引與前處理(1:20–1:48)」。
## 1. 第一行(直接照抄,不要改)
[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd) › 05|影片 [1:20:25–1:48:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=4825s)|投影片 W1_NLP_brief_v2 p.38–47|上一章 [04 語法層次與深度學習時代(1:08–1:20)](https://app.notion.com/p/3e6fc631b03081768161d6716089043a)|下一章 [06 向量空間模型與 TF-IDF(1:48–2:07)](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)
## 1b. 最後一行(直接照抄,放在 Self-check 後面,當全頁最後一行)
讀完了嗎?下一章:[06 向量空間模型與 TF-IDF(1:48–2:07)](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)|回到週頁:[W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd)
## 2. 各段標題(照順序;每段一個 ## 標題,直接照抄連結)
- `## [1:20:25](https://www.youtube.com/watch?v=MnA5KUETSg4&t=4825s) 從資訊檢索看文字` 老師講什麼:先不用 LLM,看以前怎麼處理文字。WWW 在 1998–99 年起飛後,Google 靠資訊檢索起家,那時資訊檢索的問題幾乎就等於 NLP 的問題。
- `## [1:22:20](https://www.youtube.com/watch?v=MnA5KUETSg4&t=4940s) 資訊檢索兩大重點:索引與排序` 老師講什麼:以前做資訊檢索遇到的問題,現在做 RAG 也會遇到。索引讓暴力搜尋變成 log 等級的搜尋;排序的代表是 Google 的 PageRank。Yahoo 用人工分類網頁(DMOZ),資料一多就撐不住。
- `## [1:25:40](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5140s) Inverted index、term 與 Vocabulary` 老師講什麼:反向索引記錄每個字出現在哪些文件裡。term 是一個字、片語或關鍵字;Vocabulary 是系統要處理的字的集合,以前常用的字典大約三萬字。
- `## [1:27:39](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5259s) LLM 詞表大小:越大越好嗎` 老師講什麼:LLM 的詞表大約 32K–256K。詞表越大,參數量(詞表大小乘上向量維度)越多,解碼時要算機率的字也越多,所以各有利弊。
- `## [1:30:20](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5420s) 反向索引怎麼建、怎麼跑得快` 老師講什麼:文章斷詞後,記下每個字出現在第幾篇、第幾個位置,串成 bucket。暴力找字頭會越跑越慢,要用 Hash 做到常數時間,文件編號也要省空間。缺點是只能比對一模一樣的關鍵字。
- `## [1:37:43](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5863s) 前處理:斷詞、詞幹、停用詞` 老師講什麼:Tokenization 是抽出 term,拿掉 HTML 和標點、全部轉小寫。Stemming 用 Porter 演算法砍字尾回到詞根(fish、fisher),但 fishing rod 砍掉就變了意思。拿掉停用詞可以省 20–30% 的索引空間。
- `## [1:42:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6166s) Stemming vs Lemmatization` 老師講什麼:Stemming 照規則砍、速度快,但常產生不是真正單字的詞根(studies 變 studi)。Lemmatization 會考慮詞性和語意,還原成真正的字(study),比較慢但結果比較乾淨。
- `## [1:45:10](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6310s) 停用詞的取捨` 老師講什麼:停用詞因語言和應用而不同,例如新聞裡的「報導」也算。什麼時候拿掉會影響語意,to be or not to be 整句都是停用詞。現在寧願多買記憶體,而且 LLM 對 prompt 裡每個字都很敏感。
## 3. 老師強調/會考/不考的地方(原句已驗證;寫進筆記時 ASR 錯字要改正)
- (1:25:43) [強調] 「這個名詞可能大家就記一下因為這個是博物館會出現的名字叫Inverted index」 → Inverted index(反向索引)這個名詞要記住
- (1:42:49) [強調] 「大家可能要稍微瞭解一下因為它還蠻有用的」 → Lemmatization(詞形還原)要了解
## 4. 這章摘要與重要度
從資訊檢索的角度看文字處理,介紹反向索引和詞表大小,以及斷詞、詞幹還原、詞形還原、停用詞這幾個前處理步驟。(核心)
## 5. 整堂課的提醒(ASR 錯字、老師口誤、投影片缺公式等;只用跟這章有關的)
- 老師 0:04:39 才開始講課,前面約 4 分半逐字稿沒有內容。
- 兩次下課:0:58:52–1:08:43、2:07:15–2:16:39。
- 2:18:33–2:19:11 逐字稿有約 40 秒空白,老師說「沒有抓到畫面」,2:20:21 又問「現在投影是對的吧」。這段錄影可能暫時沒拍到投影片(沒看影片,不確定)。
- 本週投影片是 W1_NLP_brief_v2.pdf(檔名的 W1 不等於上課週),實際講的範圍是 p.3–64;p.2 目錄老師說跳過。
- 投影片起點和已知事實不同:已知事實寫從 p.5 開始,但老師 0:07:25 說跳過 p.2 目錄,接著簡短講了 p.3(以前和現在做法差別的圖),0:09:31 講 p.4「What is NLP」。所以實際範圍是 p.3–64。
- 舊筆記(Notion 封存頁)記的時間和本逐字稿差約 1 分鐘。舊筆記寫下課 0:57:28、2:06:15,續課 1:09:37;本逐字稿是 0:58:52 下課、1:08:43 續課、2:07:15 下課、2:16:39 續課。這份計畫以本逐字稿為準。舊筆記寫的投影片檔是 W1_NLP_brief.pdf,不是 v2。
- 音檔長度 2:59:56,YouTube 是 3:00:07,差 11 秒。逐字稿時間和 YouTube 播放時間有沒有對齊,我沒有逐一驗證(不確定)。
- 2:18:33–2:19:11 逐字稿有約 40 秒空白,老師說「沒有抓到畫面」,這段錄影可能沒拍到投影片(不確定)。
- 2:24:56 老師說 BM25 的引言在「這一份投影片的最後一頁」,實際是 p.94(p.95 是 Summary),而且不在本週講的範圍。
- p.19 是 AI 仿作的《詩師食獅史》(同音字例子)。Strawberry 那段(0:39:43)沒有對應的投影片。
- 有 4 則 emphasis 標成「不考」,但老師原話是「公式不用記」(2:24:31、2:28:40)或「不會提到 GloVe」(2:58:06),不是明說「不考」。寫章節時建議用「老師說不用背/不講」,不要寫成【老師說不考】。
- 第 4 章(約 12 分鐘)和第 7 章(約 13 分鐘)比 15 分鐘短一點。因為兩章都緊貼下課分界,主題也各自獨立,所以沒有併章。
- 逐字稿常見的語音辨識錯字(引用時要改成正確寫法,也可以補進 fix_transcript 的錯字表):小平→小冰、Crystal→Chris(Manning)、STARBOARD→stop words、Wall Embedding/World Embedded→word embedding、World Reputation→word representation、構制學→構詞學、磁→詞、One-Half/One Heart→one-hot、Palsymy→Polysemy、RuCode→recall、O2Bect→word2vec、Bangio→Bengio、imprtindex/Import index→inverted index、Portal→Porter、REG→RAG、Patch rank→PageRank、Uptractive→Abstractive、Passing Tree→parsing tree、WSA→WSD、Tornazion→Tokenization、三國字→三國志、宇步→呂布、Facial Splash→feature space。1:37:48 的「Lesson」可能是 lexical processing(不確定);0:34:4x 的「VirusDM」推測是某種機率模型,可能是 HMM(不確定),所以 NER 那段我只寫 CRF。
## 6. 投影片文字(這章範圍)
**這幾頁的公式或內容只在圖裡(文字檔抓不到),寫 Exam-ready 與公式前先用 Read 看這幾張圖:**
- W1_NLP_brief p.42 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p042.png
- W1_NLP_brief p.45 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p045.png
--- W1_NLP_brief p.38 ---
First meet with text
FROM THE VIEW OF INFORMATION RETRIEVAL
38
--- W1_NLP_brief p.39 ---
Information Retrieval
39
Analyzing the textual content of individual Web pages (documents)
◦given user’s query
◦determine a maximally related subset of documents
Retrieval
◦index a collection of documents (access efficiency)
◦rank documents by importance (accuracy)
Categorization (classification)
◦assign a document to one or more categories
◦Man-made (Yahoo & Dmoz ) vs. automation
--- W1_NLP_brief p.40 ---
Indexing
40
Inverted index
◦effective for very large collections of documents
◦associates lexical items to their occurrences in the collection
Terms
◦lexical items: words or expressions
Vocabulary V
◦the set of terms of interest
LLM vocabulary size 32k ~ 256k
(LLaMA 1&2 (32K), Mistral 7B (32K), GPT-
3 (50K), GPT-4 (128K), Qwen (152K))
Bigger = Better ?
--- W1_NLP_brief p.41 ---
Inverted Index
41
The simplest example
◦a dictionary
◦each key is a term V
◦associated value b() points to a bucket (posting list)
◦a bucket is a list of pointers marking all occurrences of in the text
collection
--- W1_NLP_brief p.42 ---
Inverted Index
42
Bucket entries:
1.
document identifier (DID)
◦
the ordinal number within the
collection
2.
separate entry for each occurrence
of the term
◦
DID
◦
offset (in characters) of term’s
occurrence within this document
◦
present a user with a short
context
◦
E.g., google results
◦
enables vicinity queries
--- W1_NLP_brief p.43 ---
Lexical Processing
43
Performed prior to indexing or converting documents to vector
representations
◦Tokenization
◦extraction of terms from a document
◦Text conflation and vocabulary reduction
◦Stemming
◦reducing words to their root forms
◦Porter algorithm, http://www.tartarus.org/~martin/PorterStemmer/
◦Removing stop words
◦common words, such as articles, prepositions, non-informative adverbs
◦20-30% index size reduction
詞根 詞幹
--- W1_NLP_brief p.44 ---
Tokenization
44
Extraction of terms from a document
◦stripping out
◦administrative metadata
◦structural or formatting elements
Example
◦removing HTML tags
◦removing punctuation and special characters
◦folding character case (e.g. all to lower case)
--- W1_NLP_brief p.45 ---
Stemming
45
Want to reduce all morphological variants of a word to a single index
term
◦e.g. a document containing words like fish and fisher may not be retrieved
by a query containing fishing (no fishing explicitly contained in the
document)
◦But what for fishing rod
Stemming - reduce words to their root form
◦e.g. fish – becomes a new index term
Porter stemming algorithm (1980)
◦relies on a preconstructed suffix list with associated rules
◦e.g. if suffix=IZATION and prefix contains at least one vowel followed by
a consonant, replace with suffix=IZE
◦BINARIZATION => BINARIZE
--- W1_NLP_brief p.46 ---
Stemming vs. Lemmatization
46
Stemming
Lemmatization
Method
Rule-based
Corpus + Syntactic
Output
Not always real word
Real word
Performance
fast
slow
Usage
Search engine, fast
preprocessing
Semantics
understanding, QA, etc.
studies studi
study
--- W1_NLP_brief p.47 ---
Issues about stop words
47
What are stop words ?
◦A static set or dynamic one ?
◦Depend on your application ?
How to remove stop words ?
◦Dictionary-based matching
When to remove stop words ?
◦Avoid to broke the semantics
To be or not to be!
## 7. 逐字稿(1:20:25 前後各多 1 分鐘,原始行)
[01:19:25] 他只是說中間我們會在嫁接一些模型
[01:19:27] 有點像是說
[01:19:29] 以前的應用比較是一個規則式的
[01:19:32] 人工介入式的甚至
[01:19:34] 字典的方式
[01:19:36] 極少用訓練的
[01:19:38] 但是後來我們就是
[01:19:40] 還是覺得因為算力起來
[01:19:42] 資料起來了
[01:19:44] 我們就用Model Training的方式來做這件事情
[01:19:49] 那但是用Model Training
[01:19:50] 厲害歸厲害但是其實它可解釋性就
[01:19:53] 很差
[01:19:54] 雙方學生做出來說老師我這個效果起來
[01:19:58] 那我說為什麼
[01:19:59] 不知道這樣子
[01:20:00] 反正就是模型的功勞
[01:20:02] 這樣子就是
[01:20:03] 這個模型可以把這個問題
[01:20:05] fit的相當的好
[01:20:06] 但是並不代表你解決這個問題
[01:20:09] 而是說他
[01:20:10] 記住了以前的所有的資料這樣子
[01:20:14] 不過這大概是一個抽象的概念的一個flow
[01:20:17] 當然你現在
[01:20:19] 現在可能也不用全部就是
[01:20:22] LM這樣子
[01:20:24] 好
[01:20:25] 那接下來我可能會花
[01:20:28] 一個小時到
[01:20:29] Maybe今天就把
[01:20:30] 時間花在這裡就是我們來看一下文字啊
[01:20:33] 怎麼去做就是說
[01:20:35] 我們現在先不要拿出厲害的武器不要用LM
[01:20:38] 就是說以前用
[01:20:40] 在做
[01:20:41] 文字的時候
[01:20:42] 會做
[01:20:43] 怎麼樣的步驟
[01:20:45] 怎麼去處理這樣子
[01:20:47] 那
[01:20:48] 你可以想像以前NLP
[01:20:50] 雖然
[01:20:51] 翻譯很重要啊
[01:20:53] 雖然這個好像做一個對話機器的很重要
[01:20:56] 但是他的需求性跟他
[01:20:59] 他所看的問題
[01:21:02] 一直到
[01:21:03] 所謂internet起來
[01:21:05] 這個World Wide Web起來之後那個時候
[01:21:08] 才被
[01:21:09] 重視
[01:21:10] 大概在
[01:21:12] 1998 99的時候真的蓬勃發展起來之後大家覺得這一塊非常重要
[01:21:18] 然後到2000年2000年大概
[01:21:21] 可能各位
[01:21:22] 剛出生吧
[01:21:24] 就是那時候網路泡沫化
[01:21:26] 什麼
[01:21:27] 一大堆申請一個Domain Name也可以變成是一個
[01:21:30] 股票
[01:21:31] 非常高的公式這樣子
[01:21:33] 那時候就一大堆因為那時候World Wide Web剛起來一大堆的網站
[01:21:37] 網頁啊然後一大堆部落格那時候部落格非常紅
[01:21:41] 然後呢
[01:21:42] Google也是在那個年代才
[01:21:44] 一炮而紅
[01:21:45] 慢慢取代掉Yahoo
[01:21:48] 變成是一個網路的
[01:21:50] 資訊的霸主這樣子
[01:21:52] 那它的起家就是資訊檢索
[01:21:54] 因為那時候的
[01:21:56] 網路的資料實在太多了
[01:21:57] 如何做一個有效的文字的Assets
[01:22:01] 理解跟存取跟提供給有用的資訊給使用者
[01:22:05] 就是他賣的東西
[01:22:07] 所以那時候
[01:22:09] 資訊檢索的問題
[01:22:11] 就跟NLP的問題幾乎畫上等號了
[01:22:15] 以前我們來看就是我怎麼在大量資料裡面找到我要的部分這樣子
[01:22:20] 所以以前處理文字
[01:22:22] 很大眾都是在做
[01:22:24] 資訊檢索
[01:22:27] 那資訊檢索其實
[01:22:29] 你可以想像如果現在給你一個
[01:22:33] 一個billion
[01:22:34] size的文章
[01:22:35] 好幾好幾篇一個billion個數的文章然後叫你去做一個快速的解鎖
[01:22:41] 快速的解鎖系統
[01:22:42] 這樣子
[01:22:43] 那你怎麼做
[01:22:45] 你說老師我把它丟到大語言模型這樣做個RAG這樣子
[01:22:49] 不錯如果你可以想到RAG
[01:22:52] 他其實資訊檢索他這些技術
[01:22:55] 就是都會用到我們現在在做RAG的問題上
[01:22:59] 以前資訊學者會遇到問題現在你在做RAG也會遇到同樣的問題
[01:23:04] 當然手法可能會不太一樣
[01:23:06] 但是以前在做資訊學者會
[01:23:08] 一開始會遇到就是
[01:23:10] 資料量很大
[01:23:12] 你可以想像這個20年前
[01:23:14] 那個電腦的等級是什麼
[01:23:17] 那個根本沒有這麼大的
[01:23:19] 的運算力跟memory
[01:23:21] 其實都沒有這麼
[01:23:22] 沒有那麼快速
[01:23:23] 怎麼有效率去asset這麼大量的東西
[01:23:26] 所以以前講究的是說我怎麼快速的把資料
[01:23:29] 鑑索引
[01:23:31] 找到
[01:23:32] 我要的
[01:23:33] 然後跟
[01:23:34] 呈現出
[01:23:36] 使用者的
[01:23:37] 的需求的
[01:23:38] 的答案這樣子
[01:23:40] 所以通常我會需要做index
[01:23:43] 如果你學過database你就知道說
[01:23:46] index相當重要如果我不做鎖引我那個大量資料根本找不到
[01:23:50] 那index
[01:23:52] 就會牽扯到一堆
[01:23:53] 資料解構的
[01:23:56] 技巧
[01:23:57] 如果你有一些概念就知道說鎖引相當重要我可以把
[01:24:01] 一個暴力法搜尋的東西可以變成一個比較login的搜尋的方式
[01:24:06] 另外一個重點是排序
[01:24:10] Google當初之所以有名
[01:24:12] ATOP有一個叫Patch rank
[01:24:14] 就是不是看關鍵字
[01:24:16] 而是看這個網頁
[01:24:18] 被多少的人所asset
[01:24:20] 被多少人放了連結
[01:24:22] 他的網頁就相當的重要這樣子
[01:24:25] 所以他有一個排序的方式
[01:24:27] 可以排序的很好這樣子
[01:24:30] 不過這個
[01:24:31] 這些
[01:24:33] 由於是排序都是比較像
[01:24:35] 時代的眼淚這樣就是現在的技術雖然以前很紅但現在
[01:24:39] 也不太會用到這樣子
[01:24:42] OK
[01:24:43] 那以前其實Google還沒出來之前
[01:24:46] 其實Yahoo
[01:24:48] 那時候做什麼事情
[01:24:49] 他其實是用人工的方式去分類
[01:24:52] 就是把所有全世界的網頁呢
[01:24:55] 用人工的方式整理出來
[01:24:57] 政治類的運動類的經濟類然後細分很多category
[01:25:01] 所以你現在也可以找到一個
[01:25:05] Open directory
[01:25:06] 那裡面有一些分類
[01:25:07] 其實就是源自於那樣的
[01:25:09] 一個精神
[01:25:10] DMOZ
[01:25:12] 那這樣的分類其實還蠻有效可以找到有用的東西但是這個資料量
[01:25:18] 漲得太快了他沒有辦法做這樣一件事情
[01:25:21] 所以
[01:25:22] 其實這也是後來Yahoo
[01:25:24] 慢慢的
[01:25:25] 消失的原因
[01:25:26] 就是Google的東西大家越來越愛用
[01:25:29] 所以很多東西只有第一名不會有第二名
[01:25:32] 就這樣消失了這樣子
[01:25:35] Yahoo就慢慢的不見
[01:25:39] 好
[01:25:40] 那我們在做索引的時候呢
[01:25:42] 我們會做
[01:25:43] 這個名詞可能大家就
[01:25:46] 記一下因為這個是博物館會出現的名字叫Inverted index
[01:25:50] 就是
[01:25:52] 中文叫什麼
[01:25:53] 就是你可以看到就是
[01:25:55] 反
[01:25:56] 反字的索引
[01:25:58] 他其實這個只是告訴你
[01:26:00] 等下我們看一個圖你就知道什麼叫Inverted index
[01:26:02] 就是說你要從大量的
[01:26:04] 文章裡面去知道哪一個字
[01:26:06] 在哪幾篇文章你要做一個這樣的索引
[01:26:09] 這樣子就會做一個這樣的索引
[01:26:12] 然後呢我們當時這個做這個索引會
[01:26:15] 會有兩個名詞第一個是ton
[01:26:18] 這個ton呢其實就是你可以想像就是一個字
[01:26:21] 或是一個片語
[01:26:22] 或是一個關鍵字
[01:26:24] 有點像你現在用的一個Token的概念
[01:26:27] 以前叫ton
[01:26:29] 那以前有所謂的Vocabulary
[01:26:32] 這個Vocabulary跟現在的Vocabulary其實意思是一樣只是以前會
[01:26:37] 更去
[01:26:39] 更去在意這件事情因為以前這是要人去見的
[01:26:43] 以前這個字典
[01:26:44] 我說
[01:26:45] 這個我的
[01:26:46] 錢不夠我們就
[01:26:48] 做常用字就好3000個常用字
[01:26:51] 所以我的字典大小就是3000這樣子
[01:26:53] 但是如果一般你英文要做的好大概是
[01:26:56] 要到萬
[01:26:57] 可能要做
[01:26:58] 負文大概是3萬
[01:27:00] 你的字典大小大概是3萬
[01:27:02] 這個字典意思就是所有
[01:27:06] 所有你會處理到的這些
[01:27:09] 字或是表示或是片
[01:27:12] 你就把它放進去這樣子
[01:27:15] 那這個東西其實網路上有
[01:27:18] 像Google當時都release一個data
[01:27:21] 其實是n-gram的data
[01:27:22] 就是
[01:27:23] 各式各樣的一字詞二字詞三字詞四字詞更長的都有
[01:27:28] 它所構成的
[01:27:30] 這些
[01:27:31] 但那個那個大小就不止3萬
[01:27:34] 所以我們會有一個Vocabulary就是我現在要處理到的Vocabulary
[01:27:39] 那這邊剛好我就對應到這個Vocabulary我們講一下我們現在大語言模型看到的Vocabulary
[01:27:45] 意思是一樣就是
[01:27:47] LM在做
[01:27:49] Token來循環之後會建立
[01:27:51] 他現在
[01:27:53] 學的過程所看過的Token有哪些的Vocabulary
[01:27:57] 你也會有一個Vocabulary
[01:27:59] 那一般來講大語言模型大概就是在
[01:28:02] 這個3萬
[01:28:04] 到更多
[01:28:05] 大概這麼多啦你不會再更大
[01:28:07] 說老師我們現在錢很多
[01:28:09] 更大一點
[01:28:10] 不會
[01:28:10] 而且不太需要
[01:28:12] 那這邊大概有一些數字供大家參考
[01:28:17] 其實
[01:28:18] 連這個LM1跟LM2都有這樣的Size
[01:28:21] 那就是說
[01:28:22] 那為什麼不放大一點感覺越大越好啊
[01:28:27] 其實沒有
[01:28:29] 各有利弊
[01:28:30] 小有小的好處大有大的好處這樣子
[01:28:33] 那當然
[01:28:35] 你如果這個模型的
[01:28:38] 你公司Service你的算力夠你的Power夠你想
[01:28:42] Cover更多東西的確是大一點是比較有利的
[01:28:46] 但是以後當我們再介紹
[01:28:49] Transformer之後
[01:28:51] 你會知道說
[01:28:52] 這個Vocabulary Size那個VR
[01:28:55] 它會影響到參數量
[01:28:57] 影響到你模型參數量
[01:28:59] 所以
[01:29:00] 他到時候的參數量其實會V跟
[01:29:04] 一個你的Model的那個Dimension相乘
[01:29:07] 所以那個是一個
[01:29:09] 直接線性的關係所以這個越大
[01:29:12] 你的Model
[01:29:14] 要處理的東西就越多
[01:29:16] 所以
[01:29:17] 也不能
[01:29:18] 無限制的擴大這樣子
[01:29:21] 而且Vocabulary代表什麼
[01:29:23] Vocabulary就是說
[01:29:26] 你到時候在Decode的時候你其實是要針對所有Vocabulary去看說
[01:29:31] 我現在有三萬個Token
[01:29:32] 我要知道每一個Token
[01:29:34] Decode出來的Probability是多少
[01:29:36] 因為你是矩陣相承一次出來
[01:29:38] 所以你這個Vocabulary越大你就一次要算越多字的Probability
[01:29:44] 那當然
[01:29:46] 有利有弊啊
[01:29:48] 不過這個大概是供大家參考一個數字
[01:29:51] 那
[01:29:52] 這個大小
[01:29:54] 跟我們當以前在做Index的時候
[01:29:57] 概念有點像只是以前我們Index是
[01:30:00] 在建的過程會漲
[01:30:02] 慢慢漲有點像現在Tornazion在做BP的時候也是漲出來的這樣子
[01:30:09] 這個就是我剛才講的是不見得越大越好在在RN裡面
[01:30:13] 應該說有利有弊
[01:30:15] 也不是說大得不好或大得很好這樣子
[01:30:20] 好
[01:30:21] 那
[01:30:22] 我們先來看這個圖你比較知道什麼叫Import index
[01:30:26] 這是你拿到的文章
[01:30:29] 然後文章你就去Parsing
[01:30:30] 你就去斷字
[01:30:32] 然後斷字完之後比如說你就知道Computer這個字呢在第2片的第83個位置
[01:30:38] 第3片第79個位置這樣子
[01:30:40] 你就會有一個這樣的一個
[01:30:42] 一個Bucket的List
[01:30:45] 那這就是你的
[01:30:47] 你可以說是你的致電
[01:30:50] 那這樣的一個
[01:30:51] 東西就是一個Invert index
[01:30:53] 所謂Invert index就是說
[01:30:55] 我從字在反
[01:30:57] 索引到我的文章
[01:30:59] 這叫Invert index
[01:31:00] 其實你在Database做Index
[01:31:02] 本身也有隱含的這個Invert index概念
[01:31:07] 好
[01:31:08] 所以你一篇一篇文章進來你就可以Parsed字
[01:31:11] 然後呢Parsed完之後你就知道
[01:31:14] 某個字出現在第幾篇第幾個字
[01:31:18] 你就用那個
[01:31:19] Linux的把它串起來
[01:31:20] 做下去這樣子
[01:31:23] 當然你會覺得這個好像很複雜
[01:31:25] 其實現在也不會啊
[01:31:27] 你叫
[01:31:27] 你寄vibe coding
[01:31:29] 叫AI幫你寫這個程式其實也蠻容易的這樣子
[01:31:32] 而且這種程式他
[01:31:34] 大概不太會出錯
[01:31:36] 但是他會有一些效率上的問題
[01:31:39] 如果你直接暴力這樣做
[01:31:41] 從第一篇文章開始
[01:31:43] 你可以想像這邊都空的這邊也空的
[01:31:46] 就算你用vibe coding程式很好寫
[01:31:49] 寫出來
[01:31:50] 然後跑一下
[01:31:50] 發現
[01:31:51] 這個前一百篇非常快一百篇
[01:31:54] 秒做完這個index做完
[01:31:57] 但發現一千篇
[01:31:58] 好像不是十倍的時間
[01:32:00] 好像是一百倍的時間
[01:32:02] 一萬篇幾乎跑不動
[01:32:03] 跑不太動
[01:32:05] 那你就問AI說為什麼會這樣
[01:32:08] 那他就會給你
[01:32:10] 唬爛一些東西這樣子
[01:32:12] 沒有他可能會找到重點
[01:32:14] 但是可能不是這麼
[01:32:16] 或者是說他你就告訴他
[01:32:18] 你要很快速
[01:32:20] 或是說你要告訴他一些關鍵字
[01:32:23] 你一定要用Hash
[01:32:24] 因為你想像如果你這個
[01:32:27] 這個東西
[01:32:28] 是沒有一個快速解鎖的方式
[01:32:31] 或是這個這個table沒有一個快速解鎖的方式
[01:32:35] 我們剛才說我們的vocabulary size會多大
[01:32:37] 三萬
[01:32:39] 那你這個文章一進來
[01:32:41] 你的字
[01:32:42] 你切到一個字
[01:32:44] 你要去這個三萬個一個list裡面做搜尋
[01:32:48] 你會做搜尋
[01:32:49] 為什麼要搜尋
[01:32:50] 你要找到這個頭
[01:32:52] 你要找到這個point的頭
[01:32:54] 你要搜尋
[01:32:55] 有時候可能
[01:32:57] 找到沒有
[01:32:58] 沒有你就要create一個新的
[01:33:00] 有時候你就要繼續穿下去
[01:33:02] 這是link list的做法
[01:33:05] 那這個搜尋其實是
[01:33:06] 成本很高的
[01:33:08] 一個字就要
[01:33:09] scan一個
[01:33:10] 三萬長度的
[01:33:12] table一次這樣
[01:33:13] 所以這邊一定要
[01:33:14] 快速的縮影
[01:33:16] 甚至你要用Hash的方式Constant time直接進來
[01:33:19] 不然你會發現
[01:33:20] 當你
[01:33:21] 做到第兩萬篇文章的時候
[01:33:23] 你的
[01:33:24] 你的電腦幾乎跑不太動因為他就在
[01:33:26] 不斷的在搜尋
[01:33:28] 不斷的在搜尋
[01:33:31] 這當然是一個
[01:33:32] 處理這種大量資料會遇到問題的技巧
[01:33:36] 那當然vibe coding
[01:33:38] 他現在也許可以告訴你基本的做法
[01:33:41] 但是你可能要給他更多的情境你要告訴他說我現在資料量很大
[01:33:46] 這邊的搜尋的成本你可能要考慮一下為什麼
[01:33:49] 你可以用什麼樣的方式
[01:33:50] 甚至你直接告訴他這邊要怎麼做
[01:33:52] 他可以幫你寫更好的程式
[01:33:57] 那這樣來做下來之後呢
[01:33:58] 我的所有的文章我就做出這一個index
[01:34:03] 跟他所對應到這個位置
[01:34:05] 所以使用者的query進來
[01:34:09] 我就可以找到說比如說使用者查這個
[01:34:12] 這個
[01:34:13] Security
[01:34:14] 那我就知道他在第一篇出現這兩個位置
[01:34:17] 第三篇出現這個位置
[01:34:18] 我就可以把這些document給使用者
[01:34:20] 說你要找的東西在這裡這樣子
[01:34:24] 當然你說
[01:34:25] 老師那使用者如果輸入多個字呢
[01:34:28] 那我就把這整個bucket整合一下
[01:34:31] 排序一下
[01:34:33] 看出現最多字的排在前面這樣子
[01:34:35] 這是最簡單的一個搜尋引擎的做法
[01:34:39] 這樣你就可以
[01:34:40] 做一個非常simple而且是
[01:34:44] 可以關鍵字比對的
[01:34:45] 這樣的一個搜尋引擎
[01:34:47] 這樣子
[01:34:48] 所以他其實裡面有很多技術性的
[01:34:50] 細節包含是說
[01:34:53] 這個document id
[01:34:54] 你大概不會覺得document id是一個很大的問題
[01:34:59] 就是
[01:34:59] 這個
[01:35:01] 文章編號這邊是2
[01:35:02] 1呀3呀但是你真正要allocate多少的
[01:35:07] 的size
[01:35:08] 比如說一個byte
[01:35:09] 兩個byte
[01:35:10] 或是一個integer
[01:35:12] 那你會發現說
[01:35:14] 當我的
[01:35:14] 文章如果是
[01:35:16] billion size的label
[01:35:18] 幾十億個文幾十一篇文章
[01:35:20] 我原來integer存不下去
[01:35:23] 那我要用更長
[01:35:24] 更長之後你會發現
[01:35:26] 你這個中間的bucket非常的大而且
[01:35:30] 很好資源
[01:35:32] 所以這邊
[01:35:33] 每每個都是一堆
[01:35:34] 那個窮人家就是要這樣這邊要省一點那邊要摳一點
[01:35:39] 你的系統才跑得起來
[01:35:41] 當然現在也許不見得這麼在意這些事情
[01:35:44] 但是
[01:35:45] 以前
[01:35:46] 很care這些
[01:35:48] 小地方的壓縮這樣子
[01:35:50] OK
[01:35:52] 那這樣的搜尋引擎做出來會有什麼問題
[01:35:54] 其實就是關鍵字比對
[01:35:56] 就是找這個字它就出現在這個字
[01:36:00] 它少了一個字少了一個字母或是一樣的意思它不見得找得到
[01:36:05] 這是以前在做搜尋引擎比對的時候
[01:36:08] 就有這樣的問題
[01:36:09] 那你說
[01:36:10] 老師不會啊Google現在沒有那麼笨
[01:36:12] 他還會告訴我哪個字拼錯這樣子
[01:36:15] 那個都是眼鏡一步一步眼鏡下來的
[01:36:18] 以前最簡單的搜尋引擎就是找
[01:36:20] 這個樣子
[01:36:22] 只是
[01:36:23] 當初大家的重點
[01:36:25] 不是在這個字
[01:36:26] 而是在
[01:36:27] 我如果找到了有一篇
[01:36:29] 一百篇文章
[01:36:30] 都有這些字
[01:36:31] 我要怎麼排序啊
[01:36:32] 以前
[01:36:33] 一開始的重點會在那個後面的排序
[01:36:36] 但是後來大家想知道說我有一些
[01:36:40] 意識一樣但是不是跟關鍵字一模一樣的字的時候該怎麼找到
[01:36:45] 所以就
[01:36:46] 不同樣的層面的問題
[01:36:49] 所以這件事情
[01:36:50] 就回到我前面就是你要
[01:36:52] 你要從這個
[01:36:53] 這個字呢Map到一個
[01:36:55] 的一個字
[01:36:57] 到Bucket去
[01:36:58] 通常
[01:36:59] 其實也都會有一堆的Hash
[01:37:01] 當然Hash
[01:37:02] Hash的精神就是
[01:37:04] 用空間換取時間
[01:37:08] 這大概是以前
[01:37:10] 你要做
[01:37:12] 資訊檢索
[01:37:13] 你前面就要做一段這樣的index的
[01:37:19] 但這一塊呢
[01:37:20] 現在有很多套件
[01:37:22] 你只要把文章
[01:37:24] 餵給他
[01:37:25] 他就幫你做好所有的縮印啊然後連
[01:37:28] 搜尋你的介面都做好這樣子
[01:37:31] 其實是
[01:37:32] 不用自己做沒錯啦
[01:37:34] 但是呢很多蠢事情
[01:37:37] 都是要自己做過
[01:37:39] 你才知道裡面的
[01:37:40] 問題點在那裡
[01:37:42] 好
[01:37:43] 那這個我們再看一下一些
[01:37:45] 以前會做的事情
[01:37:48] 那文章進來我們要做所謂的Lesson
[01:37:50] 就是第一個要做Tokenization
[01:37:53] 這個Tokenization其實跟現在
[01:37:55] LM前面的Tokenization
[01:37:59] 做的事其實是差不多啦但是以前我們講的是有點像做Segmentation做斷字的
[01:38:05] 有點像是說把
[01:38:07] 文章中的turn把它接取出來
[01:38:09] 現在
[01:38:10] 在LM前面那一段Tokenization也是這個意思沒錯但是
[01:38:17] 可能現在大家對Token
[01:38:19] 賦予比較大的
[01:38:20] 意識但以前沒有
[01:38:22] 就是turn
[01:38:23] 就一大堆有意義的詞
[01:38:26] 然後以前會做所謂的Stemming
[01:38:28] Stemming就是詞
[01:38:30] 詞幹
[01:38:32] 那以前有一個
[01:38:34] 很有名的叫Portal Argument
[01:38:37] 這個大概從
[01:38:39] 比較從Compiler的角度去找出詞的原型
[01:38:45] 然後能夠
[01:38:47] 找出說這個字的root
[01:38:50] 的形態是什麼
[01:38:52] 什麼叫root其實就是比如說docs
[01:38:55] 加s之後
[01:38:56] 它的root是什麼就是原來的
[01:38:58] dog沒有加s
[01:39:00] 但是它的root其實不見得是一個
[01:39:04] 存在的英文單字
[01:39:06] 等一下我們有個例子我這邊沒有秀了
[01:39:08] 就是它會把它變成一個特殊的
[01:39:11] 所有的詞都會變成一個特殊的root
[01:39:13] 但是特殊的root它其實不是一個有意義的英文字
[01:39:17] 但是這樣的好處是什麼
[01:39:19] 我可以把所有的
[01:39:20] 變形
[01:39:22] 變成
[01:39:22] 歸宗成一個字這樣子
[01:39:26] Stemming
[01:39:28] 它的原名叫Stem
[01:39:31] 我蠻想說這個中文到底叫什麼
[01:39:32] 這是Google翻譯
[01:39:35] 我不知道為什麼他罵人這樣子
[01:39:37] 他就直翻就是詞幹的意思
[01:39:39] 其實是中文叫詞跟詞幹的意思就是
[01:39:43] 我要回到
[01:39:44] 我要回到這個root form這樣子
[01:39:47] 那以前有個步驟
[01:39:50] 很重要
[01:39:50] 但是現在
[01:39:51] 一點都不重要也不會去做
[01:39:53] 以前會做一個叫做
[01:39:55] stop words
[01:39:56] 就是
[01:39:58] stop words的中文可以叫做
[01:40:00] 停用詞
[01:40:01] 也不叫停用詞反正就是
[01:40:03] 沒有意義的或是
[01:40:05] 可以省略的詞
[01:40:07] 那你如果搜尋英文stop words
[01:40:10] 去網路上搜尋
[01:40:11] 它會告訴你大概二三十個字
[01:40:12] 可能是一些貫詞啊介系詞這些東西
[01:40:15] 可以不需要被索引
[01:40:17] 因為
[01:40:18] 你不會去Google搜尋
[01:40:20] T-H-E
[01:40:21] 你要叫Google給你什麼東西這樣那就一堆
[01:40:24] 沒有意義的東西這樣子
[01:40:26] 就像這些貫詞啊介系詞啊這些東西
[01:40:31] 那為什麼要做這一次
[01:40:32] 因為以前
[01:40:34] 以前空間記憶體很貴
[01:40:36] 所以
[01:40:37] 我這樣拿掉之後我
[01:40:40] 當時在做這些
[01:40:41] 索引啊
[01:40:42] 我可以少掉
[01:40:44] 百分之二十到三十的索引的空間
[01:40:47] 當然你會說這二十到三十
[01:40:49] 但是搞不好有一些很重要的東西被拿掉
[01:40:51] 沒錯
[01:40:53] 所以
[01:40:54] 怎麼去拿這件事情也是當時的一個學問
[01:41:02] 那TokenH呢
[01:41:03] 以前其實沒什麼大的學問就是
[01:41:06] 以前拿到的都是網頁
[01:41:07] 所以你會做
[01:41:08] 所謂的
[01:41:09] 把HTML拿掉啊
[01:41:12] 然後拿去一些不重要的啊
[01:41:14] 然後去
[01:41:16] 把它變成
[01:41:18] 全部都是小型的
[01:41:19] 寫的啊
[01:41:20] 以前會做這樣的有點像去
[01:41:23] Uniform你的資料的形態
[01:41:25] 但是老實說這樣的動作其實
[01:41:27] 會
[01:41:28] 跑掉很多的資訊或是說有很多資訊會
[01:41:32] 模糊掉
[01:41:33] 就是變得一樣但其他可能有些微的差別這樣子
[01:41:39] 那
[01:41:40] 這個以前Stemming這個Portal的概念其實就是把
[01:41:44] 詞性的東西降低或是有一些很簡單的規則
[01:41:48] 比如說
[01:41:49] 我們把
[01:41:51] 這個
[01:41:51] 加ING的把它拿掉
[01:41:53] 就變成圓形這樣子
[01:41:56] 那我們就可以把
[01:41:57] Fish跟Fisher
[01:41:59] 變成同樣一個字Fish
[01:42:01] Fish呢就把它拿掉也變成
[01:42:04] Fish這樣子
[01:42:05] 但是
[01:42:06] 當這個釣竿這個磁
[01:42:08] 你把ING拿掉之後呢
[01:42:10] 這兩個FishLow就不是釣竿了
[01:42:13] 就在意義上就不一樣這樣子
[01:42:16] 所以Stemming的時候其實它
[01:42:18] 也會有一些問題
[01:42:19] 但是沒辦法
[01:42:22] 因為記憶體不夠
[01:42:23] 所以我還是把
[01:42:24] 大家都變成一樣字會比較好做這樣子
[01:42:27] 那如果大家有興趣可以去看一下這個Portal的Stemming Argue
[01:42:31] 這個
[01:42:32] 考古學家會去看一下這個演算法到底寫什麼
[01:42:35] 如果你寫過Compiler你大概一看
[01:42:38] 這個演算法就知道這是用
[01:42:40] Compiler的角度在看這個
[01:42:43] 磁的圓形的作法
[01:42:46] 那相對於Stemming還有一個叫做Lemmatization
[01:42:49] 這個磁其實大家
[01:42:51] 可能要
[01:42:52] 稍微瞭解一下因為它
[01:42:54] 還蠻有用的
[01:42:56] 一樣是
[01:42:57] 回到磁的
[01:42:59] 圓形
[01:43:00] 當然圓形會不太一樣它的圓形就是
[01:43:04] 我這邊做個比較啦
[01:43:05] 這是
[01:43:06] 這是如果你在文章中看到這個
[01:43:09] Study然後變IES這個字呢
[01:43:12] 如果照
[01:43:13] Stemming的做法
[01:43:14] 它就是
[01:43:15] 暴力把它變成磁根
[01:43:17] 就把ES拿掉
[01:43:18] 就變這個字所以我說
[01:43:20] Stemming常常會產生一堆
[01:43:22] 不是英文字的字
[01:43:24] 但是
[01:43:25] 但是所有跟Study長出來的字我都可以靠著一些規則
[01:43:29] 把它變成這個SDUDI
[01:43:31] 我都知道說喔
[01:43:33] 這都長出來它的Root就是SDUDI
[01:43:35] 但是Lemmatization它其實會考慮到一些Semantic
[01:43:39] 你這邊應該是個動詞
[01:43:41] 你這邊應該是個名詞
[01:43:44] 它會把它
[01:43:45] 轉換成
[01:43:46] 適合這個詞性的
[01:43:48] 一個圓形
[01:43:51] 所以它會稍微複雜一點
[01:43:53] 就是說
[01:43:54] 如果你現在要跑Stemming的演算法跟Lemmatization的演算法
[01:43:57] 你會發現
[01:43:58] 這個Lemmatization跑好久啊
[01:44:00] 因為它算的東西
[01:44:02] 很多
[01:44:03] OK
[01:44:04] 但是它做出來的東西比較有點區分
[01:44:07] 有點你可以想像Stemming就是暴力反正就是什麼東西都是一樣
[01:44:12] 那Lemmatization就是我還會稍微細分一下這邊該擺什麼樣的字比較是對的
[01:44:18] 它的Root是比較對的
[01:44:20] 所以它做出來是比較合理的東西
[01:44:24] 所以如果你看一些Paper
[01:44:26] 他可能會說我把
[01:44:28] 我的來源字做一些Lemmatization之後
[01:44:31] 會比較乾淨
[01:44:33] 比較
[01:44:34] LN比較不會犯錯
[01:44:36] 他其實在做這樣的動作
[01:44:40] OK
[01:44:41] 但基本上就是有點
[01:44:43] 把
[01:44:44] 多樣性的詞性的變化或是
[01:44:47] 磁的變化
[01:44:48] 把它稍微Uniform一點這樣子
[01:44:50] 這樣有什麼好處
[01:44:52] 這樣你對應到整個大語言模型的
[01:44:55] 那個Token的表示呢就
[01:44:57] 不會這麼發散
[01:44:59] 當然
[01:45:01] 通常現在
[01:45:02] 有時候也不太去管這些反正
[01:45:05] LN越來越強有些事情就交給LN去理解就是了
[01:45:10] 那stop words呢
[01:45:12] 這是用stop words做出來的Tech Cloud
[01:45:16] 但是你可以看到
[01:45:18] THE
[01:45:19] TO
[01:45:20] ,IN,AND這些東西都會STARBOARD
[01:45:24] 以前就是這個東西審太多而且你去統計一下
[01:45:28] 英文字的STARBOARD
[01:45:30] 剛才說可以省掉20%你就知道這個量有多少
[01:45:35] 但是STARBOARD有
[01:45:37] 很多問題
[01:45:38] 像這些句子裡面我如果把這些STARBOARD
[01:45:41] 這些都把它拿掉
[01:45:43] 雖然有些關鍵字會留下來沒錯
[01:45:46] 但是它整個語意稍微有點偏了
[01:45:49] 會不知道我到底本來的意圖是什麼
[01:45:53] 但是以前沒辦法
[01:45:54] 因為記憶體擺不下這個INDEX TABLE擺不下所以
[01:45:58] STARBOARD
[01:45:59] 能不管就不管這樣子
[01:46:01] 那通常在STARBOARD的問題上我會探討
[01:46:04] 什麼是STARBOARD
[01:46:07] 如果老師就這些啊
[01:46:08] 不同語言是不是STARBOARD也不一樣
[01:46:11] 這個把它翻成中文不就好了
[01:46:14] 那
[01:46:16] 你就知道這個不同語言的差異
[01:46:19] 不同語言的STARBOARD也不一樣
[01:46:21] 甚至你的應用的
[01:46:23] 比如說我現在做一個
[01:46:25] 運動新聞的檢索
[01:46:27] 或是新聞的檢索
[01:46:29] 那所有的新聞裡面都會有什麼什麼什麼記者報導
[01:46:34] 所以報導這兩個字呢在你的應用裡面幾乎每一篇都會出現了
[01:46:38] 它其實已經不是有意義的詞
[01:46:40] 所以它可以在你的應用裡面歸類為STARBOARD
[01:46:46] 你說
[01:46:47] 在意這麼多幹什麼
[01:46:49] 大語言模型會幫我做就好了
[01:46:51] 沒錯現在
[01:46:52] 現在人們其實
[01:46:53] 都知道這些事情
[01:46:55] 那什麼時候要把它拿掉
[01:46:57] 你說一開始就拿掉了還是等
[01:47:00] 處理完一些事情把一些詞呢
[01:47:03] 意義把它搞懂之後再把它拿掉
[01:47:05] 也是一樣各有利弊的
[01:47:07] 因為
[01:47:08] 像剛剛那個釣竿
[01:47:10] 你把詞性轉換之後又把STARBOARD拿掉之後你可能那個詞就不見了
[01:47:16] 所以
[01:47:17] 什麼時候該怎麼拿
[01:47:19] 這個都是不同的應用會有不同的做法
[01:47:22] 我這邊舉一個例子
[01:47:24] 以前我們常常說
[01:47:25] to be or not to be
[01:47:26] 這是一個很有名的
[01:47:28] 的句子
[01:47:30] 但是to呢在裡面是STARBOARD
[01:47:32] be也是
[01:47:33] o也是
[01:47:34] not也是
[01:47:35] not可能可以把它
[01:47:37] 當成是一個negation的turn
[01:47:39] 但是後面
[01:47:40] 發現整個句子都STARBOARD
[01:47:42] 你就把它拿掉
[01:47:43] 這個句子就消失了
[01:47:45] 這麼有名的句子就不見了這樣子
[01:47:48] 所以其實
[01:47:49] 到後來當然
[01:47:50] 我們寧願多買一點記憶體
[01:47:52] 讓整個東西跑得起來
[01:47:54] 寧願不要做STARBOARD這件事
[01:47:58] 這個當然這個有一些歷史的因素
[01:48:01] 但是呢
[01:48:03] 你要想一想啊這有時候
[01:48:06] 尤其是像你現在在寫LM PLUM的時候
[01:48:10] 你的每一個PLUM的每一個字的
[01:48:12] LM都非常的在意都非常Sensitive
[01:48:17] 所以你會覺得那個不重要但是你多了點
[01:48:19] 多了那個字多了沒有那個字的
[01:48:21] 你發現結果好像不太一樣
[01:48:23] 當然不見得是因為那個字的關係
[01:48:26] 但是
[01:48:27] 其實
[01:48:28] 這些字在算的時候它所造成的影響
[01:48:31] 是會PROPAGATE的
[01:48:32] 會ATTENTION算起來就會不太一樣
[01:48:35] 那這件事情
[01:48:37] 表示什麼
[01:48:38] 我們現在就讓LM
[01:48:41] 去幫我們計算什麼叫做句子裡面的STARBOARD
[01:48:46] 好
[01:48:47] 那
[01:48:48] 我們再看一下這些做完之後你的
[01:48:51] 你的比對
[01:48:52] 我們剛才說那個INDEX TABLE做出來的時候我就是下這個關鍵字有出現
[01:48:58] 這個文章我就把它抓出來
[01:48:59] 但是如果使用者
[01:49:00] 下了
[01:49:02] 十幾個字呢
[01:49:03] 或是使用者給你一篇文章叫你找相似的文章你要怎麼做
[01:49:08] 那你也可以用同樣的做法然後把所有的字出現的字的文章
[01:49:12] 把它Aggregate在一起然後Report出去
[01:49:15] 但是當時大家就希望說那我們
[01:49:18] 用一個
[01:49:19] 向量的空間
[01:49:21] Vector Space Model的方式來表示一個Document
[01:49:26] 這個其實當然
[01:49:28] 可能你覺得很Trivial但是其實這個概念還蠻重要的
[01:49:33] 就是
[01:49:35] 文章寫成字就是一堆Sequential的符號
[01:49:39] 那我們怎麼樣讓電腦去理解
[01:49:42] 這個Sequential的符號我們一定要有一個
[01:49:45] 表示的方式
## 8. 寫作規則
(這是 `_筆記SOP.md` 第 3.1、4、5、6 節的濃縮版。兩者衝突時以 SOP 為準。)
讀者:碩士生,兩門課期末是英文考試。要只看筆記就能學會,講得比老師好懂。畫面要簡潔。
**概念優先(2026-09-26 主理人)**:主理人只想懂概念,不想補數學、不想看程式碼和座標圖。兩門課的考試也都是問答題、不考算式(AI W1 1:16:52;NLP W3 1:47:41、2:48:36)。所以:
- 每段預設看得到的只有:白話摘要(2–4 句)+**一句生活比喻**(例:模擬退火像投資理財,年輕時敢冒險、越老越保守)+「考試可能怎麼問」一句。
- 數學推導、公式、手算、程式碼、座標圖,全部收進標題寫「(進階,可跳過)」的摺疊,例如「它到底怎麼運作?(進階,可跳過)」。每段最多一個進階摺疊,不要寫長篇計算。
- 演算法要能「用文字說出步驟」(考試可能要你描述),這一點放在預設看得到的地方,不用數字。
- **重心比例**:白話理論與概念模式(它在解決什麼問題、核心想法、跟別的方法差在哪、優缺點、生活比喻)占主要篇幅;數學與程式細節只用一兩句帶過,細節收進進階摺疊。
**圖文並茂(2026-09-26 主理人:不要只有文字)**:
- 每章至少 2–3 個圖,放在**預設看得到**的地方,每個圖前後各用一兩句白話說明「這張圖在看什麼」。
- 流程、步驟、因果、比較 → 用 mermaid 流程圖(```mermaid,flowchart LR 或 TD;節點文字用中文、加雙引號;一張圖不超過 10 個節點)。
- 投影片上的示意圖、架構圖 → 用 [[IMG: …]] 放投影片圖。
- 仍守「每個 ## 段落最多一種視覺元素」。
### 輸出兩個檔
1. `chNN.md`(Notion 寫法,不含頁面標題),結構固定:
- 第一行:章節包第 1 節那行,原樣照抄。
- `## 重點`:三點中文,每點一到兩句。
- `## Exam-ready`:3–10 行英文,**從章節包的投影片文字逐字抄**,每行 `- **Term**: "原句"(Ch3 p.14)`。老師有明確證據才在行尾加 `【老師強調】(h:mm:ss)`。
**每一行下面一定要有一行縮排的中文解釋**(主理人英文不好,看不懂的英文等於沒用):
```
- **Hill climbing**: "It keeps track of one current state and on each iteration moves to the neighboring state with highest value."(Ch4 p.5)
- 中文:爬山法只記住「現在這一個狀態」,每一輪都移到分數最高的鄰居。白話:一直往比較高的地方走一步。
```
中文要先把句子意思講清楚,再補一句白話;難的英文單字括號附中文(例:neighboring state(鄰近狀態))。
- 章節包第 2 節的每一段:`## [h:mm:ss](連結) 標題`(照抄),下面 2–4 句白話摘要,其餘全部收進摺疊:
```
問句(例:用生活例子講,BFS 在做什麼?)
內容
```
摺疊種類(需要才放):用生活例子講?/它到底怎麼運作?/要先懂什麼?(老師假設你會的數學或概念,短版教學)/老師原話是什麼?(「原話」(h:mm:ss),只放重要的,最多 5 句)。
- 「它到底怎麼運作?」要用一組小數字把這段的演算法**真的跑 1–3 步**(例:算出梯度、更新一次、比較兩個 α),不是只示範定義的加減乘除。全章盡量沿用同一組數字,讓前一段的答案能在下一段被驗證。
- 每段正文要回答讀者最可能卡住的一個「為什麼」。投影片公式方向跟題目相反、或投影片說「解不出來」時,用一兩句講出原因,自己補的標(我補充)。
- 投影片句子停在公式前(公式在圖裡)時:Exam-ready 在粗體詞條上補公式、引號內保持原句;正文寫出同一條式子。公式圖看章節包第 6 節列出的 PNG。
- `## Self-check`:2–4 題英文考題,答案收摺疊。**至少一題考老師強調的內容**;不出「老師和投影片哪裡不同」這類不會考的題目。每題格式:
```
Q1. English question?(中文:中文題目)
**Answer**: English answer.
中文:把答案完整講一遍(不是只翻一句),讓看不懂英文的人也知道要怎麼答。
```
- **最後一行**:章節包第 1b 節那行(下一章連結),原樣照抄。讓讀完的人直接點下一章。
- 不要把章節包或這份規則裡的指示句寫進筆記(例如「寫筆記時照投影片寫」「已改正 ASR 錯字」)。
- 長度 8,000–14,000 字元。
2. `chNN.concepts.json`:JSON 陣列,4–12 個考試可能問的術語,每個物件:
`name`(英文)、`zh`、`type`(概念/演算法/公式/人物事件/前置知識/行政)、`signal`("老師說會考"/"老師強調"/"核心(我判斷)"/"")、`evidence`(有 signal 前兩種時必填:原句+時間)、`definition_en`(投影片原句;沒有就註明 (textbook)/(lecture)/(my wording))、`plain`(一句中文)、`a4`(≤150 字元英文,可夾極短中文;期末拼貼用的小方塊)、`time`、`slides`、`prereq`(英文名陣列)。
### 風格鐵律
- 不用 emoji 或裝飾符號(✓✗★⚠ 都不要;→ 可以)。不用 callout。不用 `$`。時間不要用 code 樣式。
- 每個 `##` 段落最多一種視覺元素:一張圖、或一個表格、或一個 mermaid。
- 摺疊標題是問句,前面不加符號。
- 圖片最多 3 張,只放文字取代不了的圖。放法:單獨一行 `[[IMG: | 中文圖說]]`,PNG 用 `slides_to_png.py <圖片資料夾> <頁> --dpi=110` 產生。
- 考試訊號只在老師明確說時標。老師只說「不用背」「不講」就寫「注意:……」。
- 老師口誤或跟投影片不同:照投影片寫,加「注意:老師口頭說的是……」。
- 引用老師的話時,ASR 錯字改成正確的字。
### 沒有投影片時
不要憑記憶逐字重現課本段落或數值表。英文定義用自己的話寫、句尾標 (my wording);Exam-ready 每行標「(自擬,投影片待補)」。例子只用老師講的。
### 寫完之後(只做一次)
跑檢查:
`C:\Users\user\.cache\meeting-record\venv\Scripts\python.exe C:\Users\user\.claude\scripts\check_note.py --transcript <逐字稿> --slides <投影片 txt …> --start <起> --end <訖> --vid <影片 ID>`
- STYLE/VISUAL/TIME/FORMAT:全部改掉。
- QUOTE:確認是不是你改正了 ASR 錯字(是就保留),不是就改成原文或拿掉引號。
- ENGLISH:確認是不是投影片斷行造成的(是就保留),不是就改成投影片原句。
**省額度守則**:章節包裡已經有你需要的全部資料。不要再去讀整份逐字稿、整份投影片、segments.json 或手冊。一次寫好整個檔(Write 一次),檢查後集中修改。