# 章節包:自然語言處理(NLP)W2(9/17)第 06 章「向量空間模型與 TF-IDF」
影片 1:48:46–2:07:15,YouTube ID MnA5KUETSg4。Notion 章節頁 https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a(頁 ID 3e6fc631-b030-8121-891c-c1705fe5be4a),頁面標題「06 向量空間模型與 TF-IDF(1:48–2:07)」。
## 1. 第一行(直接照抄,不要改)
[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd) › 06|影片 [1:48:46–2:07:15](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6526s)|投影片 W1_NLP_brief_v2 p.48–52|上一章 [05 資訊檢索、索引與前處理(1:20–1:48)](https://app.notion.com/p/3e6fc631b0308148a521f4d07ae31526)|下一章 [07 課堂提問與 BM25(2:16–2:29)](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d)
## 1b. 最後一行(直接照抄,放在 Self-check 後面,當全頁最後一行)
讀完了嗎?下一章:[07 課堂提問與 BM25(2:16–2:29)](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d)|回到週頁:[W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd)
## 2. 各段標題(照順序;每段一個 ## 標題,直接照抄連結)
- `## [1:48:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6526s) 向量空間模型` 老師講什麼:使用者丟進很多字或整篇文章時,就把每篇文件變成一個向量,維度等於詞表大小,字有出現就是 1、沒出現就是 0。詞表有三萬維,但每篇只有幾百個不同的字,所以向量非常稀疏。
- `## [1:52:22](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6742s) TF:詞頻與正規化` 老師講什麼:一個字在文章裡出現越多次,可能越重要。但要除以文章的總字數做正規化,不然長文章會壓過短文章。
- `## [1:54:01](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6841s) IDF:逆文件頻率` 老師講什麼:IDF 看一個字出現在多少篇文件裡。「報導」每篇新聞都有,IDF=log(N/n)=0,等於完全沒有鑑別力。
- `## [1:55:34](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6934s) 為什麼做 RAG 還要懂 TF-IDF` 老師講什麼:IDF 是鑑別器(discriminator)。句子轉成 embedding 會有點模糊,在稠密向量之外加上 TF-IDF 稀疏向量,關鍵字檢索的效果會變好,是很強的 baseline。
- `## [1:57:07](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7027s) IDF 的正規化與分佈` 老師講什麼:一個字只出現在一篇文件時,IDF 最大;除以 log N 可以正規化到 0–1。IDF 是憑經驗訂的權重,但和 Entropy 有理論上的關係,可以畫分佈圖檢查它的鑑別力。
- `## [1:59:58](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7198s) cosine 相似度與內積` 老師講什麼:cosine 就是內積再除以兩個向量的長度。向量都正規化成長度 1 時,cosine 就等於內積;向量資料庫做的就是這件事。
- `## [2:03:38](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7418s) TF-IDF 的各種變形` 老師講什麼:TF 可以取 log,或壓到 0.5–1 之間,讓很少出現的字也有權重。查詢短、文件長,所以兩邊可以用不同算法(例如 ltn.lnc);這些都是憑經驗調出來的做法。
## 3. 老師強調/會考/不考的地方(原句已驗證;寫進筆記時 ASR 錯字要改正)
- (1:49:28) [強調] 「可能你覺得很Trivial但是其實這個概念還蠻重要的」 → 用向量空間模型表示文件
- (1:56:24) [強調] 「雖然它是很古老的東西但是它是一個非常Strong的Baseline」 → TF-IDF 在 RAG 檢索裡仍是很強的 baseline
- (1:56:31) [強調] 「大家就要記住IDF是用來幹嘛」 → IDF 的用途:判斷一個字在整個文件集裡有沒有鑑別力
- (2:02:20) [強調] 「那這件事情其實還蠻重要的尤其是到時候現在你說做LM做REG你會建所謂的Vector Database」 → 正規化後的 cosine 等於內積,向量資料庫算的就是這個
## 4. 這章摘要與重要度
用向量空間模型把文件變成向量,再用 TF、IDF 加權、用 cosine 算相似度,並說明這些老方法在 RAG 裡仍然有用。(核心)
## 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.48 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p048.png
- W1_NLP_brief p.49 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p049.png
- W1_NLP_brief p.50 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p050.png
- W1_NLP_brief p.51 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\brief_W1_NLP_brief_p051.png
--- W1_NLP_brief p.48 ---
Document Representation: Vector-space Model
48
Text documents are mapped to a high-dimensional vector
space
Each document d
◦represented as a sequence of terms (t)
◦d = ((1), (2), (3), …, (|d|))
1, 2 and 3 are terms in document, x and xare
document vectors
Vector-space representations are sparse, |V| >> |d| (the
number of distinct terms in any single document)
--- W1_NLP_brief p.49 ---
Term frequency (TF)
A term that appears many times within a document is likely
to be more important than a term that appears only once
nij - Number of occurrences of a term j in a document di
Term frequency
i
ij
d
n
TFij =
49
--- W1_NLP_brief p.50 ---
Inverse document frequency (IDF)
A term that occurs in a few documents is likely to be a better
discriminator than a term that appears in most or all
documents
nj - Number of documents which contain the term j
n - total number of documents in the set
Inverse document frequency
j
j
n
n
IDF
log
=
50
absolute measure of
term importance
A theoretical justification of IDF, Papineni 2001
--- W1_NLP_brief p.51 ---
Document Similarity
51
Ranks documents by measuring the similarity between each document and the query
Similarity between two documents d and dis a function s(d, d)R
In a vector-space representation the cosine coefficient of two document vectors is a measure of
similarity
'
'
')
,
cos(
x
x
x
x
x
x
T
=
O (|d| + |d’|)
Cosine similarity vs. dot product
--- W1_NLP_brief p.52 ---
tf-idf weighting has many variants
52
Columns headed ‘n’ are acronyms for weight schemes.
Many search engines allow for different weightings
for queries v.s. documents
ltn.lnc ?
## 7. 逐字稿(1:48:46 前後各多 1 分鐘,原始行)
[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] 表示的方式
[01:49:47] 你說把每個字
[01:49:48] 都寫出來
[01:49:49] 也是一種表示方式沒錯
[01:49:51] 但是我們有一個Uniform的
[01:49:52] 我有一個
[01:49:53] 固定長度的Vector
[01:49:55] 然後告訴他文章就是代表這001111什麼什麼的
[01:50:00] 這是一種固定的表示方式對電腦的理解來講是比較有利的
[01:50:05] 所以以前在做
[01:50:08] 那個年代在做搜尋的時候基本上都是Batch on這個Vector Space Model
[01:50:14] 就是把所有文章都映射在一個高維的空間
[01:50:18] 中的一個點
[01:50:19] 它就是一個向量
[01:50:21] 向量跟向量之間就有所謂的相似度
[01:50:24] 雖然假假雖然相似度
[01:50:27] 所以在做Document Representation的時候
[01:50:30] 這最暴力的做法就是現在
[01:50:32] 通常
[01:50:33] 你會拿來做Base Line的做法就是Vector Space Model
[01:50:37] 好那我就在一個什麼樣的空間就是
[01:50:40] 所有字
[01:50:42] 所構成的空間裡面
[01:50:44] 去
[01:50:45] 表示這個文章
[01:50:47] 這個文章
[01:50:48] 比如說我現在的Vocabulary為什麼Vocabulary這麼重要
[01:50:51] 我們當初定了3萬個字
[01:50:53] 出來之後
[01:50:54] 我的空間就是3萬維度
[01:50:57] 就是我只看這3萬個字
[01:50:59] 那每一個字呢就代表了一個Dimension
[01:51:02] 就代表一個Dimension
[01:51:03] 所以這個字如果有出現
[01:51:06] 它在那個維度就表示它有1
[01:51:09] 就是有出現
[01:51:10] 沒有這個文章沒有那個字
[01:51:11] 那個維度就是0這樣子
[01:51:23] 所以我會用這種方式來表示
[01:51:25] 一個Document
[01:51:26] 但這個寫法其實不是喔這個寫法其實是說
[01:51:30] 我會把每一個Word
[01:51:32] 用一個這樣的1-Half Vector
[01:51:35] 來表示我的
[01:51:37] 這個
[01:51:37] 這個字的Vector
[01:51:39] 然後再把它組成起來
[01:51:41] 那其實它如果是把它
[01:51:43] O起來之後其實就是我剛才講的
[01:51:46] 這麼多維度的一個Document的向量這樣子
[01:51:50] 所以你可以想像就是
[01:51:52] 我們一篇文章中
[01:51:54] 了不起就是
[01:51:55] 1000個字
[01:51:56] 那1000個字在我3萬的裡面
[01:51:59] 1000個字還算多了
[01:52:00] 很多文章都只有
[01:52:01] 重複字不重複字大概就只有
[01:52:04] 兩三百個字
[01:52:05] 那它的
[01:52:06] 它的表示是非常稀疏的
[01:52:08] 就是這個向量
[01:52:09] 雖然有
[01:52:10] 3萬個這麼這麼長
[01:52:12] 但是呢可能只有300個是有出現的
[01:52:15] 意義這樣子
[01:52:16] 所以是個非常Sparse的一個Vector
[01:52:21] OK
[01:52:22] 那有了Vector之後呢
[01:52:23] 我們希望
[01:52:24] 其實我不再只是出現一次
[01:52:27] 就是ER
[01:52:28] 那出現兩次能不能給它不同的權重
[01:52:31] 所以我就做了一個叫做Term Frequency
[01:52:34] 就是這個
[01:52:35] 字的出現次數
[01:52:37] 它搞不好很重要
[01:52:38] 如果這篇文章一直在出現
[01:52:40] 什麼
[01:52:41] 大股強品
[01:52:42] 就表示在講這個運動員在幹嘛幹嘛
[01:52:44] 如果大股強品只出現一次
[01:52:47] 然後
[01:52:48] 可能又一大堆的這個到期的球員
[01:52:51] 那可能
[01:52:51] 不是在跟大股強品
[01:52:53] 不是這麼有關的字
[01:52:54] 所以這個Term Frequency
[01:52:56] 每一個字的Term Frequency
[01:52:57] 其實會
[01:52:59] Highlight出
[01:53:00] 這個字在這個文章的重要性
[01:53:03] 所以我們
[01:53:04] 就會對不同的字所出現的頻率給它賦予不同的權重
[01:53:09] 這個第一個關係就是Term Frequency
[01:53:12] 就是隻要它出現越多
[01:53:14] 那它的權重就越大
[01:53:15] 這個NiJ
[01:53:17] 這個index是這樣就是
[01:53:19] D
[01:53:21] DJ一個Tem
[01:53:23] DJ一個Tem在DIB
[01:53:25] 一篇文章中的出現次數
[01:53:28] 然後這是NiJ就是它在這篇文章出現幾次
[01:53:32] 然後會
[01:53:33] 正規化
[01:53:34] 處理
[01:53:34] 處理整個文章所有的Term為什麼要做這件事情
[01:53:38] 因為如果一篇文章只有三個字跟一篇文章有三萬個字
[01:53:42] 你這個NiJ是一個絕對值啊Term Frequency是一個
[01:53:46] Count一個出現次數的量
[01:53:49] 你一定要Normalize不然會被
[01:53:51] 大文章所Dominate
[01:53:52] 所以這個一般來講Term Frequency
[01:53:54] 就是一個正規化後的一個出現的次數的統計
[01:54:00] 這是TF
[01:54:01] 那大家
[01:54:02] 為什麼要講
[01:54:03] 出現這個
[01:54:04] 大家可能常聽到一個TF IDF
[01:54:06] TF就是
[01:54:08] 裡面TF IDF的前面那一項
[01:54:10] 就是出現的次數的相似
[01:54:12] 那後面有一個IDF呢
[01:54:14] 它的全名叫做Inverse Document Frequency
[01:54:19] 我們先看Document Frequency
[01:54:21] Document Frequency就是說
[01:54:22] 我現在所看的文章裡面
[01:54:24] 這個字
[01:54:26] 總共出現幾次啊
[01:54:28] 就是我現在找了一萬篇的新聞
[01:54:31] 這一萬篇新聞裡面呢
[01:54:33] 都是什麼什麼記者報導
[01:54:35] 所以這個報導幾乎一萬篇都有出現
[01:54:38] 所以這個報導這個字呢在我的Dataset裡面它的Document Frequency
[01:54:43] 非常高
[01:54:44] 幾乎跟我的
[01:54:45] 大N
[01:54:47] 這個大N就是
[01:54:48] Total Number就是總共有多少個Document是一樣的
[01:54:52] 那我做一個Inverse意思是說
[01:54:54] 我要讓那個出現比較少次的
[01:54:58] 這個
[01:54:59] 值會變得更高
[01:55:01] 那NZ就是說我總共出現的次數
[01:55:05] 所以如果我那個什麼報導
[01:55:07] 這兩個字的
[01:55:08] 在一萬篇裡面每個字都有出現
[01:55:10] 那這個NZ就跟N
[01:55:12] 是一樣的
[01:55:13] 這邊就是1
[01:55:15] 這邊就是1
[01:55:16] 那就是0
[01:55:18] 所以IDF就是最小
[01:55:20] IDF值的最小值就是0
[01:55:22] 就是它完全沒有權重
[01:55:24] 幾乎可以被
[01:55:26] 濾掉
[01:55:27] 所以IDF是一個很重要的
[01:55:29] 工具用來鑑別
[01:55:31] 一個字詞的重要性
[01:55:34] 所以我們叫做一個Discriminator
[01:55:36] 就是一個鑑別器
[01:55:40] 你說老師這個
[01:55:41] 這個重要嗎
[01:55:42] 有任何判斷重要性就好了
[01:55:44] 沒錯
[01:55:46] 但是如果你在算
[01:55:48] 自己要做一個檢索
[01:55:50] 尤其是你現在要做REG
[01:55:51] 你自己要查
[01:55:52] 向量的時候
[01:55:54] 或是要查字字
[01:55:55] 的時候你會發現
[01:55:56] 我如果直接用embedding
[01:55:59] 來算相似度
[01:56:00] 其實效果不會很好因為
[01:56:02] 通常你轉成句子的embedding
[01:56:05] 它其實會有點模糊度
[01:56:07] 如果你在加上一些
[01:56:09] 這些
[01:56:11] 從Dense Vector
[01:56:13] 加上這個Sparse Vector
[01:56:14] 你會發現
[01:56:16] 用TFIDF所構成的效果有些關鍵字所構成的效果
[01:56:20] 它效果會變得很好
[01:56:22] 所以它還是有用
[01:56:24] 雖然它是很古老的東西
[01:56:26] 但是它是一個非常Strong的Baseline
[01:56:29] 那大家知道
[01:56:31] 大家就要記住
[01:56:32] IDF是用來幹嘛
[01:56:34] 它其實就是
[01:56:35] 一個用來
[01:56:36] 鑑別
[01:56:37] 一個字詞
[01:56:39] 在我這個Document Say的一個鑑別性
[01:56:42] 如果一萬篇裡面都有這個字
[01:56:45] 那
[01:56:46] 對我來講
[01:56:47] 我查詢這個字
[01:56:49] 沒有什麼意義啊我就等於是把所有結果都給使用者
[01:56:52] 沒有什麼鑑別性
[01:56:53] 但是如果有一個字
[01:56:55] 它只出現一次
[01:56:57] 那表示說當使用者查詢這個字的時候
[01:57:00] 我就知道
[01:57:01] 是在那篇文章
[01:57:02] 我就
[01:57:04] 把那篇文章的結果給
[01:57:05] 使用者就好
[01:57:07] 所以當這個是
[01:57:09] 1的時候
[01:57:10] 就是它非常的
[01:57:12] 稀有非常罕見字
[01:57:13] 只有在一篇文章出現一次的時候
[01:57:16] 那
[01:57:17] 這個值就是你的
[01:57:18] 你的最大值
[01:57:21] 所以通常我們IDF有時候也會正規
[01:57:24] 所謂正規化就是我這個
[01:57:26] Log是取N的
[01:57:28] 是取N
[01:57:29] 所以我會從
[01:57:31] IDF值會從0變到1
[01:57:33] 這是正規化後的IDF
[01:57:35] 右邊這個圖其實是沒有正規化就直接取
[01:57:39] 10 Log
[01:57:41] 所以我的這個N越大的時候我的IDF就越大這樣子
[01:57:45] 所以它就沒有Upper Round
[01:57:47] 但因為取Log其實也不會太大這樣子
[01:57:52] 那這個圖大概是一般
[01:57:54] 統計下來的結果就是一般在文章中
[01:57:57] 統計的時候
[01:57:58] 字詞的頻率跟它算出來的IDF
[01:58:01] 因為是取Log
[01:58:02] 所以就是在Log的Label是
[01:58:05] 線性的關係
[01:58:07] OK
[01:58:09] 那
[01:58:10] 這個圖
[01:58:11] 可能大家可以思考一下就是說
[01:58:13] 因為這個IDF是一個
[01:58:15] 非常
[01:58:17] Huristic
[01:58:18] 所謂Huristic就是以前某個
[01:58:20] 某個厲害的學者
[01:58:23] 算出這個權利
[01:58:24] 這種告訴你這很有用
[01:58:25] 用就對了這樣子
[01:58:27] 沒錯用的時候發現很好用這樣子
[01:58:30] 但是其實IDF有一些理論的基礎
[01:58:33] 它其實跟Entropy會有點關係
[01:58:36] 以後我們機會會再講到
[01:58:39] 不過這個東西你會發現
[01:58:41] 在我的應用裡面做出來的分佈長這樣
[01:58:45] 那你說
[01:58:46] 那它到底
[01:58:48] 好不好
[01:58:48] 它到底能不能當成我的Discriminator
[01:58:52] 就是說
[01:58:53] 我想要區分的字呢
[01:58:55] 如果都集中在中間這一塊
[01:58:57] 那表示我這個演算法不好
[01:59:00] 我算一算之後發現我想區分的字
[01:59:03] 其實它的算出來IDF值都差不多
[01:59:06] 那就我可能要改一下
[01:59:08] 但是如果我想區分這幾個字
[01:59:11] 跟這幾個字
[01:59:12] 的差別
[01:59:13] 那IDF就是一個很好的
[01:59:15] 鑑別的工具
[01:59:16] 我就可以拉大這些事情
[01:59:19] 所以有時候當你自己
[01:59:21] 經驗法則設計出一些
[01:59:23] 變形之後你可以看一下你的分佈
[01:59:25] 到底
[01:59:25] 貢獻會是長什麼樣子
[01:59:28] 不過IDF畫出來通常都
[01:59:30] 比較像這樣因為大家頻率不會
[01:59:32] 差太多
[01:59:35] 除了這些stop words
[01:59:37] stop words在這裡
[01:59:39] 這大概出現一次啦
[01:59:41] 這是稀有字或專有名詞
[01:59:45] 但是我們通常都希望先把這些拿掉
[01:59:47] 因為IDF
[01:59:48] 很低的
[01:59:50] 它TF IDF一層
[01:59:51] 它就掉下來
[01:59:53] 這樣子
[01:59:58] 所以我們有了剛才的表示之後我們再把TF IDF加上去之後
[02:00:03] 那每一個Document的表示呢
[02:00:06] 就是變成是一個
[02:00:07] 如果有正規化之後它就是一個分數的表示
[02:00:12] 字典有三萬個字那就是一個三萬維度然後都是一大堆零點零幾零點幾的表示這樣子
[02:00:19] 每一篇每一個
[02:00:21] Document就是一個Vector
[02:00:23] 那Vector跟Vector之間
[02:00:25] 如果是長得一模一樣
[02:00:27] 就是向量完全一模一樣它就是沒有夾角
[02:00:30] 沒有夾角cos出來是多少
[02:00:33] 所以我們就用cos的方式來評估
[02:00:36] 兩個向量兩個文章間的相似度
[02:00:39] cos
[02:00:40] 兩個向量之間算cos就是這個公式
[02:00:46] 常常會有同學
[02:00:48] 搞不清楚說cos算夾角跟算內積
[02:00:52] 差別是什麼
[02:00:54] 其實你會發現
[02:00:55] 分子就是算內積嘛就是兩個Vector之間的內積
[02:00:59] 但是分母多了一個
[02:01:01] 除以它的長度
[02:01:03] 它就是兩個單位向量再算它的
[02:01:06] 它的之間的夾角cos公式是這樣
[02:01:09] 但是內積不太管
[02:01:10] 長度啦
[02:01:11] 內積就是看
[02:01:13] 同樣Dimension的有值
[02:01:15] 這樣把它整在一起
[02:01:17] OK
[02:01:18] 所以當你的
[02:01:20] 文章
[02:01:21] 你的Document的Vector
[02:01:23] 是正規化
[02:01:24] 所謂正規化是你所有Document都是
[02:01:27] 都是分佈在一個
[02:01:29] 這個半徑為1的球上面
[02:01:32] 就是多維空間的球體上
[02:01:34] 就是長度都是1的時候
[02:01:37] 你這都是1呀
[02:01:39] 所以在算相似度在算cos夾角的時候其實就是兩個向量的內積
[02:01:44] 就是兩個向量的內積
[02:01:45] 所以為什麼
[02:01:47] 以前你不知道說
[02:01:49] 就是把這兩個向量做內積你就知道它們有多像
[02:01:53] 它其實概念就是這樣
[02:01:55] 但是因為這個向量很大
[02:01:57] 因為就是跟你的Vocabular size有關嘛
[02:02:00] 就是3萬維度跟3萬維度在做內積這樣子
[02:02:03] 當然有一些快速它其實就是Scan
[02:02:06] 就是有值的把它抓出來然後
[02:02:08] 所以它就是Scan過一遍
[02:02:10] 所以
[02:02:11] 大概它的
[02:02:12] 它的order就是跟
[02:02:14] 向量有字的
[02:02:16] 多少字有關這樣子
[02:02:19] OK
[02:02:20] 那這件事情其實還蠻重要的
[02:02:22] 尤其是
[02:02:23] 到時候現在你說做LM做REG
[02:02:26] 你會建所謂的Vector Database
[02:02:30] 就是
[02:02:31] 向量資料庫
[02:02:32] 建一大堆向量
[02:02:34] 那你要算相似度嘛
[02:02:35] 其實你就在做這些事情
[02:02:37] 如果最標準的
[02:02:39] 簡單的做法就在做這件事情
[02:02:41] 你現在要檢索的東西
[02:02:43] 你覺得LM不知道
[02:02:45] 我要去我的Database去找一下
[02:02:48] 就是把這個這個詞轉成向量之後在你的向量資料庫裡面去比對這樣子
[02:02:53] 我就來做這件事情
[02:02:55] 那
[02:02:57] 你就要想像一下你這樣算出來到底
[02:03:01] 到底1跟0
[02:03:03] 是什麼樣的句子
[02:03:04] 到底它的中間有向的東西是什麼樣子
[02:03:08] 因為你的向量資料庫通常
[02:03:10] 不是Wandhar Vector
[02:03:11] 不是這種Sparse Vector
[02:03:14] 通常是Dense Vector
[02:03:15] 通常是模型轉換後的壓縮後的向量
[02:03:19] 那那個東西
[02:03:20] 其實
[02:03:21] 虎虎的
[02:03:22] 虎虎的以後不會知道
[02:03:23] 會再解釋什麼叫虎虎的反正就是
[02:03:26] 就是很多概念會
[02:03:28] 會黏在一起的時候
[02:03:30] 有時候很難去用那個Vector來算向量
[02:03:33] 的相似度
[02:03:38] 那我這邊秀一個變形以前我們在做TFIDF你就知道這些研究學者
[02:03:44] 整天閒閒沒事就在做這件事情
[02:03:46] 這個TFIDF
[02:03:48] 夠好我們來改變一下
[02:03:51] 那怎麼變呢
[02:03:52] 這個
[02:03:54] 就各式各樣
[02:03:55] 變形
[02:03:56] TF可以這樣變
[02:03:57] 這個
[02:03:58] IDF的DF可以這樣變
[02:04:01] 正規化有不同的變法因為
[02:04:03] 你就知道
[02:04:04] NORMAL ENGINE有很多不同NORMAL ENGINE的方式
[02:04:08] OK
[02:04:09] 我把這個講完
[02:04:10] 下課
[02:04:11] 那一般來講TF最簡單的就是
[02:04:16] 出現幾次嘛在這個句子在這邊文章出現幾次
[02:04:20] 有時候我們不再做
[02:04:22] IDF直接TF當權重這樣子
[02:04:25] 那也不做正規化的
[02:04:26] 這是最
[02:04:27] 最偷懶的方法
[02:04:29] 那有時候會做一件事情像這樣
[02:04:32] 這樣會做什麼就是
[02:04:34] 你的文章很大有些很大的時候那個出現一萬次兩萬次
[02:04:39] 跟有些只出現一次兩次的
[02:04:42] 我不做長度的正規化我直接取LOG
[02:04:46] 直接取LOG
[02:04:49] 或者是說做
[02:04:50] 壓縮
[02:04:53] 當你看到這種公式的時候你就知道了
[02:04:55] 他們的他就是把原來從0到1
[02:04:58] 的RANGE
[02:05:00] 壓縮到0.5到1的RANGE
[02:05:03] 就是
[02:05:04] 不要大家差這麼多
[02:05:05] 本來是0到1的差別現在把它變0.5到1的差別
[02:05:09] 你說這不是一樣嗎
[02:05:11] 這不是大家都
[02:05:12] 只是把它壓扁而已
[02:05:14] 壓扁的差別就是
[02:05:17] 可能以前有人
[02:05:18] 只有拿到0.01啊
[02:05:20] 本來只有0.1他現在可以變0.5
[02:05:23] 這個差別就差一點點
[02:05:25] 差很多了
[02:05:27] 所以
[02:05:27] 什麼樣的公式你一看就知道說他是大概處理什麼樣的問題
[02:05:32] 當然這也不叫作弊這是有點像說
[02:05:35] 我就希望說
[02:05:37] 在我的應用裡面
[02:05:39] 有些非常稀少數的東西
[02:05:41] 他也能夠
[02:05:42] 得到一點權重而且是權重不會被dominate掉的權重
[02:05:46] 我就可以這樣說
[02:05:49] 那其他的你可能自己思考
[02:05:51] 其實不只啦不只這些啦
[02:05:54] 所以以前呢
[02:05:55] 有
[02:05:56] query有查詢的
[02:05:57] 跟我要查詢的document的
[02:05:59] 我都有tf idf計算
[02:06:01] 所以以前會做什麼事情呢
[02:06:03] 這是query的
[02:06:05] ltn
[02:06:06] 代表是我這邊用
[02:06:08] ltn
[02:06:10] 這樣子
[02:06:10] query用這個演算法
[02:06:12] 然後呢
[02:06:13] document用lnc這樣子
[02:06:15] lnc
[02:06:18] 就是
[02:06:19] 我
[02:06:20] 我編輯我的查詢因為查詢的話比較短
[02:06:23] 所以有時候演算法會不一樣
[02:06:24] 文章通常比較大
[02:06:26] 會用比較大的作法
[02:06:27] 所以不同的計算方式
[02:06:29] 再把它做內積
[02:06:31] 有時候
[02:06:32] 不過你現在看不到的啦
[02:06:33] 這可能要去博物館再看
[02:06:35] 有些paper會分析這些東西
[02:06:39] 好
[02:06:39] 那就是代表什麼
[02:06:41] 你的query跟document長相不一樣的時候你可能需要有不同的權重計算的方式
[02:06:48] 這個你說老師我又不做資訊檢索用不太到
[02:06:51] 其實你在做reg的時候就會用到這些想法
[02:06:54] 那這個當然
[02:06:57] 就有不同的計算
[02:06:58] 那你說老師這有沒有道理
[02:07:00] 這個好像就
[02:07:00] 硬湊
[02:07:01] 沒錯
[02:07:02] 因為就是非常heuristic
[02:07:04] 非常heuristic
[02:07:05] 只是說他可以prove說
[02:07:07] 這個在我應用裡面我想要強調的東西
[02:07:10] 可以拉得出來這樣子
[02:07:13] 好
[02:07:14] 休息一下我們
[02:07:15] 下一節就從BM25開始講
## 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 一次),檢查後集中修改。