[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd) › 07|影片 [2:16:39–2:29:52](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8199s)|投影片 W1_NLP_brief_v2 p.48–53(口頭提到 p.40–41 反向索引、p.94)|上一章 [06 向量空間模型與 TF-IDF(1:48–2:07)](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)|下一章 [08 從詞袋到詞向量(2:29–2:59)](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)
## 重點
- 反向索引(inverted index)是一張「字 → 出現在哪些文章」的表。技術上就是資料庫索引,差別只在方向:使用者查的是字,所以從字出發查表最快。
- TF(一個字在一篇文章裡出現幾次)和 IDF(這個字出現在整個資料集的幾篇文件,越少越有鑑別力)這兩個概念一定要懂。各種變形公式是經驗法則,不用背。
- BM25 是用改良版 TF-IDF 做成的排序函數:字出現越多次分數越高但會飽和,長文件會被打折,參數一般設 k=2、b=0.75。它是稀疏向量的方法,到今天仍是檢索的 strong baseline。
## Exam-ready
- **Vector-space model**: "Text documents are mapped to a high-dimensional vector space"; "Vector-space representations are sparse, |V| >> |d| (the number of distinct terms in any single document)"(W1_NLP_brief p.48)
- **Inverted index**: "effective for very large collections of documents"; "associates lexical items to their occurrences in the collection"(W1_NLP_brief p.40); "a bucket is a list of pointers marking all occurrences of ω in the text collection"(W1_NLP_brief p.41)
- **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"; TFᵢⱼ = nᵢⱼ / |dᵢ|(W1_NLP_brief p.49)【老師強調】(2:22:04)
- **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"; IDFⱼ = log(n / nⱼ)(W1_NLP_brief p.50)【老師強調】(2:22:13)
- **tf-idf variants**: "tf-idf weighting has many variants"; a (augmented) = 0.5 + 0.5 × tf(t,d) / maxₜ tf(t,d)(W1_NLP_brief p.52)
- **BM25 (Best Matching 25)**: "Okapi BM25 (1980s)"; "A ranking function used by search engines to rank matching documents according to their relevance to a given query."; "Alternative (improved) TF-IDF"(W1_NLP_brief p.53)【老師強調】(2:24:46)
- **BM25 formula**: score(D, Q) = Σᵢ₌₁ⁿ IDF(qᵢ) · f(qᵢ, D) · (k₁ + 1) / ( f(qᵢ, D) + k₁ · (1 − b + b · |D| / avgdl) ); IDF(qᵢ) = log( (N − n(qᵢ) + 0.5) / (n(qᵢ) + 0.5) )(W1_NLP_brief p.53)
- **BM25 parameters**: "BM11, BM15"; "k, b are free parameters"; "generally k=2, b=0.75"(W1_NLP_brief p.53)
- **Sparse vs. dense search**: "BM25 is a strong baseline for search"; "768 dimensions vs. 1536 dimensions"; "Similar does not necessarily mean relevant."; "keyword-based search vs. vector-based search"(W1_NLP_brief p.94)
## [2:16:39](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8199s) 回頭看向量空間的例子
下課回來,老師先回答線上提問,重新解釋 p.48 那張圖。假設詞表(vocabulary,電腦認得的字的清單)只有 W1、W2、W3 三個字,每篇文件就是三維空間裡的一個向量:某個字有出現,那一維就是 1,沒出現就是 0。真實的詞表大約三萬個字,一篇文章卻只有二十個左右不同的字,所以這個向量三萬格裡只有二十格是 1,其他全是 0,這就叫稀疏(sparse)。
[[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\nlp_w2_ch07_brief_p048.png | p.48:每個字各佔一個座標軸,每篇文件是一支箭頭(x、x′),兩支箭頭的夾角 α 越小,兩篇越像]]
**注意:2:18:33–2:19:11 約 40 秒,老師在處理投影畫面(說「沒有抓到畫面」),沒有講課內容。這段影片可能看不到投影片(不確定)。**
它到底怎麼運作?用三個字的詞表手算一次
詞表=cat(W1)、dog(W2)、truck(W3)。不在詞表裡的字(the、and、a、big)直接忽略。
- 文件 A「the cat and the dog」→ (1, 1, 0)
- 文件 B「a big truck」→ (0, 0, 1)
- 文件 C「dog dog dog」→ (0, 1, 0)。只記有沒有出現,所以出現三次還是 1。
- cos(A, B) = (1×0 + 1×0 + 0×1) / (√2 × 1) = 0:完全不像,因為沒有共同的字。
- cos(A, C) = (0 + 1 + 0) / (√2 × 1) = 0.707:有點像,因為都有 dog。
換成真實大小:詞表 30,000 維、文章只有 20 個相異字,只有 20 格是 1、29,980 格是 0,非零的比例約 0.067%。所以電腦實際上只存「第幾格有值」這 20 筆,不會真的存三萬個數字。
詞表要自己建,還是用現成的?
兩種都可以,老師說沒什麼差別。自己建:文件一篇篇進來、斷詞之後,把新看到的字累積進表裡。用現成的:直接拿別人整理好的三萬個常用字字典,老師說通常用這種。表裡的字可能已經過 stemming(砍回字根,fishing → fish)處理,但大小跟詞彙量差不多。詞表一旦固定,向量的維度就固定了。
老師原話是什麼?
「所以你自己應用可以建立出你自己的Vocabulary沒錯」(2:19:34)
「但是我們通常會拿一個已經人家做了常用字的一個字典,三萬個字的字典,來做這件事情」(2:19:37)
「三萬個長度的向量裡面只有20個是1,其他都是0」(2:20:09)
## [2:20:24](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8424s) 提問:inverted index 和 index 差在哪
有同學問反向索引(inverted index)和一般索引(index)差在哪。老師說技術上沒差,資料庫的索引本來就是這樣建的;差別在概念上的方向。直覺的想法是記「這篇文章有哪些字」(正向),反向索引則是記「這個字出現在哪些文章」,指標(pointer,記錄「東西在哪裡」的位址)是從字指回文章。搜尋時使用者給的是字,所以從字出發查表最快。
它到底怎麼運作?三篇短文手算一次
三篇文件:D1「cat eats fish」、D2「dog eats meat」、D3「cat and dog」。正向索引是 D1 → cat、eats、fish 這種寫法;反向索引把它翻過來:
| 字 | 出現在哪些文件(posting list,出現清單) | 幾篇(nⱼ) |
| cat | D1, D3 | 2 |
| dog | D2, D3 | 2 |
| eats | D1, D2 | 2 |
| fish | D1 | 1 |
| meat | D2 | 1 |
| and | D3 | 1 |
查「cat dog」:只要讀 cat 的清單(D1, D3)和 dog 的清單(D2, D3),取交集得到 D3,不用把每篇文件掃一遍。文件有一億篇時,差別就是「查兩張小清單」和「讀一億篇」。
順便一提:清單的長度就是 IDF 要用的 nⱼ(含這個字的文件數),所以建好反向索引,IDF 幾乎免費。
用生活例子講,正向和反向差在哪?
課本前面的「目錄」是正向:第 3 章 → 講了哪些東西。課本最後面的「索引」是反向:「BM25 → p.53、p.94」。你想找某個詞在哪裡時,一定是翻最後面的索引,不會從目錄一章章翻。反向索引就是搜尋引擎的「書末索引」。
老師原話是什麼?
「就是我不是索引這個文章有哪些字這樣子,而是這些字出現在哪些文章」(2:20:46)
「沒錯如果你真的以技術來講你的索引其實就是建這個東西」(2:21:00)
「但是我現在是反向,所以我的pointer是指回來的」(2:21:15)
## [2:21:28](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8488s) 提問:字幕與 TF-IDF 要懂到哪
有同學問有沒有字幕,老師說 YouTube 可以開自動字幕,但可能會怪怪的。又有同學說教材看不懂,另一位同學回「這頁看不懂沒關係」(應該是指 p.52 那張變形表),老師同意,但強調兩個概念一定要懂:TF 是一個字在一篇文章裡出現幾次;IDF 是看這個字出現在整個資料集的幾篇文件,再取反向(inverse)。【老師強調】(2:22:04)
它到底怎麼運作?用上面三篇短文算一次 TF 和 IDF
公式照投影片:TFᵢⱼ = nᵢⱼ / |dᵢ|(這個字在這篇出現幾次 ÷ 這篇總字數),IDFⱼ = log(n / nⱼ)(文件總數 ÷ 含這個字的文件數,再取 log)。這裡 log 用自然對數。
- fish 在 D1:TF = 1/3 = 0.333;只有 1 篇有 fish,IDF = log(3/1) = 1.099;TF-IDF = 0.366。
- eats 在 D1:TF = 1/3 = 0.333;有 2 篇有 eats,IDF = log(3/2) = 0.405;TF-IDF = 0.135。
兩個字在 D1 都只出現一次,但 fish 比較稀有,權重是 eats 的將近三倍。如果有個字三篇都有,IDF = log(3/3) = 0,它的權重直接歸零,等於沒有鑑別力。
要先懂什麼?log 在這裡做什麼
log 是「把大數字壓小」的函數:log(1) = 0,log(10) = 2.303,log(100) = 4.605,數字大 100 倍,log 只多 4.6。所以字越稀有 IDF 越大,但不會大到把其他字全壓扁;每篇都有的字,n / nⱼ = 1,log(1) = 0。
老師原話是什麼?
「但是你要知道你要知道TF是這個算出現次數算它在一篇文章中出現的次數」(2:22:04)
「IDF是在算它在整個dataset裡面所出現的document次數」(2:22:13)
「你要知道這個概念」(2:22:23)
## [2:22:47](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8567s) 權重變形是經驗法則
TF-IDF 有很多變形(p.52),是為了配合你的應用:文章長短不同、字詞分佈不同,就調整算法。老師說這些變形「沒有什麼可以推導出來的證明」,是設計權重的經驗法則,通常就是組合試試看,或看自己資料的分佈來決定。但有些變形有道理可循,例如 augmented TF 把 0 到 1 壓到 0.5 到 1:排序不變,很少出現的字也拿得到基本分;代價是分數擠在一起,比較難分出高低(解析度變差)。
**注意:老師說這些變形公式「不用去記」,會活用就好 (2:24:31)。**
它到底怎麼運作?手算一次「壓到 0.5 到 1」
augmented TF = 0.5 + 0.5 × tf / max tf(max tf=這篇文章裡出現最多次的那個字的次數)。
一篇文章裡:bank 出現 10 次(最多)、loan 5 次、river 1 次。
- 直接除以最大值:1.0、0.5、0.1
- augmented:0.5 + 0.5 × 1.0 = 1.0;0.5 + 0.5 × 0.5 = 0.75;0.5 + 0.5 × 0.1 = 0.55
排序一樣(bank > loan > river)。最高和最低的差距從 0.9 縮成 0.45,解析度少了一半;但 river 從 0.1 拉到 0.55,不會被淹沒。
另一種常見變形是取 log:1 + log₁₀(tf),得到 2、1.70、1。出現 10 次的字,權重只有出現 1 次的 2 倍,不是 10 倍。
用生活例子講,為什麼要壓縮分數?
老師的例子是期末調分:有人考 10 分,一堆人考 100 分。
- 線性壓縮:新分數 = 50 + 原始分數 ÷ 2,得到 55、75、100。名次完全不變,但彼此的差距減半,這就是 augmented TF 的做法。
- 台灣常見的「開根號乘以十」:得到 31.6、70.7、100。低分被拉得特別多,高分幾乎不動,這跟 TF 取 log 是同一個想法。
老師原話是什麼?
「有可能是因為你的文章大小不一樣啊或是你的字詞的分佈不太一樣啊」(2:22:36)
「這些說實在沒有什麼道理,沒有什麼可以推導出來的證明,只是一般我們在設計權重的時候的一種經驗法則」(2:23:00)
「每次期末在調班上成績的時候就要做這件事情」(2:23:33)
「就是把數值的分佈做Compression,但是他的排序還是一樣的,只是數字的大小不一樣」(2:23:52)
「那的確這個公式不用去記,不太需要去記,你大概就是活用」(2:24:31)
## [2:24:45](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8685s) BM25
老師說「搞不好這一頁還比較重要」:BM25(Best Matching 25)是非常強的 baseline(基準方法,新方法至少要贏過它才算數),p.94 向量資料庫公司的人也寫「BM25 is a strong baseline for search」。它算的是文件 D 和查詢 Q 有多相關,給一個分數,本質上是改良版的 TF-IDF。它有兩個可調的參數 k 和 b,以前的論文實驗發現 k=2、b=0.75 在大多數應用效果都不錯,所以成了 BM 系列的老大。【老師強調】(2:24:46)
**注意:老師口頭說「25 就是裡面的參數」。比較精確的說法是:25 是這一系列公式的編號,同頁投影片也列了 BM11、BM15;真正的參數是 k 和 b。b 取極端值時,BM25 就變成 BM11(b = 1)和 BM15(b = 0)。老師說 p.94 在「這一份投影片的最後一頁」,實際是倒數第二頁(最後一頁 p.95 是 Summary)。**
它到底怎麼運作?公式拆成三個想法
score(D, Q) = Σᵢ₌₁ⁿ IDF(qᵢ) · f(qᵢ, D) · (k₁ + 1) / ( f(qᵢ, D) + k₁ · (1 − b + b · |D| / avgdl) )
IDF(qᵢ) = log( (N − n(qᵢ) + 0.5) / (n(qᵢ) + 0.5) )
符號:qᵢ 是查詢裡的第 i 個字;f(qᵢ, D) 是它在文件 D 出現幾次;|D| 是 D 的字數;avgdl 是整個資料集的平均文件長度;N 是文件總數;n(qᵢ) 是含這個字的文件數。投影片旁邊寫的 k 就是公式裡的 k₁。Σ 是「把查詢裡每個字的分數加起來」。
- 想法一,稀有字加分:IDF 跟之前一樣,越少文件有這個字越高。+0.5 是為了不要除以 0。注意這個版本在一個字出現在超過一半的文件時會變負數(N=10、n=6:log(4.5/6.5) = −0.368),p.52 的 p(prob idf)用 max(0, …) 就是為了擋這件事。
- 想法二,次數會飽和:在平均長度的文件、k=2 時,TF 那一項是 tf × 3 / (tf + 2)。出現 1 次 = 1.00,2 次 = 1.50,5 次 = 2.14,10 次 = 2.50,100 次 = 2.94,永遠不會超過 k+1 = 3。k 越大,飽和得越慢。
- 想法三,長文件打折:同樣出現 2 次,文件長 5 字 = 1.85,10 字(平均)= 1.50,20 字 = 1.09,40 字 = 0.71。b 控制打折的力道:b = 0 完全不管長度,b = 1 完全照長度調整。
手算一次:一篇短文和一篇灌關鍵字的長廣告,誰贏?
資料集 N = 10 篇,平均長度 avgdl = 10 字。查詢「cheap flight」。cheap 出現在 4 篇,flight 出現在 2 篇。k = 2、b = 0.75,log 用自然對數。
第一步,IDF:cheap = log(6.5 / 4.5) = 0.368;flight = log(8.5 / 2.5) = 1.224。flight 比較稀有,價值是 cheap 的三倍多。
第二步,長度係數 K = k × (1 − b + b × |D| / avgdl):
- D1 是 8 字的短文,cheap 1 次、flight 1 次。K = 2 × (0.25 + 0.75 × 0.8) = 1.7。TF 項:cheap = 1 × 3 / (1 + 1.7) = 1.111,flight 也是 1.111。
- D2 是 40 字的廣告,cheap 6 次、flight 1 次。K = 2 × (0.25 + 0.75 × 4) = 6.5。TF 項:cheap = 6 × 3 / (6 + 6.5) = 1.44,flight = 1 × 3 / (1 + 6.5) = 0.40。
| 文件 | cheap 貢獻 | flight 貢獻 | BM25 總分 |
| D1 短文 | 0.368 × 1.111 = 0.409 | 1.224 × 1.111 = 1.360 | **1.77** |
| D2 長廣告 | 0.368 × 1.44 = 0.530 | 1.224 × 0.40 = 0.490 | 1.02 |
D1 贏。對照組:如果用「原始次數 × log(N / n)」、不做長度調整,D1 = 1 × 0.916 + 1 × 1.609 = 2.53,D2 = 6 × 0.916 + 1 × 1.609 = 7.11,灌了 6 次 cheap 的廣告反而贏。BM25 靠「次數會飽和」加「長文件打折」擋掉這種情況。
用生活例子講,BM25 在做什麼?
想像你在找「便宜機票」的資料。
- 次數會飽和:一篇文章提到「機票」1 次,跟提到 5 次差很多;但提到 50 次和 100 次,其實都只是「很在講機票」,再多也不會更相關。就像餐廳被第 1 個朋友推薦很有用,被第 50 個推薦時,多一個人的幫助就很小了。
- 長文件打折:一本 500 頁的書提到「機票」3 次,和一張傳單提到 3 次,傳單顯然更在講機票。長文件本來就容易什麼字都出現一點。
老師原話是什麼?
「搞不好這一頁還比較重要,就是BM25,BM25其實是一個非常強的一個Base Line」(2:24:46)
「他在算我的Document跟Query的Score」(2:25:32)
「發現K設2,B設0.75,是最好的這樣子」(2:26:39)
別人怎麼教這個?
- [Introduction to Information Retrieval:Okapi BM25](https://nlp.stanford.edu/IR-book/html/htmledition/okapi-bm25-a-non-binary-model-1.html):Stanford IR 課本,k₁ 建議 1.2 到 2、b = 0.75。
- [Wikipedia:Okapi BM25](https://en.wikipedia.org/wiki/Okapi_BM25):名稱由來,以及 BM11、BM15 和 b 的關係。
- [37 Things I Learned About Information Retrieval…](https://www.leoniemonigatti.com/blog/what_i_learned.html):p.94 引用的原文。
## [2:27:05](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8825s) BM25 和 TF-IDF 差在哪
老師先說 BM25 就是「複雜版的 TF-IDF」,接著自己修正:TF-IDF 只是描述「一個文件向量的每一維該給多少權重」的方法;BM25 則是「算兩邊有多相關」的演算法,只是裡面用了變形的 TF-IDF。現在 RAG 論文提到的 BM25,指的是在稀疏向量(維度=詞表大小,例如三萬維)上算出的分數;BERT 這類模型產生的稠密向量(dense vector)只有幾百到一千多維,每一維都有值,兩種各有好壞。從向量空間模型、TF-IDF 到 BM25,是同一條路一路改良權重和相似度算法的結果。
**注意:老師說 BM25 的公式也不用記 (2:28:40),要用時叫 AI 幫你算就好。**
**注意:老師口頭說稠密向量「大概都不會超過 1000」維;p.94 同時列了 768 維和 1536 維,所以也有超過 1000 維的模型。記「稠密向量幾百到幾千維,遠小於稀疏向量的三萬維」就好。**
| TF-IDF + cosine | BM25 | 稠密向量(dense embedding) |
| 它是什麼 | 權重方法,描述單一向量;再用 cosine 比兩個向量 | 排序函數,直接算查詢和文件的相關分數 | 模型把整段文字壓成的向量 |
| 維度 | 詞表大小(約三萬),稀疏 | 同左,稀疏 | 幾百到一千多(例 768、1536) |
| 字出現很多次 | 分數一直往上加 | 會飽和,上限 k+1 | 沒有「次數」的概念,模型自己學 |
| 文件長短 | 靠 cosine 除以向量長度 | 靠參數 b 打折 | 模型內部處理 |
| 強項 | 簡單、好解釋 | 關鍵字、專有名詞、型號比對很準;strong baseline | 懂同義詞和換句話說 |
| 弱點 | 字面不同就比對不到 | 同左 | 拼錯字不穩;相似不等於相關(p.94) |
為什麼老師說「進階版 TF-IDF」有點誤導?
把檢索拆成兩步:第一步「每一維填什麼數字」,第二步「兩個向量怎麼比」。
- TF-IDF 只管第一步。第二步另外用 cosine(內積再除以兩個向量的長度)。
- BM25 把兩步包成一個公式:對查詢裡的每個字,算「IDF × 會飽和、有長度打折的 TF」,再全部加起來。這等於「查詢向量(查詢裡的字是 1)」和「文件的 BM25 權重向量」做內積,沒有 cosine 的除以長度,長度的調整已經藏在 TF 那一項裡。
所以老師 2:25:59 先說 BM25「基本上是在算兩個 TF-IDF 的 cosine」,2:27:05 又自己修正說內積的公式也不太一樣。考試寫:TF-IDF is a term-weighting scheme; BM25 is a ranking (similarity) function built on a modified TF-IDF。
要先懂什麼?RAG 和稠密向量
RAG(retrieval-augmented generation,先從資料庫找出相關段落,再交給大型語言模型讀著回答)的第一步就是檢索。稀疏的做法(TF-IDF、BM25)比的是字面有沒有一樣的字;稠密的做法(BERT 這類模型把句子轉成幾百維的向量)比的是意思像不像。上一章老師提過,只用稠密向量會有點模糊,加上 TF-IDF 這種稀疏向量,關鍵字的檢索效果會變好 (1:55:56)。稠密向量怎麼學出來,下一章開始講。
老師原話是什麼?
「所以他其實你可以想像BM25就是一個複雜版的TFIDF的表示的這種相似度的計算過程」(2:26:15)
「我這樣講可能有一點誤導,因為TFIDF只是用來描述Document Vector的一個權重的描述方式」(2:27:05)
「那BM25是在算相似度的演算法」(2:27:17)
「我有多少字我就有多少個Dimension」(2:28:13)
「這是BM25,其實你也不用記公式」(2:28:40)
## Self-check
Q1. What is an inverted index, and how does it differ from a forward index? Why is it effective for very large document collections?
**Answer**: An inverted index maps each term in the vocabulary to a posting list (bucket) of pointers to the documents, and optionally the positions, where the term occurs: term → documents. A forward index goes the other way: document → terms. Technically both are ordinary database indexes; the difference is the direction of the pointers. Because a query consists of terms, the engine only reads the posting lists of the query terms and merges or intersects them, instead of scanning every document. The length of a posting list is also the document frequency needed for IDF.
中文重點:反向索引是「字 → 文章」,查詢時只讀那幾個字的清單,不用掃過全部文件。
Q2. Define TF and IDF. Using IDFⱼ = log(n / nⱼ), what is the IDF of a term that appears in every document, and what does that mean?
**Answer**: TF measures how often term j occurs in document i, normalized by document length: TFᵢⱼ = nᵢⱼ / |dᵢ|. A term that appears many times within a document is likely more important. IDF measures how rare the term is across the collection: IDFⱼ = log(n / nⱼ), where nⱼ is the number of documents containing the term and n is the total number of documents. If nⱼ = n, IDF = log 1 = 0, so the term has no discriminating power and its TF-IDF weight is zero (e.g., stop words).
中文重點:TF 看「這一篇」出現幾次,IDF 看「幾篇」有它;每篇都有的字 IDF = 0,沒有鑑別力。
Q3. Write the BM25 scoring function and explain the roles of its free parameters k and b. What values are generally used?
**Answer**: score(D, Q) = Σᵢ IDF(qᵢ) · f(qᵢ, D)(k₁ + 1) / ( f(qᵢ, D) + k₁(1 − b + b|D|/avgdl) ), with IDF(qᵢ) = log((N − n(qᵢ) + 0.5)/(n(qᵢ) + 0.5)). k₁ controls term-frequency saturation: the contribution grows with f(qᵢ, D) but is bounded by k₁ + 1, so repeating a word many times gives diminishing returns. b (0 ≤ b ≤ 1) controls document-length normalization: b = 1 fully scales by document length (BM11), b = 0 ignores length (BM15). Generally k = 2 and b = 0.75.
中文重點:k 管「次數多快飽和」,b 管「長文件打多少折」;一般 k=2、b=0.75。
Q4. "BM25 is just an improved TF-IDF." Evaluate this statement, and contrast sparse (BM25) and dense (embedding) retrieval.
**Answer**: Partly true. TF-IDF is a term-weighting scheme that describes a single document vector; similarity is then computed separately, e.g., with the cosine coefficient. BM25 is a ranking function that directly scores the relevance of a document to a query, using a modified TF (saturated and length-normalized) and a probabilistic IDF, summed over the query terms. BM25 works on sparse vectors whose dimension equals the vocabulary size (|V| >> |d|), so it matches exact keywords well and remains a strong baseline for search. Dense embeddings (e.g., BERT, 768 or 1536 dimensions) capture semantic similarity, but similar does not necessarily mean relevant, and vector search is not robust to typos.
中文重點:TF-IDF 是「權重」,BM25 是「排序函數」;稀疏向量擅長精確關鍵字,稠密向量擅長語意,兩者互補。