特征工程四:數據特征提取TfidfVectorizer的使用

TfidfVectorizer 深度解析

TfidfVectorizer 是 scikit-learn 中用于文本特征提取的核心工具,它將原始文本轉換為 TF-IDF 特征矩陣,是自然語言處理(NLP)和文本挖掘的基礎組件。

一、核心原理

1. TF-IDF 計算

  • TF (Term Frequency):詞頻,衡量詞在文檔中的出現頻率

    TF(t,d) = (詞t在文檔d中出現的次數) / (文檔d中所有詞的總數)
    
  • IDF (Inverse Document Frequency):逆文檔頻率,衡量詞的重要性

    IDF(t) = log(總文檔數 / (包含詞t的文檔數 + 1))
    
  • TF-IDF:兩者乘積

    TF-IDF(t,d) = TF(t,d) * IDF(t)
    

2. 工作流程

  1. 文本分詞(tokenization)
  2. 構建詞匯表(vocabulary)
  3. 計算每個詞的TF值
  4. 計算每個詞的IDF值
  5. 生成TF-IDF特征矩陣

二、基本用法

from sklearn.feature_extraction.text import TfidfVectorizer# 示例文本數據
corpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?'
]# 初始化向量化器
vectorizer = TfidfVectorizer()# 擬合并轉換數據
X = vectorizer.fit_transform(corpus)# 查看結果
print(vectorizer.get_feature_names_out())
# 輸出: ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']print(X.shape)  # (4, 9) - 4個文檔,9個特征

三、關鍵參數詳解

1. 預處理參數

參數說明示例值
stop_words停用詞處理‘english’, [‘a’, ‘the’], None
lowercase是否轉為小寫True/False
token_pattern分詞正則表達式r’(?u)\b\w\w+\b’
ngram_rangen元語法范圍(1,1) (僅單詞), (1,2) (單詞和雙詞)

2. 特征選擇參數

參數說明示例值
max_df忽略高頻詞0.85(比例)或50(絕對數)
min_df忽略低頻詞2(至少出現2次)
max_features最大特征數10000

3. 加權參數

參數說明示例值
norm歸一化方式‘l1’, ‘l2’, None
use_idf是否使用IDFTrue/False
smooth_idfIDF平滑True/False

四、高級應用技巧

1. 自定義分詞器

from nltk.stem import SnowballStemmer
from nltk.tokenize import word_tokenizestemmer = SnowballStemmer("english")def custom_tokenizer(text):return [stemmer.stem(word) for word in word_tokenize(text)]vectorizer = TfidfVectorizer(tokenizer=custom_tokenizer)

2. 處理中文文本

import jiebadef chinese_tokenizer(text):return [word for word in jieba.cut(text) if word.strip()]vectorizer = TfidfVectorizer(tokenizer=chinese_tokenizer)

3. 增量學習

# 初始擬合
vectorizer.partial_fit(first_batch_documents)# 增量更新
vectorizer.partial_fit(more_documents)

五、性能優化

1. 并行處理

vectorizer = TfidfVectorizer(n_jobs=-1)  # 使用所有CPU核心

2. 內存優化

# 使用HashingVectorizer替代(無狀態,適合流式數據)
from sklearn.feature_extraction.text import HashingVectorizer
hv = HashingVectorizer(n_features=10000)

3. 管道組合

from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import MultinomialNBpipeline = make_pipeline(TfidfVectorizer(max_features=10000),MultinomialNB()
)

六、實際應用案例

1. 文本分類

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split# 加載數據
newsgroups = fetch_20newsgroups(subset='all')
X_train, X_test, y_train, y_test = train_test_split(newsgroups.data, newsgroups.target)# 構建模型
vectorizer = TfidfVectorizer(max_df=0.5, min_df=5, stop_words='english')
X_train_tfidf = vectorizer.fit_transform(X_train)# 使用分類器(如SVM)訓練
from sklearn.svm import LinearSVC
clf = LinearSVC().fit(X_train_tfidf, y_train)

2. 相似文檔檢索

from sklearn.metrics.pairwise import cosine_similarity# 計算文檔相似度
doc_similarities = cosine_similarity(X_train_tfidf)輸出結果類似以下:
[[1.         0.6461289  0.        ][0.6461289  1.         0.        ][0.         0.         1.        ]
]# 查找最相似文檔
def find_similar_docs(query, vectorizer, doc_matrix, top_n=3):query_vec = vectorizer.transform([query])sim_scores = cosine_similarity(query_vec, doc_matrix)top_doc_indices = sim_scores.argsort()[0][-top_n:][::-1]return top_doc_indices

七、常見問題解決

  1. 內存不足問題
    • 減小 max_features
    • 使用 HashingVectorizer
    • 分批處理數據
  2. 處理速度慢
    • 設置 n_jobs=-1 并行處理
    • 增加 min_df 減少特征數
    • 使用更高效的分詞器
  3. 中文處理特殊問題
    • 確保使用正確分詞工具(jieba等)
    • 處理停用詞時需要中文停用詞表
    • 可能需要調整token_pattern

