TF-IDF(Term Frequency-Inverse Document Frequency)是一種廣泛應用于文本挖掘和信息檢索領域的經典加權算法,主要用于評估一個詞語在文檔集合中的重要程度。其核心思想是:一個詞語在文檔中出現的頻率越高,同時在所有文檔中出現的頻率越低,則該詞語對該文檔的區分能力越強。
TF-IDF 的計算公式
TF-IDF(Term Frequency-Inverse Document Frequency)是一種常用的文本特征提取方法,由兩部分組成:
1. 詞頻(TF,Term Frequency)
TF 衡量一個詞在當前文檔中出現的相對頻率,計算公式為:
TF(t,d) = (詞 t 在文檔 d 中出現的次數) / (文檔 d 的總詞數)
應用場景:在一篇關于水果的文檔中,"apple"出現頻率自然比"computer"要高,TF值能反映這種詞頻差異。
示例計算:
- 文檔 d 有 100 個詞
- 單詞 "apple" 出現 5 次
- 則 TF("apple", d) = 5 / 100 = 0.05
注意事項:
- 常用對數化或歸一化處理來平滑極端值
- 短文檔中個別高頻詞可能產生過大的TF值
2. 逆文檔頻率(IDF,Inverse Document Frequency)
IDF 衡量一個詞在整個語料庫中的稀有程度,出現越少的詞權重越高:
IDF(t,D) = log[ (語料庫中文檔總數 N) / (包含詞 t 的文檔數 + 1) ]
改進說明:
- 加1平滑處理(+1)是為了避免某些詞未出現在語料庫中導致分母為0
- 對數運算(通常以10為底)可以壓縮數值范圍
示例計算:
- 語料庫有1000篇文檔
- "apple"在100篇文檔中出現過
- 則 IDF("apple", D) = log(1000 / (100 + 1)) ≈ log(9.90) ≈ 2.30
特殊案例:
- 停用詞(如"the"、"is")幾乎出現在所有文檔中,IDF值會趨近于0
- 專業術語通常具有較高的IDF值
3. TF-IDF 最終計算
將TF和IDF相乘得到最終權重:
TF-IDF(t,d,D) = TF(t,d) × IDF(t,D)
示例計算:
- TF("apple", d) = 0.05
- IDF("apple", D) ≈ 2.30
- 則 TF-IDF("apple", d, D) = 0.05 × 2.30 ≈ 0.115
實際應用注意事項:
- 語料庫規模會影響IDF值
- 不同領域的文檔需要分別計算IDF
- 通常會進行歸一化處理(如L2歸一化)
- 可以結合停用詞過濾提高效果
變體公式: 一些實現會使用不同的對數底數或調整平滑方式,例如:
- IDF(t,D) = log[1 + (N/(df(t)+1))]
- 使用自然對數(ln)代替常用對數(log10)
?TF-IDF 的 Python 實現?
Scikit-learn:?TfidfVectorizer
用途??:將文本轉換為 TF-IDF 特征矩陣,適用于機器學習任務。
核心參數??
參數 | 類型 | 默認值 | 說明 |
---|---|---|---|
| str |
| 輸入類型( |
| str |
| 文本編碼方式 |
| bool |
| 是否轉換為小寫 |
| str/list |
| 停用詞表( |
| int |
| 最大特征數(按詞頻排序) |
| tuple |
| N-gram 范圍(如? |
| int/float |
| 忽略詞頻低于此值的詞(整數=次數,浮點數=比例) |
| int/float |
| 忽略詞頻高于此值的詞(整數=次數,浮點數=比例) |
| str |
| 歸一化方式( |
| bool |
| 是否啟用 IDF 權重 |
| bool |
| 是否平滑 IDF(避免除零錯誤) |
??關鍵方法??
方法 | 說明 |
---|---|
| 學習詞匯和 IDF |
| 將文檔轉換為 TF-IDF 矩陣 |
| 合并? |
| 獲取詞匯表(Python ≥3.6) |
| 獲取停用詞列表 |
# 導入必要的庫
from sklearn.feature_extraction.text import TfidfVectorizer # 導入TF-IDF向量化工具
import pandas as pd # 導入pandas用于數據處理# 讀取文本文件
file = open('task2_1.txt', 'r') # 打開名為'task2_1.txt'的文本文件
data = file.readlines() # 讀取文件的所有行,存儲在列表data中# 初始化TF-IDF向量化器
vectorizer = TfidfVectorizer() # 創建TF-IDF向量化器對象# 計算TF-IDF矩陣
vetft = vectorizer.fit_transform(data) # 對數據進行擬合和轉換,得到TF-IDF矩陣(稀疏矩陣)
print(vetft) # 打印TF-IDF矩陣(顯示稀疏矩陣的存儲格式)# 獲取特征詞(詞匯表)
words = vectorizer.get_feature_names_out() # 獲取所有特征詞(即詞匯表)
print(words) # 打印特征詞列表# 將TF-IDF矩陣轉換為DataFrame
# vetft.T 轉置矩陣(行變列,列變行)
# .todense() 將稀疏矩陣轉換為稠密矩陣
# index=words 使用特征詞作為行索引
df = pd.DataFrame(vetft.T.todense(), index=words) # 創建DataFrame,行是特征詞,列是文檔
print(df, end='\n') # 打印DataFrame# 提取特定文檔(第6列,索引為5)的TF-IDF特征
features = df.iloc[:, 5] # 獲取第6個文檔的所有特征值(Python從0開始計數)
features.index = words # 設置索引為特征詞(確保順序一致)
results = features.sort_values() # 對特征值進行排序(默認升序)
print(results) # 打印排序后的結果(顯示每個詞在該文檔中的TF-IDF值,按值從小到大排列)