機器學習文本特征提取:CountVectorizer與TfidfVectorizer詳解

一、文本特征提取概述

在自然語言處理(NLP)和文本挖掘任務中,文本特征提取是將原始文本數據轉換為機器學習模型可以理解的數值特征的關鍵步驟。scikit-learn提供了兩種常用的文本特征提取方法:CountVectorizer(詞頻統計)和TfidfVectorizer(TF-IDF加權)。

二、CountVectorizer:詞頻統計

2.1 CountVectorizer原理

CountVectorizer將文本集合轉換為詞頻矩陣,統計每個文檔中每個詞的出現次數。它執行以下步驟:

  1. 分詞(Tokenization):將文本拆分為單詞或n-gram

  2. 構建詞匯表:收集所有文檔中的所有唯一單詞

  3. 生成詞頻矩陣:統計每個文檔中每個單詞的出現次數

2.2 CountVectorizer API詳解

from sklearn.feature_extraction.text import CountVectorizer# 初始化CountVectorizer
vectorizer = CountVectorizer(input='content',     # 輸入類型,'content'表示輸入為字符串或字節encoding='utf-8',    # 編碼方式decode_error='strict',  # 解碼錯誤處理方式strip_accents=None,  # 去除重音符號lowercase=True,      # 是否轉換為小寫preprocessor=None,   # 預處理函數tokenizer=None,      # 自定義分詞器stop_words=None,     # 停用詞列表token_pattern=r"(?u)\b\w\w+\b",  # 分詞正則模式ngram_range=(1, 1),  # n-gram范圍analyzer='word',     # 分析單位,'word'或'char'max_df=1.0,          # 忽略文檔頻率高于該閾值的詞min_df=1,            # 忽略文檔頻率低于該閾值的詞max_features=None,   # 最大特征數vocabulary=None,     # 自定義詞匯表binary=False,        # 是否僅記錄詞是否出現而非頻率dtype=np.int64       # 輸出矩陣的數據類型
)

2.3 CountVectorizer示例代碼?

from sklearn.feature_extraction.text import CountVectorizer# 示例文本數據
corpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?'
]# 初始化CountVectorizer
vectorizer = CountVectorizer()# 擬合數據并轉換為詞頻矩陣
X = vectorizer.fit_transform(corpus)# 查看詞匯表
print("詞匯表:", vectorizer.get_feature_names_out())
# 輸出: ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']# 查看詞頻矩陣
print("詞頻矩陣:\n", X.toarray())
"""
輸出:
[[0 1 1 1 0 0 1 0 1][0 2 0 1 0 1 1 0 1][1 0 0 1 1 0 1 1 1][0 1 1 1 0 0 1 0 1]]
"""# 對新文本進行轉換
new_text = ["This is a new document."]
new_X = vectorizer.transform(new_text)
print("新文本詞頻:", new_X.toarray())
# 輸出: [[0 1 0 1 0 0 0 0 1]]

2.4 參數調優技巧

  1. 停用詞處理:使用stop_words='english'可以過濾常見英文停用詞

  2. n-gram范圍ngram_range=(1,2)可以同時捕獲單詞和短語

  3. 詞匯表限制max_features=1000只保留最常見的1000個詞

  4. 文檔頻率過濾min_df=2忽略只出現一次的單詞

三、TfidfVectorizer:TF-IDF特征提取

3.1 TF-IDF原理

TF-IDF(Term Frequency-Inverse Document Frequency)是一種統計方法,用于評估一個詞對于一個文檔集或語料庫中的其中一份文檔的重要程度。其計算公式為:

TF-IDF = TF(t,d) × IDF(t)?

其中:

  • TF(t,d)是詞t在文檔d中的詞頻

  • IDF(t)是逆文檔頻率,計算公式為:IDF(t) = log(總文檔數 / 包含詞t的文檔數) + 1

