TF-IDF(詞頻 - 逆文檔頻率)作為經典的文本特征提取算法,在自然語言處理(NLP)領域應用廣泛。它能將文本轉化為可量化的數值特征,為后續的數據分析和建模提供基礎。本文結合實際場景,介紹如何用 Python 實現 TF-IDF 的常見應用。
一、環境準備
首先確保安裝必要的庫,最常用的是?scikit-learn
(提供成熟的 TF-IDF 工具)和?nltk
(可選,用于文本預處理):
pip install scikit-learn nltk
二、核心工具:TfidfVectorizer
scikit-learn
?中的?TfidfVectorizer
?是實現 TF-IDF 的核心工具,它集成了文本分詞、詞頻計算、IDF 加權等功能,無需手動編寫復雜公式。基本用法如下:
from sklearn.feature_extraction.text import TfidfVectorizer# 示例文本數據
documents = ["Python是一種流行的編程語言,適合數據分析和機器學習","機器學習是人工智能的一個分支,依賴大量數據訓練模型","數據分析常用Python工具,如Pandas和NumPy,處理結構化數據","人工智能包括機器學習、自然語言處理等多個領域"
]# 初始化TF-IDF向量器(默認分詞會按空格和標點分割,支持中文)
tfidf = TfidfVectorizer(max_features=100, # 保留Top N高頻詞stop_words=["是", "的", "一種"], # 自定義停用詞(過濾無意義詞匯)lowercase=False # 不強制轉為小寫(中文無需小寫處理)
)# 擬合數據并轉換為TF-IDF矩陣
tfidf_matrix = tfidf.fit_transform(documents)# 獲取詞匯表(所有分詞后的詞語)
words = tfidf.get_feature_names_out()
print("詞匯表:", words)# 輸出TF-IDF矩陣(每行對應一篇文檔,每列對應一個詞的TF-IDF值)
print("\nTF-IDF矩陣形狀:", tfidf_matrix.shape) # (文檔數, 詞匯數)
三、實戰應用場景
1. 自動提取文檔關鍵詞
關鍵詞提取是 TF-IDF 最經典的應用之一。通過對單篇文檔的 TF-IDF 值排序,可快速定位核心詞匯。
def extract_keywords(tfidf_matrix, words, doc_index, top_n=3):"""提取指定文檔的Top N關鍵詞"""# 獲取該文檔的TF-IDF向量doc_tfidf = tfidf_matrix[doc_index].toarray()[0]# 按TF-IDF值降序排序,返回詞語和分數keyword_scores = sorted(zip(words, doc_tfidf), key=lambda x: x[1], reverse=True)# 過濾分數為0的詞,取前N個return [word for word, score in keyword_scores if score > 0][:top_n]# 提取第1篇文檔(索引0)的關鍵詞
print("文檔1關鍵詞:", extract_keywords(tfidf_matrix, words, doc_index=0))
# 輸出示例:['Python', '編程語言', '數據分析']
應用場景:論文摘要關鍵詞自動生成、新聞主題標簽推薦、文檔快速摘要。
2. 文本相似度計算
通過比較兩篇文檔的 TF-IDF 向量相似度,可判斷內容相關性(如查重、推薦相似文章)。
from sklearn.metrics.pairwise import cosine_similarity# 計算文檔間的余弦相似度(值越接近1,相似度越高)
similarity_matrix = cosine_similarity(tfidf_matrix)
print("\n文檔相似度矩陣:")
for i in range(len(similarity_matrix)):for j in range(i+1, len(similarity_matrix)):print(f"文檔{i+1}與文檔{j+1}的相似度:{similarity_matrix[i][j]:.4f}")# 示例輸出:文檔2與文檔4的相似度較高(都涉及“人工智能”“機器學習”)
應用場景:文章查重系統、推薦系統(如 “猜你喜歡”)、問答系統中匹配相似問題。
3. 文本分類預處理
TF-IDF 可將文本轉化為機器學習模型能處理的數值特征,為分類任務提供輸入。
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score# 準備帶標簽的文本數據(示例:科技類=0,教育類=1)
texts = ["Python用于數據分析和機器學習","人工智能技術在醫療領域的應用","中小學編程教育納入課程體系","在線教育平臺助力學生自主學習"
]
labels = [0, 0, 1, 1] # 標簽:科技=0,教育=1# 轉換為TF-IDF特征
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(texts)
y = labels# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)# 用樸素貝葉斯模型分類
model = MultinomialNB()
model.fit(X_train, y_train)# 預測并評估準確率
y_pred = model.predict(X_test)
print("\n分類準確率:", accuracy_score(y_test, y_pred)) # 示例:準確率1.0# 預測新文本類別
new_text = ["機器學習課程走進高中課堂"]
new_text_tfidf = tfidf.transform(new_text)
print("新文本預測類別:", model.predict(new_text_tfidf)) # 輸出:1(教育類)
應用場景:垃圾郵件識別、情感分析(正面 / 負面評價)、新聞分類(科技 / 體育 / 娛樂)。
4. 搜索引擎基礎
在簡易搜索引擎中,可通過 TF-IDF 計算查詢詞與文檔的相關性,返回最匹配的結果。
def search(query, documents, tfidf):"""根據查詢詞返回相關文檔排序"""# 將查詢詞轉換為TF-IDF向量query_tfidf = tfidf.transform([query])# 計算與所有文檔的相似度similarities = cosine_similarity(query_tfidf, tfidf_matrix).flatten()# 按相似度降序返回文檔索引return [documents[i] for i in similarities.argsort()[::-1] if similarities[i] > 0]# 搜索示例
query = "Python 數據分析"
print("\n搜索結果:")
for doc in search(query, documents, tfidf):print("-", doc)
# 輸出:優先返回包含“Python”和“數據分析”的文檔
應用場景:站內搜索、文檔檢索系統、智能客服知識庫查詢。
四、進階技巧與優化
中文分詞優化
TfidfVectorizer
?默認按標點和空格分詞,對中文不夠友好。可結合?jieba
?進行精準分詞:import jieba from sklearn.feature_extraction.text import TfidfVectorizer# 自定義分詞函數 def jieba_tokenizer(text):return jieba.lcut(text) # 精確分詞# 初始化向量器時指定分詞函數 tfidf = TfidfVectorizer(tokenizer=jieba_tokenizer)
停用詞處理
過濾無意義詞匯(如 “的”“在”“嗎”)可提升效果,可使用?nltk
?或自定義停用詞表:from nltk.corpus import stopwords # 下載英文停用詞(中文需自定義) import nltk nltk.download('stopwords') english_stopwords = stopwords.words('english') tfidf = TfidfVectorizer(stop_words=english_stopwords)
參數調優
max_features
:限制詞匯表大小,避免維度災難;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ngram_range
:支持詞組特征(如?(1,2)
?表示同時考慮單個詞和詞組);? ? ? ? ? ? ? ? ? ? ?min_df/max_df
:過濾在太少 / 太多文檔中出現的詞(如?min_df=2
?表示只保留至少在 2 篇文檔中出現的詞)。
五、局限性與替代方案
TF-IDF 雖簡單高效,但存在局限性:
忽略詞語語義關系(如 “電腦” 和 “計算機” 無法識別為同義詞);
對短文本效果較差,依賴詞頻統計;
無法捕捉上下文信息。
替代方案:
詞向量(Word2Vec、GloVe):保留語義關系;
BERT 等預訓練模型:捕捉上下文語義,適用于復雜 NLP 任務。
總結
TF-IDF 作為文本特征提取的 “基石算法”,憑借簡單、高效、可解釋性強的特點,在關鍵詞提取、相似度計算、文本分類等場景中仍被廣泛使用。通過?scikit-learn
?等工具,我們可以快速將其應用到實際項目中,解決文本分析的基礎問題。對于更復雜的語義理解需求,可結合詞向量或預訓練模型進一步優化,但 TF-IDF 仍是入門 NLP 的必備技能。