TfidfVectorizer作為文本特征提取的行業標準工具,合理使用可以顯著提升文本分析任務的效果。根據具體場景調整參數,結合其他NLP組件,能夠構建強大的文本處理流水線。

關于cosine_similarity(余弦相似度)計算的結果解釋

矩陣結構解析

假設輸入 3 個文檔:(如上文相似文檔檢索的結果)

documents = ["I love machine learning",       # 文檔1"Machine learning is amazing",   # 文檔2"I hate math"                    # 文檔3
]

輸出的相似度矩陣為:

[[1.         0.6461289  0.        ]  # 文檔1 vs (文檔1, 文檔2, 文檔3)[0.6461289  1.         0.        ]  # 文檔2 vs (文檔1, 文檔2, 文檔3)[0.         0.         1.        ]] # 文檔3 vs (文檔1, 文檔2, 文檔3)
對角線(i=j)
  • [0][0] = 1.0:文檔1 與自身 的相似度(完全相同)
  • [1][1] = 1.0:文檔2 與自身 的相似度
  • [2][2] = 1.0:文檔3 與自身 的相似度
非對角線(i≠j)
  • [0][1] = 0.6461289:文檔1 和 文檔2 的相似度(有部分共同詞)
  • [0][2] = 0.0:文檔1 和 文檔3 的相似度(無共同詞)
  • [1][2] = 0.0:文檔2 和 文檔3 的相似度(無共同詞)

為什么是 3×3 矩陣?

因為 cosine_similarity 默認計算所有文檔兩兩之間的相似度。對于 N 個文檔,輸出矩陣形狀為 N×N,其中:

  • i 表示第 i 個文檔與其他所有文檔(包括自己)的相似度
  • 矩陣對稱([i][j] == [j][i]

如何提取特定文檔對的相似度?

# 獲取文檔1和文檔2的相似度
doc1_vs_doc2 = similarity_matrix[0, 1]  # 0.6461289# 獲取文檔2和文檔3的相似度
doc2_vs_doc3 = similarity_matrix[1, 2]  # 0.0

如果只想計算部分文檔對?

使用 cosine_similarity子集計算

# 只計算文檔1和文檔2的相似度(不計算整個矩陣)
subset_sim = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(subset_sim[0][0])  # 輸出 0.6461289

總結

矩陣位置含義示例值
[i][i]文檔自己與自己的相似度1.0
[i][j]文檔i與文檔j的相似度0.0~1.0
[j][i]文檔j與文檔i的相似度(對稱)[i][j]
  • 1:表示兩個向量方向完全相同(高度相似)
  • 0:表示兩個向量正交(無相關性)
  • -1:表示兩個向量方向完全相反(高度不相似)

這種矩陣形式便于一次性分析所有文檔之間的關系,常用于 聚類分析、推薦系統 等任務。
什么是TD-IDF?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82921.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c/c++爬蟲總結

GitHub 開源 C/C 網頁爬蟲探究:協議、實現與測試 網頁爬蟲,作為一種自動化獲取網絡信息的強大工具,在搜索引擎、數據挖掘、市場分析等領域扮演著至關重要的角色。對于希望深入理解網絡工作原理和數據提取技術的 C/C 開發者,尤其是…

PostgreSQL 的表連接方法

PostgreSQL 的表連接方法 PostgreSQL 提供了多種高效的連接算法,每種方法適用于不同的查詢場景。以下是 PostgreSQL 支持的四種主要表連接方法及其特點: 1 Nested Loop Join(嵌套循環連接) 工作原理 對外表的每一行&#xff0…

【Qt】qss語法詳解

QSS (Qt Style Sheets) 語法格式詳解 QSS 是 Qt 的樣式表語言,類似于 CSS,用于自定義 Qt 應用程序的外觀。以下是 QSS 的完整語法格式說明: 基本語法結構 selector {property: value;property: value;... }1. 選擇器 (Selectors) 基本選擇…

Azure資源創建與部署指南

本文將指導您如何在Azure平臺上創建和配置必要的資源,以部署基于OpenAI的應用程序。 資源組創建 資源組是管理和組織Azure資源的邏輯容器。 在Azure門戶頂端的查詢框中輸入"Resource groups"(英文環境)或"資源組"(中文環境)在搜索結果中點擊"資…

Java后端快速生成驗證碼

Hutool是一個小而全的Java工具類庫,它提供了很多實用的工具類,包括但不限于日期處理、加密解密、文件操作、反射操作、HTTP客戶端等。 核心工具類:CaptchaUtil,CaptchaUtil 是 Hutool 提供的一個工具類,用于創建各種類…

sql 備份表a數據到表b

備份表a數據到表b mysql CREATE TABLE sys_dict_240702 LIKE sys_dict;INSERT INTO sys_dict_240702 SELECT * FROM sys_dict;mssql select * into t_Dict_240702 from t_Dict

2.4GHz無線通信芯片選型指南:集成SOC與低功耗方案解析

今天給大家分享幾款2.4GHz無線通信芯片方案: 一、集成SOC芯片方案 XL2407P(芯嶺技術) 集成射頻收發機和微控制器(如九齊NY8A054E) 支持一對多組網和自動重傳 發射功率8dBm,接收靈敏度-96.5dBm&#xff08…

Tomcat與純 Java Socket 實現遠程通信的區別

Servlet 容器??(如 Tomcat) 是一個管理 Servlet 生命周期的運行環境,主要功能包括: ??協議解析??:自動處理 HTTP 請求/響應的底層協議(如報文頭解析、狀態碼生成); ??線程…

[超級簡單]講解如何用PHP實現LINE Pay API!

在 PHP 中實現 LINE Pay API 之前我應該??做哪些準備?如何在 PHP 中實現 LINE Pay API? 目錄 [前提] 環境使用 PHP 實現 LINE Pay API 的準備工作使用 PHP 實現 LINE Pay API概括 [前提] 環境 這次我們將使用SandBox環境(測試環境&a…

centos7.x下,使用寶塔進行主從復制的原理和實踐

操作原理: 一、主庫配置 1.修改 MySQL 配置文件 # 編輯主庫配置文件(路徑根據實際系統可能不同) vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID,主庫設置為 1 log-bin mysql-bin …

從零實現基于Transformer的英譯漢任務

1. model.py(用的是上一篇文章的代碼:從0搭建Transformer-CSDN博客) import torch import torch.nn as nn import mathclass PositionalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding,…

c#建筑行業財務流水賬系統軟件可上傳記賬憑證財務管理系統簽核功能

# financial_建筑行業 建筑行業財務流水賬系統軟件可上傳記賬憑證財務管理系統簽核功能 # 開發背景 軟件是給岳陽客戶定制開發一款建筑行業流水賬財務軟件。提供工程簽證單、施工日志、人員出勤表等信息記錄。 # 財務管理系統功能描述 1.可以自行設置記賬科目,做憑…

MySQL 8.0 OCP 1Z0-908 題目解析(2)

題目005 Choose two. Which two actions can obtain information about deadlocks? □ A) Run the SHOW ENGINE INNODB MUTEX command from the mysql client. □ B) Enable the innodb_status_output_locks global parameter. □ C) Enable the innodb_print_all_deadlock…