3.2 TfidfVectorizer API詳解?

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np# 初始化TfidfVectorizer
vectorizer = TfidfVectorizer(# 輸入參數設置input='content',     # 輸入類型,可選'content'(默認)|'filename'|'file'# 'content'表示直接輸入文本內容,'filename'表示輸入文件路徑encoding='utf-8',    # 文本編碼方式,默認utf-8,處理中文時通常保持默認decode_error='strict',  # 解碼錯誤處理方式,可選'strict'|'ignore'|'replace'# 'strict'遇到錯誤拋出異常;'ignore'忽略錯誤;'replace'用替換標記錯誤字符strip_accents=None,  # 去除重音符號,可選None|'ascii'|'unicode'# None不處理;'ascii'快速處理;'unicode'精確處理但較慢lowercase=True,      # 是否將所有字符轉換為小寫,默認True# 預處理設置preprocessor=None,   # 自定義預處理函數,在分詞前應用# 例如: lambda x: x.replace('$', 'dollar')tokenizer=None,      # 自定義分詞函數,覆蓋默認的分詞行為# 例如中文分詞: lambda x: jieba.cut(x)# 文本分析設置analyzer='word',     # 分析單位,可選'word'(默認)|'char'|'char_wb'# 'word'按詞分析;'char'按字符分析;'char_wb'按詞邊界內的字符分析stop_words=None,     # 停用詞設置,可選None|'english'|list# None無停用詞;'english'使用內置英文停用詞;list自定義停用詞列表token_pattern=r"(?u)\b\w\w+\b",  # 分詞正則表達式模式# 默認匹配至少2個字母數字字符的詞# (?u)表示Unicode匹配模式,\b表示詞邊界ngram_range=(1, 1),  # n-gram范圍,元組(min_n, max_n)# (1,1)僅使用unigram;(1,2)使用unigram和bigram# 特征選擇設置max_df=1.0,          # 忽略文檔頻率高于該閾值的詞,float表示比例,int表示絕對數量# 例如0.85表示忽略出現在85%以上文檔中的詞min_df=1,            # 忽略文檔頻率低于該閾值的詞,同上# 例如2表示忽略出現在少于2個文檔中的詞max_features=None,   # 最大特征數,按詞頻選擇前N個特征# None不限制;10000表示只保留最常見的10000個詞vocabulary=None,     # 自定義詞匯表,dict或可迭代對象# 例如 {'apple':0, 'banana':1} 或 ['apple', 'banana']binary=False,        # 是否僅記錄詞是否出現而非頻率# True生成二進制特征;False(默認)使用實際詞頻# 輸出設置dtype=np.float64,    # 輸出矩陣的數據類型,通常np.float32或np.float64# TF-IDF特有參數norm='l2',          # 歸一化方式,可選'l1'|'l2'|None# 'l2'(默認)使用歐式范數;'l1'使用曼哈頓范數;None不歸一化use_idf=True,       # 是否使用逆文檔頻率(IDF)權重,默認True# 設為False則只使用TF(詞頻)部分smooth_idf=True,    # 是否平滑IDF權重,默認True# 平滑避免除零錯誤,公式變為log(1+N/(1+df(t))) + 1sublinear_tf=False  # 是否應用次線性TF縮放,默認False# True時使用1+log(tf)代替原始tf值
)

3.3 TfidfVectorizer示例代碼?

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?'
]# 初始化TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()# 擬合數據并轉換為TF-IDF矩陣
X_tfidf = tfidf_vectorizer.fit_transform(corpus)# 查看詞匯表
print("詞匯表:", tfidf_vectorizer.get_feature_names_out())
# 輸出: ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']# 查看TF-IDF矩陣
print("TF-IDF矩陣:\n", X_tfidf.toarray().round(2))
"""
輸出:
[[0.   0.47 0.58 0.38 0.   0.   0.38 0.   0.38][0.   0.69 0.   0.28 0.   0.54 0.28 0.   0.28][0.51 0.   0.   0.27 0.51 0.   0.27 0.51 0.27][0.   0.47 0.58 0.38 0.   0.   0.38 0.   0.38]]
"""# 對新文本進行轉換
new_text = ["This is a new document."]
new_X_tfidf = tfidf_vectorizer.transform(new_text)
print("新文本TF-IDF:", new_X_tfidf.toarray().round(2))
# 輸出: [[0.   0.71 0.   0.5  0.   0.   0.   0.   0.5]]

