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

词袋(Bag of Words, BoW)

词袋(Bag of Words, BoW)模型详解

词袋(BoW)是一种用于文本处理的特征提取方法,常用于自然语言处理(NLP)任务中。在BoW模型中,文本被表示为一个词的无序集合,而忽略了词的顺序和语法结构。

工作原理
  1. 词汇表的构建:首先,BoW会构建一个词汇表,包含在所有文档中出现的独特词汇。
  2. 文档表示:接下来,每个文档都通过词汇表转化为向量。这个向量的长度与词汇表中的词数相同,每个位置表示一个词的出现次数。这样,文档就可以通过这个向量来表示。
词袋模型的主要特点
  • 词频计数:词袋模型只关心某个词在文档中出现的频率(也可以是二元计数:出现或不出现)。
  • 忽略词序:它不关心词的顺序,即"我爱你"和"你爱我"会被表示为相同的向量。
  • 稀疏表示:由于每个文档只包含词汇表中的一部分词,词袋向量大部分位置为零,属于典型的稀疏向量。
BoW模型的优缺点
  • 优点
    • 简单易懂,计算量小。
    • 对大多数文本分类问题表现良好。
  • 缺点
    • 忽略了词语的顺序和语法结构。
    • 无法处理同义词,且会被停用词(如"的", “是”)影响。
    • 需要较大的词汇表,可能导致高维稀疏矩阵。

Python 实现词袋模型

我们可以使用sklearn库中的CountVectorizer来构建词袋模型。下面是一个例子。

示例代码
from sklearn.feature_extraction.text import CountVectorizer# 样本文档
documents = ["I love machine learning. Machine learning is amazing.","I love coding in Python. Python is great for machine learning.","Natural Language Processing with Python and machine learning is fun."
]# 初始化 CountVectorizer
vectorizer = CountVectorizer()# 将文本转化为词袋模型
X = vectorizer.fit_transform(documents)# 获取词汇表
vocab = vectorizer.get_feature_names_out()# 输出词汇表
print("词汇表:", vocab)# 输出稀疏矩阵
print("词袋模型的稀疏表示:\n", X)# 将稀疏矩阵转换为稠密矩阵(便于查看)
print("词袋模型的稠密表示:\n", X.toarray())
输出解析
  1. 词汇表:程序首先会提取出所有文档中的唯一词汇。例如,['and', 'amazing', 'coding', 'for', 'fun', ...]
  2. 稀疏矩阵:文档中的每个词对应词汇表中的一个位置,矩阵中的值表示该词在文档中的出现频次。
  3. 稠密矩阵:将稀疏矩阵转化为密集的矩阵,使得每一行都对应于一个文档,每个单元格表示词汇表中对应词汇在该文档中出现的次数。例如,某一行代表文档1,某一列代表词汇表中的某个词,数值为该词在文档1中出现的次数。
运行结果

假设词汇表是这样的:

['amazing', 'and', 'coding', 'for', 'fun', 'great', 'in', 'is', 'language', 'learning', 'love', 'machine', 'natural', 'processing', 'python', 'with']

稠密矩阵可能像这样:

[[1 0 0 0 0 0 0 1 0 2 1 2 0 0 0 0][0 0 1 1 0 1 1 1 0 1 1 1 0 0 2 0][0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1]]
  • 第一行表示文档1的词频,其中“amazing”出现了1次,“is”出现了1次,“learning”出现了2次,依此类推。
  • 第二行表示文档2,类似地解释每个词的出现频率。

总结

词袋模型是一种简单且有效的文本表示方法,常用于文本分类、文本聚类等任务中。通过sklearn中的CountVectorizer,可以轻松实现词袋模型,并将文档转化为机器学习模型所需的特征向量。


http://www.mrgr.cn/news/40634.html

相关文章:

  • 如何设计具体项目的数据库管理
  • 文本分类与朴素贝叶斯的魅力 —— 插座智能链接,技术的桥梁
  • 【AI知识点】词袋模型(Bag-of-Words,BOW)
  • ZLMediaKit编译运行
  • C++容器之vector模拟实现(代码纯享版!!!)
  • [云] Getting Started with Kubernetes - Environment setup 环境配置
  • Total_Expectation_Conditional_Bias_Variance_Tradeoff
  • 超分服务的分量保存
  • LeetCode 0983.最低票价:记忆化搜索
  • Chromium 用户数据目录User Data 初始化过程c++
  • 电力、电子、电气、电器,怎么说明白?
  • Axios 和 Ajax 的区别与联系
  • 当贝播放器 1.5.0 畅享原画,支持阿里网盘、杜比视界和8K播放
  • Stm32的bootloader无法使用问题
  • 【C++进阶】多态
  • 2024/10/1 408大题专训之磁盘管理
  • VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理
  • Linux服务器配置anaconda3,下载torch
  • Java基础 3. 面向对象
  • 考研数据结构——顺序表代码题