探索大语言模型(LLM):词袋法(Bag of Words)原理与实现

news2025/5/9 23:31:25

文章目录

  • 引言
  • 一、词袋法原理
    • 1.1 核心思想
    • 1.2 实现步骤
  • 二、数学公式
    • 2.1 词频表示
    • 2.2 TF-IDF加权(可选)
  • 三、示例表格
    • 3.1 构建词汇表
    • 3.2 文本向量化(词频)
  • 四、Python代码实现
    • 4.1 基础实现(手动计算)
    • 4.2 输出结果
    • 4.3 TF-IDF加权实现
  • 五、注意事项
  • 六、总结


引言

词袋法(Bag of Words, BoW)是自然语言处理(NLP)中最基础的文本向量化方法之一。它通过统计文本中词汇的出现频率,将非结构化的文本转换为结构化的数值向量,为后续的机器学习任务(如分类、聚类)提供输入。本文将系统讲解词袋法的原理、数学公式、实现步骤,并通过代码演示其完整流程。

一、词袋法原理

1.1 核心思想

词袋法将文本视为一个“袋子”,忽略语法、词序和句子结构,仅关注词汇的出现与否或出现次数。例如:

  • 文本1:“I love NLP”
  • 文本2:“NLP is fun”

词袋法会将这两个文本转换为向量,维度由所有唯一词汇构成,每个维度表示对应词汇的权重(如词频或TF-IDF值)。

1.2 实现步骤

  1. 构建词汇表:统计所有文本中的唯一词汇,形成词汇表 V = w 1 , w 2 , . . . , w N V={w_1,w_2,...,w_N} V=w1,w2,...,wN,其中 N 为词汇表大小。
  2. 文本向量化:对每个文本 d,生成一个 N 维向量 v d v_d vd,其中第 i 个元素表示词汇 w i w_i wi在 d 中的权重。

二、数学公式

2.1 词频表示

向量 v d v_d vd的第 i 个元素为词频(Term Frequency, TF):
v d , i = c o u n t ( w i ∈ d ) v_{d,i}=count(w_i∈d) vd,i=count(wid)

2.2 TF-IDF加权(可选)

为降低常见词(如“the”、“is”)的权重,可使用TF-IDF:

T F − I D F ( w i , d ) = T F ( w i , d ) × l o g ( 1 + D 1 + D F ( w i ) ) TF-IDF(w_i,d)=TF(w_i ,d)×log( \frac{1+D}{1+DF(w_i)}) TFIDF(wi,d)=TF(wi,d)×log(1+DF(wi)1+D)
其中:

  • D D D为总文档数
  • D F ( w i ) DF(w_i) DF(wi)为包含词汇 w i w_i wi的文档数

三、示例表格

假设有以下三个文档:

文档ID文本内容
D1“cat sits on mat”
D2“dog sits on mat”
D3“cat chases mouse”

3.1 构建词汇表

V = { c a t , s i t s , o n , m a t , d o g , c h a s e s , m o u s e } ( N = 7 ) V=\{cat, sits, on, mat, dog, chases, mouse\}(N=7) V={cat,sits,on,mat,dog,chases,mouse}(N=7)

3.2 文本向量化(词频)

文档catsitsonmatdogchasesmouse
D11111000
D20111100
D31000011

四、Python代码实现

4.1 基础实现(手动计算)

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
 
# 示例文档
documents = [
    "cat sits on mat",
    "dog sits on mat",
    "cat chases mouse"
]
 
# 1. 构建词汇表并向量化
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
 
# 2. 输出结果
print("词汇表:", vectorizer.get_feature_names_out())
print("向量矩阵:\n", X.toarray())

4.2 输出结果

词汇表: ['cat' 'chases' 'dog' 'mat' 'mouse' 'on' 'sits']
向量矩阵:
 [[1 0 0 1 0 1 1]
 [0 0 1 1 0 1 1]
 [1 1 0 0 1 0 0]]

4.3 TF-IDF加权实现

from sklearn.feature_extraction.text import TfidfVectorizer
 
# 使用TF-IDF向量化
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(documents)
 
print("TF-IDF向量矩阵:\n", X_tfidf.toarray())

五、注意事项

  • 维度灾难:词汇表大小随数据量增长,可能导致高维稀疏矩阵。
  • 语义丢失:忽略词序和上下文(如“不喜欢”和“喜欢”无法区分)。
  • 预处理关键性:需结合停用词过滤、词干提取(如Porter Stemmer)提升效果。

六、总结

词袋法通过简单的统计实现了文本的数值化,是NLP任务的基石。尽管存在局限性,但其思想仍被广泛应用于早期文本分类系统(如垃圾邮件过滤)。对于需要语义理解的任务,可进一步探索Word2Vec、BERT等深度学习模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发(十一) 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件,触发单击事件时,最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层(Layer 4)负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层(Layer 7)负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