3.4 TF-IDF參數調優技巧

  1. 歸一化選擇norm='l2'通常效果最好

  2. 平滑IDFsmooth_idf=True可以避免除零錯誤

  3. 次線性TF縮放sublinear_tf=True使用1+log(tf)代替原始tf

  4. 自定義IDF權重:可以通過TfidfTransformer自定義IDF計算

四、CountVectorizer與TfidfVectorizer對比

特性CountVectorizerTfidfVectorizer
特征值類型詞頻TF-IDF權重
是否考慮詞的重要性
稀疏矩陣
適用場景簡單詞頻分析文本分類/檢索
計算復雜度較低較高
歸一化通常有

五、實際應用案例:文本分類

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import classification_report# 示例數據:正面和負面評論
texts = ["This movie is great!","I love this product.","Terrible experience.","Worst service ever.","Amazing performance!","Not worth the money."
]
labels = [1, 1, 0, 0, 1, 0]  # 1:正面, 0:負面# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.3, random_state=42
)# 使用TF-IDF進行特征提取
tfidf = TfidfVectorizer(stop_words='english',  # 移除英文停用詞ngram_range=(1, 2),   # 使用unigram和bigrammax_features=1000     # 限制特征數量
)# 轉換訓練數據
X_train_tfidf = tfidf.fit_transform(X_train)# 轉換測試數據
X_test_tfidf = tfidf.transform(X_test)# 訓練分類器
clf = LinearSVC()
clf.fit(X_train_tfidf, y_train)# 評估模型
y_pred = clf.predict(X_test_tfidf)
print(classification_report(y_test, y_pred))

六、常見問題解答

Q1:如何處理中文文本?
A1:中文需要先分詞,可以使用jieba等分詞工具,然后通過自定義tokenizer傳入:

import jiebadef chinese_tokenizer(text):return jieba.lcut(text)vectorizer = CountVectorizer(tokenizer=chinese_tokenizer)

Q2:如何保存和加載訓練好的向量化器?
A2:可以使用joblib或pickle:?

import joblib# 保存
joblib.dump(vectorizer, 'vectorizer.joblib')# 加載
vectorizer = joblib.load('vectorizer.joblib')

Q3:如何處理大規模文本數據?
A3:

  1. 使用max_features限制特征數量

  2. 使用min_dfmax_df過濾罕見和常見詞

  3. 考慮使用HashingVectorizer替代

  4. 使用內存映射或分批處理

七、總結

CountVectorizer和TfidfVectorizer是文本特征提取的基礎工具,理解它們的原理和參數對于構建高效的文本處理流水線至關重要。在實際應用中:

  1. 對于簡單的詞頻統計任務,使用CountVectorizer

  2. 對于需要考慮詞重要性的任務(如分類、檢索),使用TfidfVectorizer

  3. 根據具體任務調整參數,特別是停用詞、n-gram范圍和文檔頻率過濾

  4. 結合后續的機器學習模型進行端到端的評估和調優

通過本教程,您應該能夠熟練使用這兩種文本特征提取方法,并為更復雜的NLP任務打下堅實基礎。

?

?

?

?

?

?

?

?

?

?

?

?

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

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

相關文章

【PHP】.Hyperf 框架-collection 集合數據(內置函數歸納-實用版)

