TF-IDF 在長文本上為什麼會判斷失準?
某企業以詞頻-逆文件頻率(Term Frequency-Inverse Document Frequency,TF-IDF)方法分析顧客意見內容,但發現模型在處理篇幅較長的回饋文本時,無法準確反映關鍵詞的重要性。下列何者為造成此現象的主要原因?
一家企業用「TF-IDF」這個方法來分析顧客寫的回饋意見。TF-IDF 是一種幫每個詞評分的方法,分數高代表這個詞「重要」。
但他們發現一個問題:顧客寫的回饋越長,TF-IDF 就越不準,沒辦法正確找出哪些詞真的重要。
問你:為什麼長文本會讓 TF-IDF 失準?主要原因是什麼?
一句話總結
TF-IDF 在長文本失準的主要原因:文章越長,每個詞出現的次數(TF,詞頻)就越高,導致「的、了、很」這類常見詞的 TF 分數被過度放大,搶走了真正關鍵詞的重要性排名。
先感受問題:兩篇評語,同一個詞,分數差很多
假設「評語達人」平台分析餐廳顧客回饋,用 TF-IDF 找出「這篇評語最重視哪些面向」。
顧客甲的短評(50 個字):
→ 「牛排」出現 1 次,TF = 1/50 = 0.02
顧客乙的長評(500 個字):
→ 「牛排」出現 5 次,TF = 5/500 = 0.01
乙的長評裡「牛排」提了 5 次,但 TF 反而更低!原因是分母(總字數)也大了十倍。
但還有另一個問題:乙的長評裡,「的」這個字可能出現 80 次(TF = 80/500 = 0.16),遠高於「牛排」的 0.01。雖然 IDF 會壓低「的」的分數,但當所有詞的 TF 都因為長文本而偏高,常見詞的絕對次數更是暴增,IDF 的壓制效果就不夠用了。
這就是長文本讓 TF-IDF 失準的核心機制。
TF-IDF 的設計假設,在長文本上為什麼撐不住
TF-IDF 設計的時候,假設的文件長度是差不多的。它的五個在長文本上的弱點:
- 詞頻隨文章長度累積:1000 字的文章,同一個詞重複說三次,TF 是 3/1000 = 0.003;同樣三次在 100 字文章裡是 3/100 = 0.03。同樣「重複三次」,短文章的 TF 是長文章的十倍。
- 功能詞被放大:長文章裡「的、了、在、是、也」這些虛詞出現幾十上百次,即使被 IDF 壓低,絕對 TF 值的巨大差距仍會干擾排名。
- 真正關鍵詞稀釋:「理賠糾紛」可能在 1000 字投訴書裡出現 3 次,TF 才 0.003;在 100 字短評裡出現 1 次,TF 是 0.01。關鍵程度一樣,分數卻差了 3 倍多。
- 無法區分重複強調和隨意提及:顧客刻意重複「牛排」五次是強調,但長評裡的「服務」「環境」「價格」每個說兩次,TF-IDF 分不清哪個更重要。
- 長文有更多主題混在一起:長評可能同時評論食物、服務、環境、停車,TF-IDF 對每個詞獨立評分,抓不到「這段在討論哪個主題」的語境。
為什麼「詞頻偏高導致常見詞過度放大」是主要原因
回到「評語達人」平台。一篇 800 字的投訴書,出現頻率最高的詞是:
「了」:80 次 TF = 0.10
「我」:60 次 TF = 0.075
「理賠」:8 次 TF = 0.01
「拒絕」:5 次 TF = 0.00625
這篇文章最核心的概念是「理賠被拒絕」,但 TF-IDF 的 TF 部分,「的」的 0.15 是「理賠」的 15 倍。
IDF 確實會對「的」這種所有文件都有的詞大幅扣分(IDF 接近 0),但問題是:在長文本裡,真正關鍵的詞(「理賠」)的 TF 也被整體稀釋了,IDF 的乘積結果變小,整體排名就偏了。
這就是「長文本中的詞頻偏高,導致常見詞權重被過度放大」的具體機制,也就是選項 A 講的主要原因。
這就是選項 A 講的:長文本中的詞頻偏高,導致常見詞權重被過度放大。
技術版:TF-IDF 公式拆解與長文本的數學失衡
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
TF-IDF 的完整公式:
TF(t, d) = 詞 t 在文件 d 中出現的次數 / 文件 d 的總詞數
IDF(t, D) = log( 文件總數 N / 包含詞 t 的文件數 df_t )
TF-IDF(t, d, D) = TF(t, d) × IDF(t, D)
- TF(詞頻):「這個詞在這篇文章裡有多頻繁?」
- IDF(逆文件頻率):「這個詞在所有文章裡有多罕見?」(罕見 = 重要)
- TF × IDF:在「這篇文章裡頻繁」且「在所有文章裡罕見」的詞,分數最高
- 長文章問題:所有詞的出現次數都增加,但 TF 公式有分母(總詞數)理論上自動平衡,但常見詞累積效應仍然比關鍵詞更大
| 故事 | 公式符號 |
|---|---|
| 詞 t 在文件 d 中出現幾次 | count(t, d) |
| 文件 d 共有幾個詞 | |d| |
| 詞頻(出現比例) | TF = count(t,d) / |d| |
| 全部共有幾篇文件 | N |
| 包含這個詞的文件有幾篇 | df_t |
| 逆文件頻率(罕見度) | IDF = log(N / df_t) |
| 最終重要性分數 | TF × IDF |
- TF(Term Frequency,詞頻)
- 衡量一個詞在「這篇文章裡」有多常出現。除以總詞數是為了讓不同長度的文章可以比較。
- IDF(Inverse Document Frequency,逆文件頻率)
- 衡量一個詞在「所有文章裡」有多罕見。「的」出現在每篇文章,IDF 接近 0;「理賠糾紛」只在少數文章出現,IDF 很高。
- log
- 取對數是為了壓縮極端值。沒有 log 的話,「出現在 1 篇 vs 出現在 100 篇」的 IDF 差距會太誇張。
- df_t
- Document Frequency of term t。包含詞 t 的文件數量。df_t 越大,代表這個詞越「普通」,IDF 越低。
用數字說明長文本問題。假設兩篇文章都說到「理賠」3 次:
# 短文(100 字)
TF("理賠", 短文) = 3 / 100 = 0.030
# 長文(1000 字)
TF("理賠", 長文) = 3 / 1000 = 0.003 # 低了 10 倍
# 功能詞「的」在長文出現 100 次
TF("的", 長文) = 100 / 1000 = 0.100 # 是「理賠」的 33 倍!
# 假設 IDF("的") = 0.01(超低,每篇都有)
# 假設 IDF("理賠") = 3.0(高,只在投訴裡出現)
TF_IDF("的", 長文) = 0.100 × 0.01 = 0.001
TF_IDF("理賠", 長文) = 0.003 × 3.0 = 0.009
# 「理賠」還是贏,但差距被大幅壓縮了
# 加上其他高頻詞的干擾,整體排名就會偏掉
用 scikit-learn 計算 TF-IDF 的示範:
from sklearn.feature_extraction.text import TfidfVectorizer
docs = [
"牛排非常好吃份量足服務也很熱情", # 短評
"這家餐廳的牛排真的讓我印象深刻牛排的熟度剛剛好牛排的醬汁也很棒牛排真的值得再來" # 長評
]
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(docs)
# 查看各詞的 TF-IDF 分數
import pandas as pd
df = pd.DataFrame(
tfidf_matrix.toarray(),
columns=vectorizer.get_feature_names_out()
)
print(df[["牛排", "好吃", "印象"]].round(3))
蓋住公式,說出 TF-IDF 長文本失準的機制:
- TF = 詞出現次數 / 文件總詞數
- 文章越長,分母(總詞數)越大
- 常見詞(的、了)在長文章裡出現次數暴增,TF 值依然很高
- IDF 壓制不夠用,常見詞的最終 TF-IDF 分數過高,關鍵詞排名受影響
為什麼其他選項是錯的
B長文本中缺乏明確句子邊界,造成 TF-IDF 無法計算詞頻
說長文章因為句子邊界不清楚,導致 TF-IDF 根本無法計算詞頻,連基本功能都失效。
TF-IDF 的計算單位是整篇文件,不是句子,根本不需要句子邊界。計算詞頻只需要統計「這個詞在整篇文章出現幾次 ÷ 文章總詞數」,有沒有句號都沒差。長文章 TF-IDF 的問題不是「無法計算」,而是計算出來但結果失真。
知道 NLP 需要斷句(Sentence Boundary Detection)這個步驟的考生,誤以為 TF-IDF 也依賴句子邊界。TF-IDF 在詞語層級運作,不在句子層級,句子邊界對它無關。
CTF-IDF 無法同時處理多份文件
說 TF-IDF 一次只能處理一篇文章,沒辦法同時分析多份文件。
這是錯的。TF-IDF 的 IDF(逆文件頻率)本來就需要多篇文件才能計算。IDF 的公式是 log(N / df_t),N 是文件總數,df_t 是包含該詞的文件數。少了多篇文件,根本算不出 IDF。所以 TF-IDF 本來就設計來處理文件集合(corpus),而非單篇文件。
只聽過「TF-IDF 幫詞評分」但沒深究 IDF 計算方式的考生。看到「處理多份文件聽起來很複雜」就覺得可能做不到。記住:IDF 需要多份文件,所以 TF-IDF 本來就是設計來批量處理語料庫的。
D長文本會改變 IDF(Inverse Document Frequency)的計算,使所有詞權重趨於相近
說長文章會影響到 IDF 的計算,讓所有詞的分數都差不多,分不出重要的和不重要的。
IDF 的計算取決於「哪幾篇文件包含這個詞」,而不是「文章有多長」。一篇 1000 字的文章,只要包含「理賠」這個詞,它在 IDF 裡就算一篇「包含理賠的文件」,跟是 100 字還是 1000 字無關。所以長文本不會改變 IDF。長文本影響的是 TF,不是 IDF。
對 TF 和 IDF 的分工搞不清楚的考生,看到題目說「長文本讓計算失準」,就猜可能是 IDF 出問題。需要記住:長度影響的是 TF(詞在文件裡的頻率),IDF 只看「多少篇文件有這個詞」,跟每篇文件多長無關。
同個考點下次怎麼變形
如果語料庫裡只有一篇文件,TF-IDF 還有意義嗎?
IDF 公式是 log(N / df_t),N = 1,每個詞的 df_t 也是 1(只有這篇),那 IDF = log(1/1) = 0,所有詞的 TF-IDF 都是 0?
完全正確。單篇文件時 IDF 對所有詞都是 0,TF-IDF 全部歸零,失去意義。TF-IDF 需要多篇文件才能發揮「透過稀有度區分重要性」的功能。這就是為什麼實務上 TF-IDF 一定配合文件集合(corpus)使用,而不是對單篇分析。
如果用「BM25」取代 TF-IDF,長文本問題有改善嗎?
BM25 是 TF-IDF 的改良版,應該對長文本有針對性的處理?
有,而且是專門為此設計的。BM25 在 TF 計算上加了「飽和函數」:詞出現次數增加到某個程度後,對分數的貢獻就不再增加(飽和)。此外 BM25 還有文件長度正規化(長文章的分數被折扣),這兩個機制直接解決了 TF-IDF 的長文本問題。BM25 是現代搜尋引擎的標準基礎算法。
TF-IDF 被 BERT 這類語言模型取代了嗎?
BERT 能理解語意,TF-IDF 只看詞頻,應該已經被淘汰了?
沒有完全取代,各有用武之地。TF-IDF 優點是速度極快、可解釋性高(能直接告訴你哪個詞重要)、不需要 GPU,適合快速關鍵字提取和文件索引。BERT 優點是語意理解深,但推理速度慢、需要大量計算資源。實務上,很多系統先用 TF-IDF 快速過濾候選,再用 BERT 精排前幾名(Recall-then-Rerank)。
TF-IDF 在「圖像搜尋」領域有對應的概念嗎?
TF-IDF 是文字概念,圖像應該無法直接用?
有類比概念。傳統影像檢索使用「視覺詞袋」(Bag of Visual Words,BoVW):把圖片特徵向量(SIFT、ORB)量化成「視覺詞」,然後用 TF-IDF 衡量哪些視覺詞對這張圖最有辨識度。「出現在很多圖裡的視覺詞(角落、邊框)IDF 低,出現在少數圖裡的視覺詞(特定紋路)IDF 高」,和文字的邏輯完全一樣。
怎麼評估 TF-IDF 關鍵詞提取的品質?
讓人來看看提取出的詞對不對就好了?
有量化指標。常用的是 Precision@K(前 K 個提取的詞裡有幾個是真正的關鍵詞)和 Recall@K(真正的關鍵詞裡有幾個被提取到)。「真正的關鍵詞」由人工標注提供(黃金標準)。另一種方式是讓提取的關鍵詞去做文件分類,看分類準確率是否提升,間接驗證關鍵詞品質。
想再往下看,這 5 個
- TF-IDF(Term Frequency-Inverse Document Frequency)核心考點:以詞頻乘以逆文件頻率衡量詞語重要性的算法,長文本中詞頻偏高會導致常見詞權重被過度放大。
- BM25算法(BM25)TF-IDF 的改良版,加入詞頻飽和與文件長度正規化,直接針對長文本失準問題設計的改良方案。
- 詞袋模型(Bag of Words)TF-IDF 的基礎概念,把文件表示為詞語計數向量,忽略詞序,是 TF-IDF 長文本問題的共同根源。
- 語義搜尋(Semantic Search)以語意向量取代 TF-IDF 詞頻統計的搜尋方法,能理解詞語深層含義,不受文本長度影響。
- 自然語言處理(Natural Language Processing)TF-IDF 所屬的技術大類,了解 NLP 全貌有助於理解 TF-IDF 在整個文本分析流程中的定位。