怎样用Python对文本数据进行TF-IDF特征提取与关键词权重计算?

梦敏酱_7916

梦敏酱_7916

2026-09-24

696人浏览

原创

tfidfvectorizer是提取tf-idf特征的标准解法,自动完成分词、词频统计、idf计算和l2归一化;需预清洗文本、中文须用jieba等分词,避免按字切分,并注意idf平滑、词表固化及权重正确获取方式。

怎样用python对文本数据进行tf-idf特征提取与关键词权重计算?

用 TfidfVectorizer 提取 TF-IDF 特征最直接

不用手写公式,sklearn.feature_extraction.text.TfidfVectorizer 是标准解法。它自动完成分词、词频统计、IDF 计算和归一化(L2),输出稀疏矩阵。

常见错误是传入未清洗的原始文本:比如带 HTML 标签、多余空格或数字混杂的字段,会导致生成大量无意义 token。建议先做基础清洗——小写转换、去除纯数字/标点占位符(但别删掉所有标点,否则“Python3.9”和“Python”会变成同一词)。

实操建议:

  • stop_words='english' 可快速过滤常见停用词,但中文必须自定义 stop_words 列表或用 jieba 预切词
  • 设 max_features=10000 控制词表大小,避免内存爆炸;实际项目中常设为 5000~20000
  • 若文本极短(如标题、弹幕),关掉 lowercase=False 并设 ngram_range=(1, 2) 能捕获“机器学习”“深度学习”这类关键二元组合

关键词权重不是直接从 idf_ 数组读出来的

vectorizer.idf_ 存的是每个词的 IDF 值,但它不等于最终特征权重。TF-IDF 权重 = 词频(TF) × 逆文档频率(IDF),而 TF 是按文档逐行计算的,IDF 是全局统计量。

想查某文档中“人工智能”的权重?不能只看 idf_,得先用 vectorizer.transform([doc]) 得到该文档的向量,再定位到“人工智能”对应列索引(vectorizer.vocabulary_.get('人工智能')),最后取值。

注意点:

Python Testing
Python Testing

Python 测试速查:运行 pytest、使用 mock/patch、参数化、fixtures、异步、覆盖率测试。

下载
  • 稀疏矩阵里非零值才是有效权重,多数位置是 0 —— 别误以为“没权重”就是词不重要
  • idf_ 默认加了平滑项(smooth_idf=True),即分母加 1,避免某词未在训练集出现时除零;若需复现经典公式,设 smooth_idf=False
  • 如果后续要喂给树模型(如 RandomForest),记得用 .toarray() 转成稠密数组,但大语料下极易 OOM

中文文本必须先分词,否则 TfidfVectorizer 会按字切

TfidfVectorizer 默认用空格切分,对中文等于按字分词。“深度学习”会被拆成“深”“度”“学”“习”,完全失去语义。必须干预分词环节。

两种可靠做法:

  • 用 jieba.lcut(doc) 预处理所有文档,再把结果用空格拼接(如 ' '.join(jieba.lcut(doc))),然后传给 TfidfVectorizer
  • 自定义 tokenizer 参数:TfidfVectorizer(tokenizer=jieba.lcut, token_pattern=None),此时 token_pattern 必须设为 None,否则默认正则会覆盖分词器

避坑提示:别用 jieba.cut_for_search,它会把“苹果手机”切成“苹果”“手机”“苹果手机”,导致词表膨胀;生产环境优先用 lcut 或 cut。

单独计算单个词的 TF-IDF 权重容易漏掉上下文

有人想绕过向量化,直接用公式算“区块链”在某篇新闻里的权重:查该词在文中出现次数 ÷ 文总词数 × log(总文档数 ÷ 包含该词的文档数)。这看似合理,但忽略两个关键事实:

  • 实际 TfidfVectorizer 的 TF 是「该词在文档中的出现次数」,不是「相对频率」;除非设了 use_idf=False 且 norm=None,否则不会做除法归一
  • IDF 分母是「包含该词的文档数」,不是「该词出现过的文档数」—— 如果某文档里“区块链”出现 10 次,它仍只被计为 1 次

所以,手动计算仅适用于教学演示。真实场景中,哪怕只处理一篇新文档,也应调用 vectorizer.transform([new_doc]) 复用已有词表和 IDF,否则新旧文档权重不可比。

真正难的是跨语料一致性:今天训的模型,明天新增一批数据,IDF 值就变了。线上服务必须固化 vocabulary_ 和 idf_,不能每次重拟合。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1571

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3744

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1589

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

21457

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2647

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2707

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1083

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2083

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程