📌 Article::query()->where(article_id, 6)->select()->first()?? 進行數據結果的循環,遍歷 1.each() 方法遍歷集合中的項目并將每個項目傳遞給閉包,進行處理數據 Article::query()->get()->each(function ($item) {// 可…

巨獸的陰影:大型語言模型的挑戰與倫理深淵

當GPT-4這樣的龐然大物能夠流暢對話、撰寫詩歌、編寫代碼、解析圖像,甚至在某些測試中媲美人類專家時,大型語言模型(LLM)仿佛成為了無所不能的“智能神諭”。然而,在這令人目眩的成就之下,潛藏著復雜而嚴峻…

vue根據鏈接生成二維碼 qrcode

vue根據鏈接生成二維碼 qrcode js 需求&#xff1a;后端返回一個完整鏈接&#xff0c;前端根據鏈接生成一個二維碼 1、安裝qrcode插件 npm install qrcode2、引入qrcode,并且使用完整代碼 <template> <div><img :src"qrcodeData" class"qrcode…

C# 事件(源代碼組件概覽)

源代碼組件概覽 需要在事件中使用的代碼有5部分&#xff0c;如圖15-4所示&#xff0c;后文會依次進行介紹。這些組件如下 所示 委托類型聲明事件和事件處理程序必須有共同的簽名和返回類型&#xff0c;它們通過委托類型 進行描述。事件處理程序聲明訂閱者類中會在事件觸發時執…

音視頻會議服務搭建(設計方案-數據庫sql)-02

前言 銜接上篇文章&#xff0c;這篇是相關的表結構sql語句記錄 EchoMeet 會議系統數據庫表結構設計 &#x1f4cb; 設計概述 本文檔定義了EchoMeet音視頻會議系統的完整數據庫表結構&#xff0c;采用微服務架構設計&#xff0c;支持高并發、可擴展的會議場景。 &#x1f3af…

MCPA2APPT 智能化演示文稿系統:A2A、MCP、ADK 三大架構全流程自動化

&#x1f680; 項目名稱 MCPA2APPT / MultiAgentPPT —— 一站式 A2A MCP ADK 多智能體并發 PPT 生成解決方案 MCPA2APPT 是一款開源 AI PPT 創作神器&#xff0c;基于 A2A&#xff08;Ask-to-Answer&#xff09;、MCP&#xff08;Multi-agent Control Protocol&#xff09;和…

pyinstall打包mysql-connector-python后運行報錯的問題!

簡單的測試代碼 # main.py import mysql.connectorDB_HOSTlocalhost DB_PORT3306 DB_NAMElover DB_USERroot DB_PASSWORDxxxx# 連接數據庫 connection mysql.connector.connect(hostDB_HOST,portDB_PORT,databaseDB_NAME,userDB_USER,passwordDB_PASSWORD)if connection.is_c…

應對高并發:淘寶商品評論實時數據 API 高效接入開發實踐

在電商平臺的運營中&#xff0c;商品評論數據是用戶決策、商家優化及平臺運營的重要依據。淘寶作為國內領先的電商平臺&#xff0c;其商品評論數據具有實時性強、數據量大、并發訪問頻繁等特點。本文將圍繞淘寶商品評論實時數據 API 的高效接入展開&#xff0c;探討在高并發場景…

踩坑日記:虛擬機橋接模式無法連接網卡

對于一名網安學生&#xff0c;我們滲透測試一般是需要虛擬機使用橋接模式。 但是vm直接設置成橋接模式并不能上網。還要進行如下配置 改一下這個橋接的地方。改成我們主機的網卡。 如何查看主機網卡呢&#xff1f; 設置搜索網絡

Android 系統默認的Launcher3,Android 系統的導航欄(通常是屏幕底部)顯示的 4 個快捷應用圖標,如何替換這4個應用圖標為客戶想要的。

Android 系統默認的Launcher3, Android 系統的導航欄(通常是屏幕底部)顯示的 4 個快捷應用圖標, 如何替換這4個應用圖標為客戶想要的。 開發云 - 一站式云服務平臺 按如下方式可以修改應用圖標。 diff --git a/packages/apps/Launcher3/res/xml/default_workspace_5x6_no_a…

maker-pdf 文檔文字識別,并用python實現

下面我將詳細講解maker-pdf文檔文字識別的技術原理、特點&#xff0c;并提供完整的Python實現代碼及優化方案。內容結合最新文檔和OCR技術實踐&#xff0c;適合開發者直接集成到項目中。 一、maker-pdf 核心技術解析 maker-pdf是基于深度學習的端到端OCR工具鏈&#xff0c;專…

Go基礎(Gin)

go mod init my-gin-app 初始化一個 Go 項目&#xff0c;創建一個go.mod文件go mod tidy 自動整理項目依賴&#xff0c;確保go.mod和go.sum文件與代碼實際使用的依賴一致go mod init&#xff1a;創建項目的 “依賴說明書”。go mod tidy&#xff1a;整理 “說…

21、鴻蒙學習——使用App Linking實現應用間跳轉

簡介 使用App Linking進行跳轉時&#xff0c;系統會根據接口傳入的uri信息&#xff08;HTTPS鏈接&#xff09;將用戶引導至目標應用中的特定內容&#xff0c;無論應用是否已安裝&#xff0c;用戶都可以訪問到鏈接對應的內容&#xff0c;跳轉體驗相比Deep Linking方式更加順暢。…

Cursor無限郵箱續費方法

1.注冊無限郵箱2925 2.“其他郵箱” 3.點擊左下角添加郵箱 4.管理員身份運行Windos PowerShell 5.輸入該指令并運行&#xff0c;修改機器碼 irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/…

LeetCode Hot100(圖論)

200. 島嶼數量 題意 給你一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。 島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外&#xff0c;你…

Ubuntu Gnome 安裝和卸載 WhiteSur-gtk-theme 類 Mac 主題的正確方法

WhiteSur-gtk-theme 是一個流行的 GNOME 桌面主題&#xff0c;可以讓 Ubuntu 的桌面環境看起來像 macOS。以下是安裝和卸載 WhiteSur-gtk-theme 的詳細步驟&#xff0c;包括解釋每個命令的作用。 一、安裝 WhiteSur-gtk-theme 1. 準備工作 在安裝主題之前&#xff0c;建議確…

如何在DataGear 5.4.1 中快速制作SQL服務端分頁的數據表格看板

DataGear 數據可視化分析平臺&#xff08;http://datagear.tech/&#xff09; 在新發布的5.4.1版本中&#xff0c;內置表格圖表新增了serverSidePaging選項&#xff0c;僅需通過簡單的配置&#xff0c;即可為表格添加服務端分頁、關鍵字查詢、排序功能。 本文以SQL數據集作為數…

股指期貨套保比例怎么算?

在金融市場里&#xff0c;套期保值&#xff08;套保&#xff09;是一種常見的風險管理手段&#xff0c;目的是通過期貨市場對沖現貨市場的風險。而套保比例&#xff08;也叫套保比率&#xff09;的計算&#xff0c;是套保操作的核心。簡單來說&#xff0c;套保比例就是“期貨頭…

邏輯回歸(Logistic Regression)算法詳解

文章目錄 一、邏輯回歸&#xff1a;從線性回歸到二分類的跨越1.1 邏輯回歸簡介1.2 Sigmoid函數&#xff1a;概率映射的數學本質1.3 參數 w w w 和 b b b 對Sigmoid的調控1.4 從線性回歸到分類1.5 決策邊界&#xff1a;從概率到類別&#xff08;結合圖3、圖4&#xff09; 二、…

HTTPS通信流程:SSL/TLS握手全解析

2021&#xff0c;2022&#xff0c;2023年1-8月看了很多技術書籍&#xff0c;現在想來忘了很多&#xff0c;用到的也不多&#xff0c;但是因為提前接觸過&#xff0c;所以很多新東西&#xff0c;接受起來&#xff0c;比預想的要容易些。最近突然想要回憶下HTTPS&#xff0c;居然…