[自然語言處理](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) ## 重點 - 向量空間模型(vector-space model)把每篇文件變成固定長度的向量:詞表有幾個字就有幾維,字有出現就有值。一篇文章只用到詞表裡很少的字,所以向量幾乎全是 0(稀疏)。 - 每一維的權重用 TF × IDF:TF 看這個字在「這一篇」出現得多頻繁(要除以文章長度),IDF 看這個字在「整個文件集」有多稀有。每篇都有的字 IDF=0,沒有鑑別力。 - 文件和查詢像不像,用 cosine(內積除以兩個向量的長度)算。向量先正規化成長度 1,cosine 就等於內積,RAG 的向量資料庫算的就是這個。TF-IDF 還有很多憑經驗調出來的變形(例 ltn.lnc)。 ## Exam-ready - **Vector-space model**: "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|))(W1_NLP_brief p.48)【老師強調】(1:49:28) - **Sparsity**: "Vector-space representations are sparse, |V| >> |d| (the number of distinct terms in any single document)"(W1_NLP_brief p.48) - **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ᵢ|, "nᵢⱼ - Number of occurrences of a term ωⱼ in a document dᵢ"(W1_NLP_brief p.49) - **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)【老師強調】(1:56:31) - **nⱼ and n**: "nⱼ - Number of documents which contain the term ωⱼ"; "n - total number of documents in the set"; IDF is an "absolute measure of term importance"(W1_NLP_brief p.50) - **Cosine coefficient**: "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′‖), cost O(|d| + |d′|); "Cosine similarity vs. dot product"(W1_NLP_brief p.51)【老師強調】(2:02:20) - **tf-idf variants**: "tf-idf weighting has many variants"; "Many search engines allow for different weightings for queries v.s. documents"; "ltn.lnc ?"; letters: l = 1 + log(tf), a = 0.5 + 0.5 × tf / max tf, t = log(N / df), c = cosine normalization(W1_NLP_brief p.52) ## [1:48:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6526s) 向量空間模型:把文章變成一排數字 上一章的反向索引(inverted index)只能回答「哪些文章有這個字」。使用者丟十幾個字,或丟一整篇文章要找相似文章時,需要能比「像不像」的表示法。向量空間模型把每篇文件變成固定長度的向量(像每篇都填同一張勾選表,電腦比較好比對):詞表定了 3 萬個字就是 3 萬維,一維代表一個字,有出現填 1、沒出現填 0。一篇文章通常只有兩三百個不同的字,3 萬維裡只有兩三百維不是 0,所以叫稀疏(sparse)。以前的搜尋基本上都建立在這個模型上,現在也常拿它當 baseline(比較基準)。【老師強調】(1:49:28) [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\nlp_w2_ch06_brief_p048.png | 向量空間模型:每個字(ω1、ω2、ω3)各佔一個座標軸,文件 d、d′ 各是一個向量 x、x′,夾角 α 越小代表兩篇越像]]
它到底怎麼運作?用三篇短新聞手算一次 假設前處理完只剩三篇極短的新聞(這個例子一路用到本章最後): - d1:ohtani ohtani homer report - d2:dodgers win report - d3:ohtani dodgers report 詞表 V 依字母排:(dodgers, homer, ohtani, report, win),每篇是 5 維向量: - d1 = (0, 1, 1, 1, 0) - d2 = (1, 0, 0, 1, 1) - d3 = (1, 0, 1, 1, 0) 投影片的 d = (ω(1), ω(2), …, ω(|d|)) 是說文件是一串字,ω(t) 是第 t 個字。老師補充:每個字先寫成 one-hot 向量(只有自己那一維是 1),例如 ohtani = (0, 0, 1, 0, 0)。把 d1 四個字的 one-hot 向量做 OR(任一個是 1 就是 1),就得到 (0, 1, 1, 1, 0)。如果改成相加,會得到 (0, 1, 2, 1, 0),也就是每個字的出現次數,這就是下一段 TF 的起點。
老師原話是什麼? 「可能你覺得很Trivial但是其實這個概念還蠻重要的」(1:49:28) 「這是一種固定的表示方式對電腦的理解來講是比較有利的」(1:50:00) 「雖然有3萬個這麼這麼長但是呢可能只有300個是有出現的」(1:52:09)
## [1:52:22](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6742s) TF:在這一篇出現越多次,可能越重要 只記 0 或 1 太粗,出現 1 次和 20 次應該有差別。TF(term frequency,詞頻)=這個字在這篇的出現次數 nᵢⱼ,除以這篇的總字數 |dᵢ|。老師的例子:一篇文章一直出現「大谷翔平」,大概就是在講他;如果只出現一次,其他都是一大堆道奇球員,那篇就不是在講大谷。除以總字數是正規化,不然長文章的次數天生就大,會壓過短文章。
它到底怎麼運作?TF 手算一次,順便看為什麼要除以長度 d1 = ohtani ohtani homer report,共 4 個字:TF(ohtani) = 2/4 = 0.5,homer 和 report 各 1/4 = 0.25。d2、d3 各 3 個字,每個字的 TF 都是 1/3 ≈ 0.333。 為什麼要除以長度:短文 A 只有 3 個字,ohtani 出現 1 次,TF = 1/3 ≈ 0.333。長文 B 有 30,000 個字,ohtani 出現 5 次,TF = 5/30,000 ≈ 0.00017。只看次數是 B 贏,但 A 每三個字就有一個是 ohtani,顯然更專心在講大谷。
老師原話是什麼? 「你一定要Normalize不然會被大文章所Dominate」(1:53:49)
## [1:54:01](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6841s) IDF:出現在越少篇文件,越有鑑別力 DF(document frequency,文件頻率)=整個文件集裡有幾篇文件含有這個字。IDF(inverse document frequency,逆文件頻率)=log(n / nⱼ):n 是文件總數,nⱼ 是含有這個字的文件數,取倒數讓「越少篇有」的字分數越高。老師的例子:一萬篇新聞每篇都寫「某某記者報導」,「報導」的 nⱼ=n,IDF=log 1=0,完全沒有權重,幾乎可以濾掉。所以 IDF 是鑑別器(discriminator),判斷一個字能不能把文件區分開。 **注意:老師口頭把 DF 說成「這個字總共出現幾次啊」(1:54:24),投影片的定義是「含有這個字的文件數」(Number of documents which contain the term ωⱼ),同一篇出現 10 次也只算 1 篇。考試寫投影片的版本。**
字出現在哪幾篇DF(nⱼ)IDF = log₁₀(3 / nⱼ)
homerd110.477
wind210.477
ohtanid1、d320.176
dodgersd2、d320.176
reportd1、d2、d330
DF 和「總共出現幾次」到底差在哪? 課本 Introduction to Information Retrieval 的例子:Reuters 新聞語料(806,791 篇)裡,try 和 insurance 總共都出現約 10,400 次,但 try 分散在 8,760 篇,insurance 只集中在 3,997 篇。講保險的文章會一直提 insurance,所以它比較能把「講保險的文章」挑出來。只看總次數分不出這兩個字,看 DF 才分得出來。
要先懂什麼?log 是什麼、為什麼要取 log? log₁₀(x) 是在問「10 要自乘幾次才等於 x」:log₁₀ 1 = 0、log₁₀ 10 = 1、log₁₀ 1000 = 3。 - log 1 = 0,所以每篇都有的字(n / nⱼ = 1)IDF 剛好是 0。 - log 長得很慢:n / nⱼ 大 1000 倍(10 變 10,000),IDF 只從 1 變 4。罕見字加分,但不會失控。 - 投影片沒指定底數。換底數等於所有 IDF 乘同一個常數,排名不變。本章一律用 log₁₀。
## [1:55:34](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6934s) 為什麼做 RAG 還要懂 TF-IDF 做 RAG(retrieval-augmented generation:先去資料庫找相關文件,再交給 LLM 回答)時,只用句子 embedding(模型把整句壓成的稠密向量)算相似度,效果常常不夠好,因為句子 embedding 有點模糊。在稠密向量(dense vector)之外再加上 TF-IDF 這種稀疏向量(sparse vector),關鍵字比對的效果會變好。TF-IDF 很古老,但是非常強的 baseline。【老師強調】(1:56:31) 要記住 IDF 是用來衡量一個字在整個文件集裡的鑑別性:一萬篇都有的字,查了等於把全部結果丟給使用者;只出現在一篇的字,一查就知道是哪一篇。
稀疏向量(TF-IDF)稠密向量(embedding)
維度詞表大小約 3 萬,大多是 0常見幾百到幾千維,都不是 0
一維代表什麼一個字說不出來,很多概念混在一起
擅長精確關鍵字:人名、型號、罕見詞換句話說、同義詞
弱點字不同就對不上(car 和 automobile)罕見關鍵字容易被「糊」掉
用生活例子講,為什麼兩種向量要一起用? 查「大谷翔平 第 50 支全壘打」。embedding 可能理解成「棒球選手打全壘打」,把別的球員的新聞也找來;TF-IDF 會抓住「大谷」「50」這種稀有、IDF 高的字,把真的在講那一支全壘打的新聞排到前面。一個補「意思相近但用字不同」,一個補「關鍵字一定要對上」(業界常叫 hybrid search,混合檢索)。
老師原話是什麼? 「通常你轉成句子的embedding它其實會有點模糊度」(1:56:02) 「雖然它是很古老的東西但是它是一個非常Strong的Baseline」(1:56:24) 「大家就要記住IDF是用來幹嘛」(1:56:31)
## [1:57:07](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7027s) IDF 的範圍、正規化和分佈圖 一個字只出現在 1 篇文件(nⱼ=1)時,IDF=log n,是最大值;出現在每一篇時 IDF=0,是最小值。再除以 log n(等於用 n 當 log 的底),就正規化到 0~1。不正規化的話,文件越多,最大的 IDF 越大、沒有上限,只是 log 長得慢,不會大到哪裡去。IDF 是 heuristic(經驗法則:以前的學者發現好用,大家就一直用),但它和 entropy 有理論上的關係。 [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\nlp_w2_ch06_brief_p050.png | IDF 分佈圖:橫軸是字頻率取 log10,縱軸是 IDF。左上是只出現一次的稀有字、專有名詞,右下是 stop words,中間一大團是一般的字]]
它到底怎麼運作?正規化 IDF 手算一次 n = 10,000 篇、用 log₁₀,最大值是 log₁₀ 10,000 = 4: - 只在 1 篇出現:IDF = 4,正規化後 4 / 4 = 1 - 在 100 篇出現:IDF = 2,正規化後 0.5 - 每篇都有:IDF = 0,正規化後 0
這張分佈圖要怎麼看、怎麼用? IDF = log n − log nⱼ,所以對 log 頻率畫圖是一條往右下的直線。右下角是 stop words(the、of 這種到處都有的字),IDF 很低,TF 乘上 IDF 就掉下來,通常會先拿掉;左上角是只出現一次的稀有字或專有名詞。 老師的用法:自己設計權重公式後,把想區分的字畫上去看。如果它們全擠在中間那一團、IDF 都差不多,這個公式就分不開它們,要改;能把它們拉開,才是好的鑑別工具。
IDF 跟 entropy 有什麼關係? 老師只說有關係、以後再講;投影片引了 Papineni 2001 "A theoretical justification of IDF"。補一個好懂的角度(不是老師講的):隨機抽一篇文件,它含有字 j 的機率是 pⱼ = nⱼ / n,IDF = log(n / nⱼ) = −log pⱼ,正好是資訊理論的「自訊息量」(self-information:越少發生的事,發生時帶來的資訊越多)。entropy 就是自訊息量的平均。
老師原話是什麼? 「但是其實IDF有一些理論的基礎它其實跟Entropy會有點關係」(1:58:30)
## [1:59:58](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7198s) cosine 相似度與內積 每篇文件換成 TF-IDF 權重後,就是一個 3 萬維、大多是 0、少數是零點幾的向量。兩篇文件(或文件和查詢)像不像,看兩個向量的夾角:完全一樣就沒有夾角,cos 0° = 1。cosine = 內積 ÷ 兩個向量長度的乘積,等於先把兩個向量縮成長度 1 再算內積。所以向量事先都正規化成長度 1(都落在半徑 1 的球面上)時,cosine 就等於內積;做 RAG 建的向量資料庫(vector database),最標準的做法就是在算這個。【老師強調】(2:02:20) 老師也提醒:向量資料庫存的通常是模型壓縮過的稠密向量,很多概念黏在一起,不像 TF-IDF 每一維都看得懂。
ohtanihomerdodgerswinreport和 q 的 cosine
q0.0880.239000(查詢本身)
d10.0880.119000**0.960(第 1 名)**
d30.05900.059000.245(第 2 名)
d2000.0590.15900(第 3 名)
它到底怎麼運作?cosine 手算一次 查詢 q = ohtani homer(2 個字,TF 各 0.5)。表中每一格 = TF × IDF,例如 d1 的 homer = 0.25 × 0.477 = 0.119,q 的 homer = 0.5 × 0.477 = 0.239。 q 和 d1: - 內積 = 0.088 × 0.088 + 0.239 × 0.119 = 0.0077 + 0.0284 = 0.0362 - ‖q‖ = √(0.088² + 0.239²) = 0.254;‖d1‖ = √(0.088² + 0.119²) = 0.148 - cos = 0.0362 ÷ (0.254 × 0.148) ≈ 0.960 q 和 d3 只有 ohtani 共同:內積 = 0.088 × 0.059 = 0.0052,‖d3‖ = 0.083,cos ≈ 0.245。q 和 d2 沒有共同的非 0 字,cos = 0。 report 三篇都有,權重全是 0,對分數毫無貢獻。如果只查「report」,三篇的 cosine 全是 0,等於沒查。
cosine 和內積(dot product)差在哪? 查詢 q = (1, 1, 0)。短文 A = (1, 1, 0),和查詢完全一樣;長文 C = (10, 0, 10),只有一半相關,但字很多。 - 內積:q · A = 2,q · C = 10,長文 C 贏。內積不管長度,長文件天生佔便宜。 - cosine:cos(q, A) = 1;cos(q, C) = 10 ÷ (√2 × √200) = 10 ÷ 20 = 0.5,短文 A 贏。 把每個向量除以自己的長度(變成單位向量),A 和 q 都變成 (0.707, 0.707, 0),內積 = 0.5 + 0.5 = 1,剛好等於 cosine。所以向量資料庫常先把向量存成長度 1,查詢時只算內積,比較快。
投影片上的 O(|d| + |d′|) 是什麼意思? |d| 是這篇文件裡不同的字有幾個(非 0 的維度數)。3 萬維大部分是 0,只要把兩篇的非 0 項各掃一遍(像拿兩張依字母排好的名單對照),遇到同一個字才相乘。所以時間跟兩篇的字數成正比,不是跟 3 萬成正比。
要先懂什麼?向量、內積、長度、cosine - 向量:一排數字,例 x = (3, 4)。 - 內積(dot product,投影片寫 xᵀx′):同位置相乘再加總。(3, 4) · (4, 3) = 12 + 12 = 24。 - 長度(norm,‖x‖):每項平方加總再開根號。‖(3, 4)‖ = √(9 + 16) = 5。 - cosine:內積 ÷ 兩個長度的乘積。(3, 4) 和 (4, 3):24 ÷ 25 = 0.96。方向一樣是 1,垂直(沒有共同的字)是 0。TF-IDF 權重不會是負的,所以文件間的 cosine 落在 0~1。
老師原話是什麼? 「分子就是算內積嘛就是兩個Vector之間的內積」(2:00:55) 「那這件事情其實還蠻重要的尤其是到時候現在你說做LM做RAG你會建所謂的Vector Database」(2:02:20)
## [2:03:38](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7418s) TF-IDF 的各種變形 TF、DF、正規化三個部分各有好幾種算法,投影片用一個字母代表一種(這套記法叫 SMART notation)。老師講了三種 TF:n(natural)直接用次數,不乘 IDF、不正規化是最偷懶的做法;l(logarithm)不做長度正規化、直接取 log,讓出現一兩萬次的字不會壓扁只出現一兩次的字;a(augmented)把 0~1 壓到 0.5~1,讓很少出現的字也分到一點權重。查詢短、文件長,兩邊可以用不同算法再做內積,例如 ltn.lnc。這些都很 heuristic,能證明的只是「在我的應用裡,想強調的東西拉得出來」,做 RAG 時也會用到這種想法。
部分字母(名稱)算法
Term frequencyn(natural)tf(t,d)
Term frequencyl(logarithm)1 + log(tf(t,d))
Term frequencya(augmented)0.5 + 0.5 × tf(t,d) / maxₜ tf(t,d)
Document frequencyn(no)1(不乘 IDF)
Document frequencyt(idf)log(N / df(t))
Normalizationn(none)1(不正規化)
Normalizationc(cosine)1 / √(w₁² + w₂² + … + w_M²)
投影片表上還有 b(boolean)、L(log ave)、p(prob idf)、u(pivoted unique)、b(byte size),老師沒講。 **注意:老師在下一章說這些變形「那的確這個公式不用去記」(2:24:31),要懂的是概念:TF 算一個字在一篇文章裡出現幾次,IDF 看它出現在整個資料集的幾篇文件、再取反向 (2:22:04)。**
它到底怎麼運作?log 和 augmented 會把數字壓成什麼樣? l(1 + log₁₀ tf):tf = 1 → 1;tf = 10 → 2;tf = 1000 → 4。出現 1000 次只比 1 次大 4 倍,不是 1000 倍。 a(這篇最多的字出現 100 次):tf = 1 → 0.505;tf = 10 → 0.55;tf = 50 → 0.75;tf = 100 → 1。最少的也有 0.5,排序不變,只是差距變小(下一章老師用期末調分來比喻)。
ltn.lnc 是什麼意思?手算一次 三個字母依序是 TF、DF、正規化。老師的讀法:查詢用 ltn(log TF、乘 IDF、不正規化),文件用 lnc(log TF、不乘 IDF、cosine 正規化),再做內積;IDF 只在查詢那邊乘一次。 三篇新聞、查詢 ohtani homer: - d1 用 lnc:次數 2、1、1(ohtani、homer、report)→ 取 l 得 1.301、1、1 → 長度 √(1.301² + 1 + 1) = 1.922 → 除完是 0.677、0.520、0.520。 - q 用 ltn:ohtani 1 × 0.176 = 0.176;homer 1 × 0.477 = 0.477。 - 分數(d1) = 0.176 × 0.677 + 0.477 × 0.520 ≈ 0.37;d3 三個字的 lnc 都是 0.577,分數 = 0.176 × 0.577 ≈ 0.10;d2 是 0。排名一樣是 d1、d3、d2。 **注意:課本 Introduction to Information Retrieval(第 6 章 Document and query weighting schemes 一節)的 SMART 記法是「文件在前、查詢在後」(ddd.qqq),標準例子是 lnc.ltc(文件 lnc、查詢 ltc)。投影片只寫「ltn.lnc ?」沒說順序,老師讀成查詢 ltn、文件 lnc。考試遇到時,把兩邊三個字母的意思都寫出來最保險。**
老師原話是什麼? 「你的query跟document長相不一樣的時候你可能需要有不同的權重計算的方式」(2:06:41) 「因為就是非常heuristic」(2:07:02)
別人怎麼教這個? - [IIR:Inverse document frequency](https://nlp.stanford.edu/IR-book/html/htmledition/inverse-document-frequency-1.html)(IDF 與 try/insurance 例子) - [IIR:Dot products](https://nlp.stanford.edu/IR-book/html/htmledition/dot-products-1.html)(cosine 與長度正規化) - [IIR:Document and query weighting schemes](https://nlp.stanford.edu/IR-book/html/htmledition/document-and-query-weighting-schemes-1.html)(SMART 記法、lnc.ltc)
## Self-check
Q1. In the vector-space model, what does each dimension represent, and why are document vectors sparse? **Answer**: Each dimension corresponds to one term in the vocabulary V, and each document is mapped to a vector in this high-dimensional space. The vectors are sparse because |V| >> |d|: the vocabulary has about 30,000 terms, but a single document contains only a few hundred distinct terms, so almost all entries are zero. 中文重點:一維=一個字;詞表 3 萬、一篇只用幾百個字,所以幾乎全是 0。
Q2. A collection has 1,000 documents. Term A appears in all 1,000 documents; term B appears in 10. Compute their IDF (log base 10). Which is the better discriminator? **Answer**: IDF(A) = log(1000/1000) = 0; IDF(B) = log(1000/10) = 2. Term B is the better discriminator: a term that occurs in a few documents separates them from the rest, while a term that appears in all documents gets zero weight. 中文重點:每篇都有的字 IDF=0;出現越少篇,IDF 越高、越能區分文件。
Q3. What is the difference between cosine similarity and the dot product, and when are they equal? **Answer**: cos(x, x′) = xᵀx′ / (‖x‖ · ‖x′‖). The numerator is the dot product; dividing by the two lengths removes the effect of vector length, so only the angle matters. The raw dot product grows with length and favors long documents. When all vectors are normalized to unit length, cosine similarity equals the dot product, which is what a vector database computes. 中文重點:cosine=內積除以長度;向量先正規化成長度 1,兩者相等。