WPF之Slider控件详解

文章目录 1. 概述2. 基本属性2.1 值范围属性2.2 滑动步长属性2.3 刻度显示属性2.4 方向属性2.5 选择范围属性 3. 事件处理3.1 值变化事件3.2 滑块拖动事件 4. 样式和模板自定义4.1 基本样式设置4.2 控件模板自定义 5. 数据绑定5.1 绑定到ViewModel5.2 同步多个控件 6. 实际应用…

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求,所以配置一个应用专门用来推送消息。实现过程大致为:服务器生成每天的报告,通过调用API来发送消息。以前一直都是发邮件,整个邮箱里全是报告文件&#xff0c…

日志之ClickHouse部署及替换ELK中的Elasticsearch

文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…

解构与重构:自动化测试框架的进阶认知之旅

目录 一、自动化测试的介绍 (一)自动化测试的起源与发展 (二)自动化测试的定义与目标 (三)自动化测试的适用场景 二、什么是自动化测试框架 (一)自动化测试框架的定义 &#x…

DockerDesktop替换方案

背景 由于DockerDesktop并非开源软件,如果在公司使用,可能就有一些限制,那是不是除了使用DockerDesktop外,就没其它办法了呢,现在咱们来说说替换方案。 WSL WSL是什么,可自行百度,这里引用WS…

力扣热题100之搜索二维矩阵 II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 代码 方法一:直接全体遍历 这个方法很直接,但是居然没有超时&#xff0c…

docker操作镜像-以mysql为例

Docker安装使用-CSDN博客 docker操作镜像-以mysql为例 当安装一个新的镜像时可以登录https://hub.docker.com/直接搜索想要安装的镜像,查看文档 1)拉取镜像 docker pull mysql 或者 docker pull mysql:版本号 然后直接跳到第4)步即可 2…

使用OpenCV 和 Dlib 进行卷积神经网络人脸检测

文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…

React 实现 JWT 登录验证的最小可运行示例

下面是一个用 React 实现 JWT 登录验证的最小可运行示例,包含: React 前端:登录、保存 Token、获取用户数据。模拟后端:用 mock API(你也可以接真后端)。 🧱 技术栈 React(使用 Vi…

Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)

文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…

vue2开发者sass预处理注意

vue2开发者sass预处理注意 sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。 node-sass已经停维很久了。 vue3默认使用的是dart-sass。 Uniapp的官方文档截图 从 HBuilderX 4.56 ,vue2 …

使用 Selenium 爬取动态网页数据 —— 实战与坑点详解

本文记录了笔者在爬取网页数据过程中遇到的各种技术挑战,包括页面动态渲染、JavaScript 注入等问题,并最终给出一个可运行的完整方案。 文章目录 网页获取不到数据🚀 尝试用 Selenium 渲染页面 网页获取不到数据 某网页数据依赖大量 JavaSc…

守护数字家园:个人博客安全防护指南

前言 在之前的文章《WordPress个人博客搭建(一)》《WordPress个人博客搭建(二)》《WordPress个人博客搭建(三)》中,我们已经在非凡云云服务器上,借助1Panel搭建起属于自己的数字庭院…

【网络编程】三、TCP网络套接字编程

文章目录 TCP通信流程Ⅰ. 服务器日志类实现Ⅱ. TCP服务端1、服务器创建流程2、创建套接字 -- socket3、绑定服务器 -- bind🎏4、服务器监听 -- listen🎏5、获取客户端连接请求 -- acceptaccept函数返回的套接字描述符是什么,不是已经有一个了…

trae ai编程工具

Trae,致力于成为真正的 AI 工程师(The Real Al Engineer)。Trae 旗下的 AI IDE 产品,以智能生产力为核心,无缝融入你的开发流程,与你默契配合,更高质量、高效率完成每一个任务。 版本差异 国内…

神经网络发展历程——积跬步至千里

神经网络类型层线性or非线性创新问题备注感知器单层线性模型,输出 1 1 1, − 1 -1 −1误差反馈学习阈值函数不可导,构造学习规则与感知器准则等价线性神经元单层线性模型梯度下降法训练参数线性函数,多层仍是线性变换本质上是最小…

荣耀A8互动娱乐组件部署实录(第2部分:界面逻辑与资源加载机制)

作者:从 Spine 骨骼动画里抠图三小时没睡的美术兼前端苦工 一、界面整体架构拆解 荣耀A8组件采用的是典型的分模块 UI 架构,即:主界面为入口容器,不同子页面(如商城、银行、客服、游戏入口)以逻辑功能划分…

mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程

Milvus 特点:开源的云原生向量数据库,支持多种索引类型和GPU加速,能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景:适合处理超大规模数据和高性能需求的应用,如图像搜索、推荐…