XA協議和Tcc

基于 XA 協議的兩階段提交 (2PC)。這是一種分布式事務協議,旨在保證在多個參與者(通常是不同的數據庫或資源管理器)共同參與的事務中,所有參與者要么都提交事務,要么都回滾事務,從而維護數據的一致性。 你…

數據分析-圖2-圖像對象設置參數與子圖

from matplotlib import pyplot as mp mp.figure(A figure,facecolorgray) mp.plot([0,1],[1,2]) mp.figure(B figure,facecolorlightgray) mp.plot([1,2],[2,1]) #如果figure中標題已創建,則不會新建窗口, #而是將舊窗口設置為當前窗口 mp.figure(A fig…

跳轉語句:break、continue、goto -《Go語言實戰指南》

在控制流程中,我們有時需要跳出當前循環或跳過當前步驟,甚至直接跳轉到指定位置。Go 提供了三種基本跳轉語句: ? break:跳出當前 for、switch 或 select。? continue:跳過本輪循環,進入下一輪。? goto&a…

Linux中find命令用法核心要點提煉

大家好,歡迎來到程序視點!我是你們的老朋友.小二! 以下是針對Linux中find命令用法的核心要點提煉: 基礎語法結構 find [路徑] [選項] [操作]路徑:查找目錄(.表當前目錄,/表根目錄)…

MQTT協議詳解:物聯網通信的輕量級解決方案

MQTT協議詳解:物聯網通信的輕量級解決方案 引言 在物聯網(IoT)快速發展的今天,設備間高效可靠的通信變得至關重要。MQTT(Message Queuing Telemetry Transport)作為一種輕量級的發布/訂閱協議,已成為物聯網通信的首選解決方案。本文將深入探…

list基礎用法

list基礎用法 1.list的訪問就不能用下標[]了,用迭代器2.emplace_back()幾乎是與push_back()用法一致,但也有差別3.insert(),erase()的用法4.reverse()5.排序6.合并7.unique()(去重)8.splice剪切再粘貼 1.list的訪問就不能用下標[]了,用迭代器…

2025年第十六屆藍橋杯大賽軟件賽C/C++大學B組題解

第十六屆藍橋杯大賽軟件賽C/C大學B組題解 試題A: 移動距離 問題描述 小明初始在二維平面的原點,他想前往坐標(233,666)。在移動過程中,他只能采用以下兩種移動方式,并且這兩種移動方式可以交替、不限次數地使用: 水平向右移動…