当前位置: 首页 > news >正文

机器学习——CountVectorizer将文本集合转换为 基于词频的特征矩阵


1.什么是 CountVectorizer

CountVectorizerscikit-learn 中用于文本特征提取的工具之一,其核心功能是 将文本转换为词频矩阵(Bag of Words)

通俗理解:

  • 文本 → 词的集合(去掉顺序) → 每个词出现次数 → 数值向量表示

  • 它属于 词袋模型(Bag of Words, BoW) 的实现

数学表达

假设有一个文档集合 D={d1​,d2​,...,dn​},词汇表V={w1​,w2​,...,wm​}:

  • 对于文档 di​,CountVectorizer 会计算每个词 wj 在文档中的出现次数:

最终得到矩阵 X 形状为 (n,m),即 文档数 × 词汇表大小


2.CountVectorizer 的核心流程

  1. 文本预处理

    • 小写化(默认将文本转为小写)

    • 去掉标点符号(可以自定义)

    • 可以去掉停用词(如“的、是、and”等)

  2. 分词(Tokenization)

    • 将每篇文档拆分为一个个 token(单词或字符)

    • 默认以空格或正则匹配拆分,也可以自定义分词函数

  3. 建立词汇表(Vocabulary)

    • 收集训练语料中的所有 token

    • 词汇表通常按字典顺序或出现顺序排列

    • 每个词分配唯一索引

  4. 统计词频(Counting)

    • 遍历每篇文档

    • 计算文档中每个词在词汇表中的出现次数

    • 输出文档-词矩阵(sparse matrix 推荐存储)


3. 函数原型

class sklearn.feature_extraction.text.CountVectorizer(
input='content',         # 输入类型:'filename','file','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", # 正则表达式匹配 token
ngram_range=(1, 1),      # n-gram 范围,如 (1,2) 表示提取一元和二元词组
analyzer='word',          # 分析单位:'word' 或 'char'
max_df=1.0,               # 词语在文档中出现比例的上限(超过忽略)
min_df=1,                 # 词语在文档中出现比例或次数的下限(低于忽略)
max_features=None,        # 仅考虑前 N 个最常出现的词语
vocabulary=None,          # 自定义词汇表
binary=False,             # True 表示只记录存在与否,不记录频率
dtype=np.int64            # 输出矩阵的数据类型
)


4. 常用参数解析

参数作用
lowercase是否将文本转换为小写,默认 True
stop_words是否去停用词,可选 'english' 或自定义列表
max_features最大词汇数量,按词频选择最常见的前 k 个
ngram_range控制 n-gram 范围,默认 (1,1),如 (1,2) 表示 unigrams + bigrams
analyzer分词方式,'word''char',甚至可以自定义
token_pattern正则匹配 token 的模式,默认 r"(?u)\b\w\w+\b"

5. 使用示例

"""
CountVectorizer 是 scikit-learn 库中一个常用的文本特征提取工具,它将文本数据转换为基于词频的数值特征矩阵。其主要工作原理是:
对文本集合进行分词处理
构建词汇表(所有文档中出现的不重复词语集合)
统计每个词语在各文档中的出现次数,形成词频矩阵
"""
from sklearn.feature_extraction.text import CountVectorizercorpus = ["I love NLP","NLP is fun","I love learning NLP"
]# 初始化 CountVectorizer
vectorizer = CountVectorizer()# 拟合语料并转换为矩阵
X = vectorizer.fit_transform(corpus)print("词汇表:", vectorizer.get_feature_names_out())
print("文档-词矩阵:\n", X.toarray())

输出示例

  • .get_feature_names() 返回词汇表

  • .fit_transform() 返回每个文档对应的词频向量


进阶理解

  1. 稀疏矩阵

    • 文档-词矩阵通常很大且稀疏(大多数词在大多数文档中不出现),所以 CountVectorizer 返回 scipy.sparse 矩阵以节省内存。

  2. 和 TF-IDF 的关系

    • CountVectorizer 只统计出现次数,而 TfidfVectorizer 在此基础上加上了逆文档频率权重(IDF)。

  3. 支持 n-gram

    • 不止单词频率,还可以统计连续词组:

    CountVectorizer(ngram_range=(1,2)) # unigrams + bigrams


