[自然語言處理](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.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。它是稀疏向量的方法,至今仍是檢索很強的 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) - 中文:每篇文件變成高維空間裡的一個向量,詞表有幾個字就有幾維。這種表示是稀疏的(sparse(大部分是 0)):詞表大小 |V| 遠大於一篇文件的相異字數 |d|。 - **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) - 中文:反向索引適合非常大量的文件,它把每個詞(lexical item(詞項))連到它在文件集裡出現的地方;每個詞的 bucket(桶,出現清單)裝著指向它所有出現位置的指標(pointer)。白話:字 → 在哪些文章。 - **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) - 中文:在一篇文件裡出現很多次的字,通常比只出現一次的字重要。TF=字 j 在文件 i 的出現次數 nᵢⱼ,除以這篇文件的總字數 |dᵢ|。 - **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ⱼ), an "absolute measure of term importance"(W1_NLP_brief p.50)【老師強調】(2:22:13) - 中文:只出現在少數文件的字,比大多數文件都有的字更能區分文件(discriminator(鑑別者))。IDF=log(文件總數 n ÷ 含這個字的文件數 nⱼ),是「詞重要性的絕對量度」。 - **Document similarity**: "Ranks documents by measuring the similarity between each document and the query"; "In a vector-space representation the cosine coefficient of two document vectors is a measure of similarity"; cos(x, x′) = xᵀx′ / (‖x‖ · ‖x′‖)(W1_NLP_brief p.51) - 中文:排名的方法是量每篇文件和查詢有多像。在向量空間裡,兩個向量的 cosine 係數(內積除以兩個向量的長度)就是相似度,夾角越小越像。 - **tf-idf variants**: "tf-idf weighting has many variants"; "Many search engines allow for different weightings for queries v.s. documents"; a (augmented) = 0.5 + 0.5 × tf(t,d) / maxₜ tf(t,d)(W1_NLP_brief p.52) - 中文:TF-IDF 權重有很多變形,很多搜尋引擎讓查詢和文件用不同算法,例如 augmented(加強版)TF 把分數壓到 0.5 到 1。老師說公式不用背。 - **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) - 中文:Okapi BM25(1980 年代)是搜尋引擎用來「依照和查詢的相關程度替文件排名」的排序函數(ranking function),是改良版的 TF-IDF。 - **BM25 parameters and formula**: "BM11, BM15"; "k, b are free parameters"; "generally k=2, b=0.75"; 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) - 中文:k 和 b 是可以自己調的參數(free parameters),一般設 k=2、b=0.75;BM11、BM15 是同系列、參數不同的版本。公式意思:查詢每個字算「IDF × 會飽和、有長度打折的次數分數」再加總。老師說公式不用記。 - **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"; "Vector search is not robust to typos"(W1_NLP_brief p.94) - 中文:BM25 是搜尋很強的基準方法;稠密向量常見 768 或 1536 維;「相似」不一定「相關」;關鍵字搜尋對比向量搜尋,後者碰到拼錯字不穩。 ## [2:16:39](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8199s) 回頭看向量空間的例子 下課回來,老師回答線上提問,重講 p.48 的圖。假設詞表(vocabulary,電腦認得的字的清單)只有 W1、W2、W3 三個字,每篇文件就是三維空間裡的一個向量:字有出現那一維填 1,沒出現填 0。詞表可以從文件累積自己建,也可以拿現成的三萬個常用字字典,老師說通常用現成的,兩種沒什麼差別。一篇文章大約只有二十個不同的字,三萬格裡只有二十格是 1,這就叫稀疏(sparse)。 先懂兩個詞:向量(vector)就是一串排好順序的數字,例如 (1, 0, 1);有幾個數字就叫幾「維」(dimension),每一維可以想成一根座標軸。(第 1 週學過:把文字轉成向量,也就是一串數字,再算兩段文字像不像,見 [W1 週頁](https://app.notion.com/p/3e7fc631b0308199953aef38ee86b0ae)。) 這段最後的進階摺疊在做什麼:用 cat、dog、truck 三個字的小詞表,實際把三句話變成 0 和 1 組成的向量,再看哪兩篇比較像。只想懂概念可以跳過,記得「沒出現的字填 0,所以大部分是 0」就夠了。 生活比喻:詞表像一張三萬格的勾選表,每篇文章只在自己用到的二十個字旁邊打勾,其他格全空白。 做法(用文字說):定好詞表 → 每篇文章斷詞 → 有出現的字那格填 1、其他填 0 → 得到和詞表一樣長的向量。 下面這張 p.48 的圖,每個字是一個座標軸: [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\nlp_w2_ch07_brief_p048.png | p.48:三個字各是一個座標軸,文件 x、x′ 是兩支箭頭,夾角 α 越小越像]] 圖上重點: - Document Representation: Vector-space Model:用「向量空間模型」來表示一篇文件。 - Text documents are mapped to a high-dimensional vector space:每篇文件被放進一個維度很多的空間,變成一支箭頭。 - Each document d is represented as a sequence of terms ω(t):一篇文件 d 先看成一串字 ω(1)、ω(2)……ω(|d|)。 - ω1, ω2 and ω3 are terms; x and x′ are document vectors:右圖三根座標軸 ω1、ω2、ω3 各代表一個字;x 和 x′ 是兩篇文件(document d、document d′)的箭頭,α 是兩支箭頭的夾角。 - sparse, |V| >> |d|:稀疏,詞表的字數遠大於一篇文件裡不重複的字數。 這張圖在講:文件變成箭頭以後,要比兩篇文件像不像,就是看兩支箭頭的方向差多少。 夾角越小,兩篇用字越像,這就是上一章 cosine 相似度的由來。 cosine(餘弦)是一個用來量夾角的數字:兩支箭頭方向完全一樣是 1,完全沒有共同的字(互相垂直)是 0,所以越接近 1 越像。(上一章學過:[06 向量空間模型與 TF-IDF](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a) 用 cosine 替文件和查詢比相似度。) 考試可能怎麼問:Why are vector-space representations sparse?(答:詞表有幾萬維,一篇文件只用到幾十個不同的字,|V| >> |d|。) 注意:2:18:33–2:19:11 約 40 秒老師在處理投影畫面,這段影片可能看不到投影片(不確定)。
三個字的詞表實際長怎樣?(進階,可跳過) 詞表=cat(W1)、dog(W2)、truck(W3),不在詞表裡的字直接忽略。 - 文件 A「the cat and the dog」→ (1, 1, 0) - 文件 B「a big truck」→ (0, 0, 1) - 文件 C「dog dog dog」→ (0, 1, 0),只記有沒有出現,三次還是 1。 A、B 沒有共同的字,cosine = 0;A、C 都有 dog,cosine = 1 / √2 = 0.707。真實的三萬維只有 20 格是 1,電腦只存這 20 筆。
老師原話是什麼? 「所以你自己應用可以建立出你自己的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,記錄東西在哪裡的位址)從字指回文章。 這段的進階摺疊在做什麼:拿三篇短句實際建一張反向索引,示範查兩個字時只要讀兩張小清單,不用把每篇文章都看一遍;也順便說明這張表可以直接拿來算 IDF。 生活比喻:課本前面的目錄是正向(第 3 章 → 講了什麼),書末的索引是反向(BM25 → p.53、p.94)。想找某個詞在哪,就翻書末索引。 下面這張圖把兩個方向並排: ```mermaid flowchart LR D1["正向:文章 D1"] -->|"有哪些字"| T["cat、eats、fish"] W["反向:字 cat"] -->|"出現在哪些文章"| P["D1、D3"] ``` 搜尋時使用者給的是字,所以從字出發的表查起來最快。 做法(用文字說):查詢拆成字 → 每個字去表裡拿文章清單(posting list)→ 幾張清單合併或取交集 → 得到候選文件,不用每篇都掃。 上面兩個詞的白話:取交集(intersection)=只留兩張清單都有的文件,例如同時有 cat 和 dog 的文章;合併(union)=只要任一張清單有就算。 考試可能怎麼問:What is an inverted index, and why is it efficient for search?(答:字 → 文件的清單;查詢只讀那幾個字的清單。)
三篇短文的反向索引長怎樣?(進階,可跳過) D1「cat eats fish」、D2「dog eats meat」、D3「cat and dog」。反向索引:cat → D1、D3;dog → D2、D3;eats → D1、D2;fish → D1…… 查「cat dog」:只讀 cat 和 dog 兩張清單,取交集得到 D3。文件有一億篇時,差別就是「查兩張小清單」和「讀一億篇」。 清單長度就是 IDF 要用的 nⱼ(含這個字的文件數),建好反向索引,IDF 幾乎免費。
老師原話是什麼? 「就是我不是索引這個文章有哪些字這樣子,而是這些字出現在哪些文章」(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) 這段的進階摺疊在做什麼:用三篇短句實際算出 fish 和 eats 的 TF-IDF,讓你看到兩個字在同一篇都只出現一次,但比較稀有的 fish 權重高了將近三倍。 生活比喻:TF 像一篇文章一直提同一個名字,大概就是在講他;IDF 像點名,叫「同學」全班都回頭,叫到只有一個人有的名字才分得出是誰。 下面這張圖是 TF 和 IDF 怎麼合成一個權重: ```mermaid flowchart LR A["TF:在這一篇出現幾次"] --> C["TF × IDF=這個字在這篇的權重"] B["IDF:幾篇有它,越少越高"] --> C C --> D["這篇常提、別篇少提的字權重最高"] ``` 反過來,每篇都有的字(例如 the)IDF 是 0,權重歸零。 做法(用文字說):這個字在這篇的次數除以總字數(TF)→ 文件總數除以「有這個字的篇數」再取 log(IDF)→ 兩個相乘。 log(對數)沒學過也沒關係:它在問「這個數是底數的幾次方」,例如以 10 為底,log 1000 = 3、log 10 = 1、log 1 = 0。它的作用是把很大的數字壓小,1000 倍的差距取 log 後只剩 3。所以每篇都有的字,文件總數 ÷ 有它的篇數 = 1,log 1 = 0,權重直接歸零。 考試可能怎麼問:Define TF and IDF. What is the IDF of a word that appears in every document?(答:log 1 = 0,沒有鑑別力。)
用三篇短文算一次 TF 和 IDF(進階,可跳過) 沿用上一段的 D1、D2、D3,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 的將近三倍。取 log 是為了把大數字壓小,字再稀有,IDF 也不會大到壓扁其他字。
老師原話是什麼? 「但是你要知道你要知道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:排序不變,很少出現的字也拿得到基本分;代價是分數擠在一起,比較難分出高低(解析度變差)。查詢和文件也可以用不同組合(p.52 的 ltn.lnc,上一章講過)。 ltn.lnc 是一種代號:點前面三個字母是「查詢」的算法,點後面三個字母是「文件」的算法;三個字母依序代表 TF、IDF、正規化(normalization,把長短不同的文件調到能公平比較)各選哪一種。例如 l=次數先取 log、t=乘上 IDF、n=這一項不處理、c=用 cosine 把長度除掉。(上一章學過:[06 向量空間模型與 TF-IDF](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a)。) 這段的進階摺疊在做什麼:拿一篇文章裡 bank、loan、river 三個字的次數,比較「直接除以最大次數」和 augmented TF 的分數,讓你看到排名不變,但很少出現的字被拉高、不會被淹沒。 生活比喻:老師自己的例子是期末調分:有人考 10 分、一堆人 100 分,就把分數壓縮一下,名次不變。 下面這張圖是壓縮分數的效果(例子是我補充的,新分數 = 50 + 原始 ÷ 2): ```mermaid flowchart LR A["原始分數 10、50、100"] -->|"壓到 50~100"| B["新分數 55、75、100"] B --> C["名次不變"] B --> D["差距減半,比較難分高低"] ``` augmented TF 做同一件事,只是把 0~1 壓成 0.5~1。 考試可能怎麼問:Why does tf-idf have so many variants?(答:配合文章長度和字詞分佈的經驗法則,沒有理論證明。) **注意:老師說這些變形公式「不用去記」,會活用就好 (2:24:31)。**
augmented TF 算一次(進階,可跳過) augmented TF = 0.5 + 0.5 × tf / max tf(max tf=這篇出現最多次的字的次數)。bank 10 次、loan 5 次、river 1 次:直接除以最大值是 1.0、0.5、0.1;augmented 是 1.0、0.75、0.55。排序一樣,差距從 0.9 縮成 0.45,但 river 從 0.1 拉到 0.55,不會被淹沒。
老師原話是什麼? 「有可能是因為你的文章大小不一樣啊或是你的字詞的分佈不太一樣啊」(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 引用的向量資料庫公司文章也這樣說。它替文件 D 和查詢 Q 算「有多相關」的分數,本質是改良版 TF-IDF。兩個可調參數 k 和 b,以前的論文實驗發現 k=2、b=0.75 在多數應用效果都不錯,所以成了 BM 系列的老大。【老師強調】(2:24:46) 參數(parameter)是公式裡可以自己轉的旋鈕:數值不是從資料算出來的,是人先設好、試試看效果再調。BM25 有兩顆旋鈕:k 管「同一個字重複出現時,分數多快停止增加」,b 管「長文件要打多少折」。 這段的進階摺疊在做什麼:把 BM25 公式裡每個符號翻成白話,再用一篇短文和一篇灌關鍵字的長廣告實際算分,證明 BM25 底下短文會贏,而沒有飽和和長度打折時,廣告反而會贏。 生活比喻:餐廳被第 1 個朋友推薦很有用,第 50 個推薦就沒多大幫助(次數會飽和);一本 500 頁的書和一張傳單都提到「機票」3 次,傳單顯然更在講機票(長文件打折)。 下面這張圖是 BM25 替一篇文件打分數的步驟: ```mermaid flowchart LR Q["查詢拆成字"] --> I["每個字算 IDF,越稀有越高"] I --> T["數出現次數,分數會飽和(k)"] T --> L["依文件長度打折(b)"] L --> S["每個字的分數相加"] S --> R["所有文件依總分排序"] ``` BM25 比原始 TF-IDF 多了次數飽和和長文件打折,灌關鍵字的長文不容易贏。 考試可能怎麼問:What do the parameters k and b in BM25 control?(答:k 管次數多快飽和,b 管長文件打多少折。) **注意:老師口頭說「25 就是裡面的參數」。投影片同頁列了 BM11、BM15,25 比較像這系列公式的編號,真正的參數是 k 和 b;b = 1 就是 BM11,b = 0 就是 BM15(我補充)。老師說 p.94 在「最後一頁」,實際是倒數第二頁(p.95 是 Summary)。**
公式怎麼拆、實際算一次(進階,可跳過) 公式見 Exam-ready。f(qᵢ, D)=查詢字在 D 出現幾次,|D|=D 的字數,avgdl=平均文件長度,N=文件總數,n(qᵢ)=含這個字的文件數;投影片的 k 就是 k₁。 - 飽和:平均長度、k=2 時,次數分數是 tf × 3 / (tf + 2),1 次 = 1.00、2 次 = 1.50、10 次 = 2.50、100 次 = 2.94,永遠不超過 k+1 = 3。 - 例子:N = 10、avgdl = 10,查「cheap flight」,cheap 在 4 篇、flight 在 2 篇,IDF 分別是 0.368、1.224。D1 是 8 字短文,兩個字各 1 次,總分 1.77;D2 是 40 字廣告,cheap 6 次、flight 1 次,總分 1.02,短文贏。若只用「次數 × log(N / n)」、不管長度,D1 = 2.53、D2 = 7.11,灌關鍵字的廣告反而贏。
老師原話是什麼? 「搞不好這一頁還比較重要,就是BM25,BM25其實是一個非常強的一個Base Line」(2:24:46) 「他在算我的Document跟Query的Score」(2:25:32) 「發現K設2,B設0.75,是最好的這樣子」(2:26:39)
## [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,是一路改良權重和相似度算法的結果。 這段用到三個詞:內積(dot product)是兩個向量同一個位置的數字相乘、再全部加起來,兩篇共同的字越多,內積越大(上一章學過,cosine 就是內積再除以兩支箭頭的長度)。稠密向量(dense vector)是模型把整句話壓成的幾百個數字,每一格都有值,代表的是意思,不是某一個字。BERT 是 Google 2018 年推出的語言模型,能把句子轉成這種稠密向量(第 2 週第 04 章提過:[04 語法層次與深度學習時代](https://app.notion.com/p/3e6fc631b03081768161d6716089043a))。 生活比喻:TF-IDF 像替每位選手打體能分數;BM25 像直接算「這位選手適不適合這場比賽」,打分時已考慮分數上限和體型差異。 考試可能怎麼問:Is BM25 just an improved TF-IDF? Contrast sparse and dense retrieval.(見 Self-check Q4。) 下面這張表並排三種做法:
TF-IDF + cosineBM25稠密向量
它是什麼權重方法,再用 cosine 比兩個向量排序函數,直接算相關分數模型把文字壓成的向量
維度詞表大小,稀疏同左幾百到一千多(768、1536)
字出現很多次分數一直加會飽和,上限 k+1模型自己學
文件長短cosine 除以向量長度參數 b 打折模型內部處理
強項簡單、好解釋關鍵字、專有名詞比對準;strong baseline懂同義詞和換句話說
弱點字面不同就比對不到同左拼錯字不穩;相似不等於相關
稀疏和稠密互補,實務上常一起用。 **注意:老師說 BM25 公式也不用記 (2:28:40),要用時叫 AI 算。老師口頭說稠密向量「大概都不會超過 1000」維,但 p.94 列了 768 和 1536 維,記「幾百到幾千維,遠小於稀疏的三萬維」就好。**
為什麼老師說「進階版 TF-IDF」有點誤導? 檢索分兩步:「每一維填什麼數字」和「兩個向量怎麼比」。TF-IDF 只管第一步,第二步另外用 cosine;BM25 把兩步包成一個公式,長度調整藏在 TF 那一項裡,不用再除以向量長度。 考試寫: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 這類模型把句子轉成幾百維向量)比意思像不像。 p.94 的例子:「How to fix a faucet」(怎麼修水龍頭)和「Where to buy a kitchen faucet」(哪裡買水龍頭)意思很像,但想修理的人拿到購物頁沒有用,這就是「相似不等於相關」。
老師原話是什麼? 「所以他其實你可以想像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 to a posting list (bucket) of pointers to the documents (and positions) where it occurs: term → documents. A forward index goes the other way: document → terms. Technically both are ordinary database indexes; only the pointer direction differs. 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. 中文:反向索引把每個字連到一張出現清單(posting list,也叫 bucket),記錄它出現在哪些文件(也可記位置),方向是「字 → 文件」;正向索引反過來,是「文件 → 字」。技術上兩者都是普通的資料庫索引,只差指標方向。查詢由字組成,搜尋引擎只要讀那幾個字的清單再合併或取交集,不用掃過每篇文件,文件再多也快。清單長度剛好就是 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?(中文:定義 TF 和 IDF。每篇文件都出現的字,IDF 是多少?代表什麼?) **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 是字 j 在文件 i 出現的次數除以文件長度(TFᵢⱼ = nᵢⱼ / |dᵢ|),出現越多次通常越重要。IDF 看這個字在整個文件集有多稀有:IDFⱼ = log(n / nⱼ),n 是文件總數,nⱼ 是含這個字的文件數。每篇都有的字(nⱼ = n),IDF = log 1 = 0,完全分不出文件的差別,TF-IDF 權重是 0,例如 the、of 這類停用詞(stop words)。
Q3. What is BM25, and what do its free parameters k and b control? What values are generally used?(中文:BM25 是什麼?參數 k 和 b 各管什麼?一般設多少?) **Answer**: Okapi BM25 (1980s) is a ranking function used by search engines to rank matching documents according to their relevance to a given query. It sums, over the query terms, IDF × a modified term frequency, so it is an alternative (improved) TF-IDF. k controls term-frequency saturation: the contribution grows with the term count 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. 中文:Okapi BM25 是 1980 年代的排序函數,搜尋引擎用它依「和查詢有多相關」替文件排名:查詢每個字算「IDF × 改良過的次數分數」再加總,所以是改良版 TF-IDF。k 管次數分數多快飽和:出現越多次分數越高,但最多到 k+1,重複灌字效果越來越小。b(0 到 1)管長文件打多少折:b = 1 完全照長度調整(BM11),b = 0 不管長度(BM15)。一般設 k = 2、b = 0.75。
Q4. "BM25 is just an improved TF-IDF." Evaluate this statement, and contrast sparse (BM25) and dense (embedding) retrieval.(中文:「BM25 就是改良版 TF-IDF」這句話對嗎?並比較稀疏檢索和稠密檢索。) **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 document–query relevance with a saturated, length-normalized TF and a probabilistic IDF, summed over the query terms. It works on sparse vectors (dimension = vocabulary size), 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 是權重方法,只描述「一個文件向量每一維填多少」,相似度要另外用 cosine 算;BM25 是排序函數,直接替「文件和查詢有多相關」打分數,用的是會飽和、有長度打折的 TF 加上機率版 IDF,把查詢每個字的分數加總。BM25 用稀疏向量,維度等於詞表大小,精確關鍵字比對很準,仍是搜尋的強 baseline。稠密向量(例如 BERT 的 768 或 1536 維)抓得到意思相近,但相似不一定相關,碰到拼錯字也不穩。兩者互補,實務上常一起用。
讀完了嗎?下一章:[08 從詞袋到詞向量(2:29–2:59)](https://app.notion.com/p/3e6fc631b03081b1aab8f5c4fc716850)|回到週頁:[W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd)