[自然語言處理](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)
## 重點
- LLM 出現以前,處理文字最大宗的工作是資訊檢索(information retrieval,從一大堆文件裡找出跟查詢最相關的那幾篇)。它的兩大重點是索引(找得快)和排序(排得準),這些問題現在做 RAG 一樣會遇到。
- 反向索引(inverted index)把「每個字 → 出現在哪幾篇、哪個位置」存成一張表,查詢時直接翻表,不用一篇一篇掃。建表時要用 hash 找字,資料一多才跑得動。
- 建索引前要先整理文字:斷詞(tokenization)、詞幹還原(stemming)或詞形還原(lemmatization)、拿掉停用詞(stop words)。這些步驟能省空間,但也可能弄丟語意。
## Exam-ready
- **Information Retrieval**: "Analyzing the textual content of individual Web pages (documents) … given user's query … determine a maximally related subset of documents"(W1_NLP_brief p.39)
- **Retrieval**: "index a collection of documents (access efficiency)"; "rank documents by importance (accuracy)"(W1_NLP_brief p.39)
- **Categorization (classification)**: "assign a document to one or more categories"; "Man-made (Yahoo & Dmoz) vs. automation"(W1_NLP_brief p.39)
- **Inverted index**: "effective for very large collections of documents"; "associates lexical items to their occurrences in the collection"(W1_NLP_brief p.40)【老師強調】(1:25:43)
- **Terms / Vocabulary V**: "lexical items: words or expressions"; "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))"(W1_NLP_brief p.40)
- **Bucket (posting list)**: "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.41); entries: "document identifier (DID)" and "offset (in characters) of term's occurrence within this document" → "enables vicinity queries"(W1_NLP_brief p.42)
- **Lexical Processing**: "Performed prior to indexing or converting documents to vector representations"; Tokenization = "extraction of terms from a document", e.g. "removing HTML tags", "removing punctuation and special characters", "folding character case (e.g. all to lower case)"(W1_NLP_brief p.43–44)
- **Stemming**: "Want to reduce all morphological variants of a word to a single index term"; "Porter stemming algorithm (1980) … relies on a preconstructed suffix list with associated rules", e.g. "BINARIZATION => BINARIZE"(W1_NLP_brief p.45)
- **Stemming vs. Lemmatization**: Stemming = "Rule-based", "Not always real word", "fast", "Search engine, fast preprocessing"; Lemmatization = "Corpus + Syntactic", "Real word", "slow", "Semantics understanding, QA, etc."(W1_NLP_brief p.46)【老師強調】(1:42:49)
- **Stop words**: "common words, such as articles, prepositions, non-informative adverbs"; "20-30% index size reduction"(W1_NLP_brief p.43); "A static set or dynamic one? … Depend on your application? … Dictionary-based matching … Avoid to broke the semantics"(W1_NLP_brief p.47;最後一句投影片文法有誤,考卷可寫 avoid breaking the semantics)
## [1:20:25](https://www.youtube.com/watch?v=MnA5KUETSg4&t=4825s) 從資訊檢索看文字
這一段先不用 LLM 這種「厲害的武器」,看以前的人怎麼處理文字。1998–99 年 World Wide Web(全球資訊網)蓬勃起來,網頁、部落格爆量,NLP 這時才真正被重視。Google 就是在這個年代靠資訊檢索(information retrieval,IR:使用者丟一個查詢,系統從大量文件裡找出最相關的一小批)起家,慢慢取代 Yahoo。所以那時候,資訊檢索的問題幾乎就等於 NLP 的問題。
用生活例子講,資訊檢索在做什麼?
想像一間有十億本書的圖書館。你到櫃台說:「我要找講 security 的書。」
館員要做兩件事。第一,**很快**找出所有提到 security 的書,這靠索引。第二,把幾千本結果**排好順序**,最有用的放最上面,這靠排序。
投影片的定義就是這句話的英文版:給定使用者的查詢(query),找出最相關的一小批文件(a maximally related subset of documents)。
老師原話是什麼?
「我們現在先不要拿出厲害的武器,不要用 LM」(1:20:35)
「資訊檢索的問題就跟 NLP 的問題幾乎畫上等號了」(1:22:09)
## [1:22:20](https://www.youtube.com/watch?v=MnA5KUETSg4&t=4940s) 資訊檢索兩大重點:索引與排序
投影片把檢索(retrieval)拆成兩件事:**index**(建索引,求存取效率)和 **rank**(排序,求準確)。以前電腦的算力和記憶體都小,資料又多,沒有索引根本找不到東西;有了索引,可以把「一篇一篇暴力翻」變成 log n 等級的搜尋。排序的代表是 Google 的 PageRank:不只看關鍵字,而是看有多少網頁連結到這一頁,像論文被引用越多越重要。另一條路是分類(categorization):Yahoo 早期靠人工把全世界網頁分成政治、運動、經濟等類別(DMOZ 也是同樣的精神),但網頁長得太快,人工撐不住,Yahoo 也就慢慢被 Google 取代。
| 要做的事 | 投影片寫法 | 以前的做法 | 現在的對應(我的補充) |
| **索引** | index a collection of documents (access efficiency) | 反向索引(下一段) | RAG 先從索引或向量資料庫把相關段落找出來 |
| **排序** | rank documents by importance (accuracy) | PageRank、下一章的 TF-IDF | 找回來的段落再排一次順序(rerank) |
| **分類** | Man-made (Yahoo & Dmoz) vs. automation | 人工分目錄 | 用模型自動分類 |
要先懂什麼?RAG 是什麼,為什麼跟資訊檢索有關?
RAG(retrieval-augmented generation,檢索增強生成):LLM 回答前,先去資料庫**找**出相關段落,把段落貼進 prompt,再讓 LLM **生成**答案。
前半段的「找」就是資訊檢索。所以老師說,以前做資訊檢索遇到的問題(資料太多、要找得快、要排得準),你現在做 RAG 也會遇到,只是手法可能不一樣。
要先懂什麼?「log n 等級的搜尋」是什麼意思?
Big-O 是描述「資料變多時,工作量怎麼長」的寫法。以一張 30,000 個字的字表為例:
- 從頭一個一個比(暴力法,O(n)):最多比 30,000 次。
- 字表先排好序,用二分搜尋(每次砍掉一半,O(log n)):log₂ 30,000 ≈ 14.9,最多約 15 次。
- 用 hash(雜湊表,直接算出位置,O(1)):大約 1 次。
資料變成十億篇時差距更誇張:log₂ 10⁹ ≈ 30,暴力法卻要 10⁹ 次。所以對你的影響是:只要資料量大,一定要先建索引。
老師原話是什麼?
「我可以把一個暴力法搜尋的東西,可以變成一個比較 log n 的搜尋的方式」(1:23:57)
「被多少人放了連結,他的網頁就相當的重要」(1:24:20)
「這些由於是排序都是比較像時代的眼淚」(1:24:31)
## [1:25:40](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5140s) Inverted index、term 與 vocabulary
建索引要做的是 **inverted index(反向索引)**:記下「每個字出現在哪幾篇文章」。【老師強調】(1:25:43) 老師要大家把這個名詞記下來。另外兩個基本名詞:**term** 是一個字、片語或關鍵字,概念像現在說的 token;**vocabulary V**(詞表)是系統要處理的所有 term 的集合。以前詞表是人工建的,預算少就只做 3,000 個常用字,英文要做得好大約要 3 萬字;Google 也釋出過 n-gram 資料(一字詞、二字詞、三字詞……的統計),規模遠大於 3 萬。
下表是三篇短文件建出來的反向索引(轉小寫、拿掉標點後,記「第幾篇, 第幾個字」)。D1:The cat sat on the mat. D2:The dog chased the cat. D3:A dog sat by the door.
| term | bucket(第幾篇, 第幾個字) |
| a | (3,1) |
| by | (3,4) |
| cat | (1,2) (2,5) |
| chased | (2,3) |
| dog | (2,2) (3,2) |
| door | (3,6) |
| mat | (1,6) |
| on | (1,4) |
| sat | (1,3) (3,3) |
| the | (1,1) (1,5) (2,1) (2,4) (3,5) |
為什麼叫「反向」?
「正向」是文件 → 裡面有哪些字,就像一本書從第一頁讀到最後一頁。
「反向」是字 → 在哪些文件、哪個位置,就像書最後面的索引頁:查 security,它直接告訴你在第 12、57 頁。
上表左欄那 10 個字就是這個小例子的詞表 V。注意:投影片記的位置是「第幾個字元」(offset in characters),這裡為了好算改成「第幾個字」,概念一樣。老師也提到,資料庫裡的 index 本身就隱含這個概念。
老師原話是什麼?
「這個名詞可能大家就記一下,因為這個是博物館會出現的名字,叫 Inverted index」(1:25:43)
「你要從大量的文章裡面去知道哪一個字在哪幾篇文章」(1:26:02)
## [1:27:39](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5259s) LLM 詞表大小:越大越好嗎
LLM 也有自己的 vocabulary,是在做 tokenization(把文字切成 token)時建出來的。投影片列的大小是 32K–256K:LLaMA 1、2 和 Mistral 7B 是 32K,GPT-3 是 50K,GPT-4 是 128K,Qwen 是 152K。越大越好嗎?老師的答案是各有利弊:詞表越大涵蓋越多,但模型參數量跟「詞表大小 V × 向量維度 d」成正比,而且每生成一個字,都要替詞表裡每個 token 算一次機率。老師也提到,以前建索引時詞表是邊建邊長,現在 tokenizer 用 BPE(byte pair encoding,把常一起出現的片段逐步合併成新 token)建詞表,也是這樣長出來的。
| 面向 | 詞表大 | 詞表小 |
| 參數量(V × d) | 多,跟 V 成正比 | 少 |
| 生成時每一步要算的機率數 | 多(要算 V 個) | 少 |
| 涵蓋範圍(我的補充) | 多語言、罕見字比較能整個當成一個 token | 很多字要拆成好幾個小片段,同一句話切出更多 token |
它到底怎麼運作?手算一次參數量
以 LLaMA 2 7B 為例:詞表 V = 32,000,每個 token 用 d = 4,096 維的向量表示。
- 輸入端的詞向量表(embedding matrix)有 32,000 × 4,096 = 131,072,000,約 1.31 億個參數。
- 假設詞表放大到 128,000、維度不變:128,000 × 4,096 = 524,288,000,約 5.24 億,剛好 4 倍。這就是老師說的「直接線性的關係」。
- 生成時,最後一層要把 4,096 維的向量乘上一個 4,096 × V 的矩陣,得到 V 個分數,再轉成機率。V 變 4 倍,這一步的乘法也變 4 倍。
要先懂什麼?embedding 和 softmax
老師說這部分要等講到 Transformer 才會細講,這裡先補短版。
- embedding matrix(詞向量表):一張 V 列、d 欄的表,每個 token 佔一列,那一列就是它的向量。所以大小是 V × d。
- softmax(把一串分數變成加起來等於 1 的機率):p_i = e^(z_i) / Σ_j e^(z_j)。例:三個 token 的分數是 2、1、0,取 e 次方得 7.39、2.72、1,總和 11.11,機率約 0.665、0.245、0.090。詞表有 32,000 個 token,就要對 32,000 個分數做這件事。
老師原話是什麼?
「小有小的好處,大有大的好處」(1:28:30)
「所以那個是一個直接線性的關係」(1:29:07)
「所以你這個 Vocabulary 越大,你就一次要算越多字的 Probability」(1:29:38)
## [1:30:20](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5420s) 反向索引怎麼建、怎麼跑得快
每篇文章進來先斷詞,記下每個字出現在第幾篇(DID,document identifier,文件編號)、第幾個位置(offset),串成那個字的 bucket(posting list,出現位置清單)。下圖中 computer 在第 2 篇第 83 個字元、第 3 篇第 79 個字元;使用者查 security,翻它的 bucket 就知道第 1 篇出現兩次、第 3 篇出現一次。難的是效率:每切出一個字,都要先在詞表裡找到它的 bucket 開頭,一個一個掃的話,文章越多越跑不動,所以一定要用 hash 直接找到。這種搜尋引擎的限制是只能比對一模一樣的字。
[[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w2\img\w1_nlp_brief_v2_p042.png | 反向索引:左邊是字典(term),中間是 bucket(文件編號, 字元位置),右邊是原文件]]
它到底怎麼運作?用上一段的三篇文件手算查詢
1. 單字查詢 dog:翻 dog 的 bucket,得到 (2,2) (3,2),回傳第 2、3 篇。
2. 查 dog sat,兩個字都要有(AND):dog 在第 2、3 篇,sat 在第 1、3 篇,取交集,得到第 3 篇。
3. 老師講的最簡單排序:把兩個 bucket 合起來,數每篇命中幾個字。D3 命中 2 個排第一,D1、D2 各命中 1 個排後面。
4. 查片語 "dog sat"(兩個字要相鄰):D3 裡 dog 是第 2 個字、sat 是第 3 個字,位置差 1,符合。這就是投影片說位置資訊 enables vicinity queries(可以查「靠得很近」的字)。位置也能拿來在結果頁顯示一小段上下文,像 Google 結果下面那兩行。
要先懂什麼?為什麼文章多十倍,時間卻多一百倍?
老師的故事:用 vibe coding 叫 AI 寫索引程式,前 100 篇一秒做完,1,000 篇卻像花了 100 倍時間,一萬篇幾乎跑不動。
- 原因是每處理一個字都要「找」:在詞表(約 3 萬個字)裡找到它的 bucket 開頭,找不到就新增,找到就串到後面。串法是 linked list(鏈結串列:每一格記著下一格在哪)。
- 如果每次「找」的成本也跟著資料量變大,總時間約是 1 + 2 + … + n ≈ n²/2,也就是 O(n²):n 變 10 倍,時間變 100 倍。老師沒細說是哪一步在變大;常見的元兇是詞表越建越大,以及每次要從 bucket 開頭走到尾巴才能串上新的一筆(這是我的補充推論)。
- 解法是 hash table(雜湊表:用一個函數把字直接算成表格裡的位置)。查一個字大約 O(1),不管表多大都差不多快。代價是要多佔記憶體,所以老師說 hash 的精神是「用空間換取時間」。
所以對你的影響是:叫 AI 寫這種程式時,要講清楚資料量很大、查表要用 hash,它才會寫出跑得動的版本。
這種最簡單的搜尋引擎還有什麼問題?
- 文件編號要省空間:幾十億篇文章時,一般 32 位元有號整數(最多約 21.47 億)存不下,要改用更長的整數,每個 bucket 就跟著變大。以前記憶體貴,這種小地方都要摳。(補充一個常見壓縮法,老師沒講:bucket 裡的文件編號由小到大排好後,只存「跟前一個差多少」,例如 1000、1003、1010 存成 1000、3、7,小數字用比較少的位元組就放得下。)
- 只能比對一模一樣的字:少一個字母,或意思一樣但用字不同,就找不到。Google 會提示拼錯字,是後來一步步演進出來的。早期大家的重點在排序(一百篇都有這個字,誰排前面);後來才想處理「意思一樣、字不一樣」的查詢,這正是之後詞向量要解決的事。
別人怎麼教這個?
Stanford《Introduction to Information Retrieval》(Manning、Raghavan、Schütze)線上版的 [A first take at building an inverted index](https://nlp.stanford.edu/IR-book/html/htmledition/a-first-take-at-building-an-inverted-index-1.html),一步一步示範怎麼建 dictionary 和 postings。
老師原話是什麼?
「我從字再反索引到我的文章,這叫 inverted index」(1:30:55)
「發現一千篇好像不是十倍的時間,好像是一百倍的時間」(1:31:57)
「Hash 的精神就是用空間換取時間」(1:37:02)
「很多蠢事情都是要自己做過,你才知道裡面的問題點在那裡」(1:37:34)
## [1:37:43](https://www.youtube.com/watch?v=MnA5KUETSg4&t=5863s) 前處理:斷詞、詞幹、停用詞
投影片 p.43 的標題是 Lexical Processing(詞彙處理:建索引或把文件轉成向量之前先做的整理),分三步。**Tokenization**(斷詞):從文件抽出 term;以前拿到的多半是網頁,所以要拿掉 HTML 標籤、標點和特殊符號,全部轉小寫,把資料格式統一,代價是有些細微差別被抹平。**Stemming**(詞幹還原):照規則砍字尾,回到詞根(root form),最有名的是 Porter 演算法(1980);詞根不一定是真的英文字,但同一個字的各種變形能歸成同一個 term。**拿掉 stop words**(停用詞:冠詞、介系詞這類到處都有、單獨搜尋沒意義的字):以前記憶體很貴,拿掉可以省 20–30% 的索引空間。
| 步驟 | 結果 | 發生什麼事 |
| 原文 | The fishermen were FISHING in the rivers! | 網頁裡的一段,前後還包著 HTML 標籤 |
| 1 Tokenization | the, fishermen, were, fishing, in, the, rivers | 拿掉標籤和標點、轉小寫,得到 7 個 term |
| 2 拿掉 stop words | fishermen, fishing, rivers | 停用詞表裡有 the、were、in,7 個剩 3 個 |
| 3 Stemming(Porter) | fishermen, fish, river | fishing 砍掉 -ing、rivers 砍掉 -s;fishermen 是不規則複數,規則砍不動 |
它到底怎麼運作?Porter 演算法怎麼砍?
Porter 靠一張預先寫好的字尾清單(suffix list),每個字尾配一條規則。投影片的例子:如果字尾是 -IZATION,而且前面至少有「一個母音後面接一個子音」,就把 -IZATION 換成 -IZE,所以 BINARIZATION → BINARIZE。
- 完整的 Porter 會一輪一輪套好幾組規則,真的跑完 binarization 會變成 binar(-IZE 在後面的步驟又被砍掉)。投影片只示範其中一條。
- 我用 NLTK 的 Porter 實作跑過的輸出:studies → studi、running → run、university 和 universe 都變 univers、organization 變 organ(跟「器官」撞在一起)。最後兩個是「砍過頭」:意思不同的字被歸成同一個 term。
- 投影片的 fish 例子:文件裡只有 fish、fisher,使用者查 fishing 就找不到;stemming 把它們歸成 fish 就找得到了。但 fishing rod(釣竿)砍成 fish rod,意思就跑掉了。(實際跑 Porter,fisher 會保留原樣,因為砍 -er 的規則要求前面的字根夠長;投影片是概念示意。)
用生活例子講,中文的斷詞為什麼更難?
英文字和字之間有空格,斷詞主要是去掉標點、轉小寫。中文沒有空格,老師說以前的 tokenization 比較像 segmentation(斷字),斷在哪裡本身就是問題。
例:「研究生命起源」可以斷成「研究/生命/起源」,也可以斷成「研究生/命/起源」。斷錯了,索引裡的 term 就跟著錯。
老師原話是什麼?
「它的 root 其實不見得是一個存在的英文單字」(1:39:00)
「以前有個步驟很重要,但是現在一點都不重要也不會去做」(1:39:47)(講 stop words)
「以前空間記憶體很貴」(1:40:34)
## [1:42:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6166s) Stemming vs Lemmatization
Lemmatization(詞形還原)也是把字還原成原形,但會參考語料和詞性,還原成字典裡真的存在的字。【老師強調】(1:42:49) 老師要大家了解它,因為它很有用。投影片的例子:studies 用 stemming 硬砍成 studi(不是英文字),用 lemmatization 得到 study。代價是慢,同樣的資料跑 lemmatization 要跑很久;好處是結果比較乾淨,對應到 LLM 的 token 表示也比較不會發散,所以有些論文會先把資料做 lemmatization。
| Stemming | Lemmatization |
| Method | Rule-based(照字尾規則砍) | Corpus + Syntactic(靠語料和詞性) |
| Output | Not always real word(studies → studi) | Real word(studies → study) |
| Performance | fast | slow |
| Usage | Search engine, fast preprocessing | Semantics understanding, QA, etc. |
**注意:老師口頭說 lemmatization 會考慮 semantic(語意);投影片寫的 Method 是 Corpus + Syntactic,考試寫投影片的版本。**
它到底怎麼運作?手算幾個字比一比
我用 NLTK 的 Porter stemmer 和 WordNet lemmatizer 實際跑過(lemmatizer 要告訴它詞性)。格式是「原字 → stemming / lemmatization」:
- studies → studi / study
- ran(動詞)→ ran / run:不規則變化,規則砍不動
- caught(動詞)→ caught / catch
- mice(名詞)→ mice / mouse
- better(形容詞)→ better / good
- fishing:當動詞(He is fishing)lemma 是 fish;當名詞(fishing rod)lemma 保持 fishing。這正好解掉上一段 fishing rod 被砍壞的問題;stemming 不看詞性,一律砍成 fish。
- 上一段例句改用 lemmatization:fishermen, fishing, rivers → fisherman, fish, river。
所以對你的影響是:要快、不在乎詞根長怎樣(搜尋引擎)→ stemming;要保留正確的字和語意(問答、語意理解)→ lemmatization。
用生活例子講,兩者差在哪?
Stemming 像拿剪刀把字尾一律剪掉:很快,但會剪出 studi 這種怪東西。
Lemmatization 像一個會查字典的人:先看這個字在句子裡是動詞還是名詞,再翻字典找它的原形。慢,但查出來的一定是真的字。
別人怎麼教這個?
- Stanford《Introduction to Information Retrieval》的 [Stemming and lemmatization](https://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html):有 Porter 的規則,以及 operate、operating、operation 全被砍成 oper 的例子。
- Martin Porter 本人維護的 [The Porter Stemming Algorithm](https://tartarus.org/martin/PorterStemmer/):演算法說明和各種語言的實作。
老師原話是什麼?
「這個詞其實大家可能要稍微瞭解一下,因為它還蠻有用的」(1:42:49)
「Stemming 常常會產生一堆不是英文字的字」(1:43:20)
「這樣你對應到整個大語言模型的那個 Token 的表示呢,就不會這麼發散」(1:44:52)
## [1:45:10](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6310s) 停用詞的取捨
投影片的文字雲裡,the、to、in、and 這些停用詞佔滿畫面,可見它們有多常出現。停用詞不是固定的一張表:不同語言不一樣,不同應用也不一樣,例如新聞檢索裡幾乎每篇都有「記者報導」,「報導」就可以當停用詞。拿掉也有風險:to be or not to be 每個字都是停用詞,全拿掉整句就消失了。所以後來大家寧願多買記憶體、不做這一步;現在 LLM 對 prompt 裡每個字都很敏感,乾脆讓 LLM 自己判斷哪些字不重要。
| 投影片的問題 | 投影片寫法 | 白話 |
| 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 | 刪的時機不對會弄壞語意(例:先做詞幹還原再刪停用詞,fishing rod 的詞可能就不見了) |
它到底怎麼運作?停用詞到底佔多少空間?
用前面三篇文件的反向索引算:每出現一次算一筆,總共 17 筆。光 the 就佔 5 筆;the、a、on、by 合計 8 筆,約 47%。玩具例子句子短,比例特別高;投影片說真實語料拿掉停用詞約省 20–30% 索引空間。
怎麼找出「這個應用的停用詞」?把每個字出現在幾篇文件裡排序,幾乎每篇都有的字就是候選。下一章的 IDF 就是把這個想法變成公式:N 篇文件、這個字出現在 n 篇,IDF = log(N/n)。「報導」每篇都有,n = N,IDF = log 1 = 0,完全沒有鑑別力。
為什麼 LLM 時代反而不刪停用詞?
老師的說法:LLM 對 prompt 很敏感,多一個字、少一個字,影響會一路傳下去(propagate),attention(模型決定每個字要多注意其他哪些字的機制,之後會講)算出來就不一樣。
例:常見的英文停用詞表(例如 NLTK 的)裡有 I、do、not、it。把 I do not like it 的停用詞刪掉,只剩 like,意思整個反過來。老師也說 not 其實可以當成表示否定(negation)的 term 保留。
別人怎麼教這個?
Stanford《Introduction to Information Retrieval》的 [Dropping common terms: stop words](https://nlp.stanford.edu/IR-book/html/htmledition/dropping-common-terms-stop-words-1.html):也用了 To be or not to be 的例子,並指出網頁搜尋引擎一般不用停用詞表。
老師原話是什麼?
「報導這兩個字呢,在你的應用裡面幾乎每一篇都會出現了」(1:46:34)
「我們寧願多買一點記憶體讓整個東西跑得起來,寧願不要做 stop words 這件事」(1:47:50)
「我們現在就讓 LM 去幫我們計算什麼叫做句子裡面的 stop words」(1:48:38)
## Self-check
Q1. What is an inverted index? What does each bucket (posting list) entry store, and what does the positional information enable?
**Answer**: An inverted index is a dictionary whose keys are terms ω ∈ V; the value b(ω) points to a bucket (posting list) that marks all occurrences of ω in the collection. Each entry stores the document identifier (DID) and the offset of the term's occurrence within that document. The offsets let the system present a short context (e.g., Google result snippets) and enable vicinity queries. It is effective for very large collections because a query looks up the term directly instead of scanning every document.
中文重點:字 → (文件編號, 位置) 的清單;位置可以顯示摘要、做鄰近/片語查詢。
Q2. Compare stemming and lemmatization in terms of method, output, performance, and usage. What does each return for "studies"?
**Answer**: Stemming is rule-based (e.g., the Porter algorithm's suffix list with rules), fast, and its output is not always a real word: studies → studi. It is used in search engines and fast preprocessing. Lemmatization uses corpus and syntactic information (part of speech), is slow, and returns a real word: studies → study. It is used for semantic understanding and QA.
中文重點:stemming 快但會產生假字;lemmatization 慢但得到字典裡的真字。
Q3. Why did early IR systems remove stop words, and why is it risky? Give an example.
**Answer**: Stop words (articles, prepositions, non-informative adverbs) appear in almost every document, so removing them reduced the index size by 20–30% when memory was expensive. However, removal can break the semantics: "To be or not to be" consists entirely of stop words and would disappear, and removing "not" can reverse the meaning. Stop words also depend on the language and the application (e.g., "reported" in news). Today systems usually keep them.
中文重點:以前為了省 20–30% 索引空間;但會弄壞語意,停用詞也隨語言和應用而變。
Q4. For an LLM vocabulary, is "bigger = better"? Explain two costs of a larger vocabulary.
**Answer**: Not necessarily; there is a trade-off. (1) The embedding matrix has V × d parameters, so the parameter count grows linearly with V (e.g., 32,000 × 4,096 ≈ 131M). (2) At every decoding step the model must compute a probability for every token in the vocabulary, so a larger V means more computation. The benefit is better coverage. Typical LLM vocabulary sizes are 32K–256K.
中文重點:參數量 V × d 線性增加、每生成一步要算 V 個機率;好處是涵蓋更多字。