6. 总结

CountVectorizer 是文本特征工程中非常基础且实用的工具,它能够快速将文本转换为可用于机器学习模型的数值特征矩阵。
通过合理调整参数(如 ngram_rangemax_featuresstop_words 等),可以灵活控制特征的粒度和数量,从而适应不同的 NLP 任务。


机器学习方法里常见的词向量表示方式 vs 深度学习方法里的词向量表示方式

类别方法特点

机器学习(传统词向量)

主要是 基于统计和矩阵分解 的方法

CountVectorizer(词袋模型)
  • 向量值 = 词频统计。

  • 文档 → 稀疏向量(几万维)。

TF-IDF
  • 改进 CountVectorizer,降低常见词的权重,提升关键字权重。

One-Hot Encoding

  • 每个词用一个长度等于词表大小的向量表示,某一维为 1,其余为 0。

  • 缺点:高维稀疏,没有语义关系。

LSA(Latent Semantic Analysis,潜在语义分析)
  • 词-文档矩阵SVD(奇异值分解),降维得到稠密向量。

  • 能捕捉部分语义,但仍然依赖统计。

LDA(Latent Dirichlet Allocation,主题模型)
  • 用主题分布表示文档或词,得到低维向量。

  • 语义解释更好,但仍基于概率统计。

深度学习(分布式词向量)

主要是 神经网络学习得到的嵌入

Word2Vec
  • CBOW(上下文预测中心词)

  • Skip-gram(中心词预测上下文)

  • 结果:静态词向量(同一个词在不同上下文中的向量相同)。

GloVe
  • 基于全局词共现矩阵 + 神经网络优化,得到静态词向量。
FastText
  • Word2Vec 升级版,把词拆成子词(n-gram),解决 OOV 问题。
ELMo(基于双向 LSTM)
  • 上下文相关词向量,能区分同形异义词。
BERT(Transformer)Transformer,动态语义向量
GPT系列
  • 生成式模型的词向量,同样基于 Transformer。

  • 上下文依赖更强,适合生成任务。

http://www.dtcms.com/a/334399.html

相关文章:

  • 软件的终极:为70亿人编写70亿个不同的软件
  • C++面试题及详细答案100道( 31-40 )
  • SysTick寄存器(嘀嗒定时器实现延时)
  • cPanel Python 应用部署流程
  • 记录一下第一次patch kernel的经历
  • CSV 生成 Gantt 甘特图
  • 2^{-53} 单位舍入误差、机器精度、舍入的最大相对误差界限
  • 【QGIS数据篇】QGIS 3.40 栅格计算器经典实用公式全集
  • 高并发场景下如何避免重复支付
  • 17.3 全选购物车
  • 双椒派E2000D开发板LED驱动开发实战指南
  • 线程回收与线程间通信
  • [Python 基础课程]抽象类
  • 强化学习入门教程(附学习文档)
  • (第十七期)HTML图像标签详解:从入门到精通
  • 创新词汇表设计:UniVoc - 中英文混合处理的新方案
  • 安卓11 12系统修改定制化_____列举与安卓 9、10 系统在定制化方面的差异与权限不同
  • 数学建模Topsis法笔记
  • 非功能性需求设计:可解释性、鲁棒性、隐私合规
  • 【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
  • 启发式合并 + 莫队 恋恋的心跳大冒险
  • 汽车大灯ABD算法介绍
  • 【算法】——力扣hot100常用算法技巧
  • leetcode_ 739 每日温度
  • 分享一个大数据的源码实现 基于Hadoop的二手车市场数据分析与可视化 基于Spark的懂车帝二手车交易数据可视化分析系统
  • Windows MCP.Net:革命性的 .NET Windows 桌面自动化 MCP 服务器
  • 嵌入式硬件篇---电容电感
  • 【C++】动态内存管理
  • 嵌入式硬件篇---电平转换电路
  • Python-深度学习(一)