特征工程四:数据特征提取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.mzph.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)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动…