机器学习文本特征提取: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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;居然…