自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF

目标
  • 了解词袋模型(BoW)和 TF-IDF 的概念
  • 通过实际示例展示 BoW 和 TF-IDF 如何将文本转换为数值表示
  • 详细讲解 Scikit-learn 的实现方法
  • 通过代码示例加深理解
  • 归纳学习难点,并提供课后练习和讲解

3.1 词袋模型(Bag of Words, BoW)

1. 什么是词袋模型?

词袋模型(BoW)是一种最简单的文本表示方法,它的核心思想是:

  • 将一篇文章表示为一个词的集合
  • 忽略词的顺序,仅统计每个词的出现次数
  • 转换成一个数值向量,方便计算机处理

让我们用一个直观的例子来理解:

示例:文本数据

假设有两条文本:

文本1: "猫 喜欢 喝 牛奶"
文本2: "狗 也 喜欢 喝 牛奶"

如果我们要分析这些文本,需要将它们转换为计算机可处理的格式。

构建词表(Vocabulary)

首先,我们从所有文本中提取唯一的词,构建一个词表:

词表 = ["猫", "喜欢", "喝", "牛奶", "狗", "也"]
转换成数值表示

对于每条文本,我们用向量表示每个词出现的次数:

文本1: [1, 1, 1, 1, 0, 0]  # "猫"、"喜欢"、"喝"、"牛奶" 各出现 1 次
文本2: [0, 1, 1, 1, 1, 1]  # "狗"、"也"、"喜欢"、"喝"、"牛奶" 各出现 1 次

这样,我们就把文本转换成了一个数值矩阵,每行对应一个文本,每列对应一个单词的词频。


2. BoW 代码示例

我们使用 Scikit-learnCountVectorizer 来实现 BoW:

from sklearn.feature_extraction.text import CountVectorizer

# 1. 定义文本数据
texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶"]

# 2. 创建 CountVectorizer 对象,确保单字符词也被保留
vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words=None)

# 3. 训练 BoW 模型并转换文本
bow_matrix = vectorizer.fit_transform(texts)

# 4. 输出词表
print("词表:", vectorizer.get_feature_names_out())

# 5. 输出转换后的 BoW 矩阵
print("BoW 矩阵:\n", bow_matrix.toarray())

运行结果

词表: ['也' '喜欢' '喝' '牛奶' '狗' '猫']
BoW 矩阵:
[[0 1 1 1 0 1]
 [1 1 1 1 1 0]]
  • 词表是按字母顺序排列的
  • 0 表示该单词未出现在这篇文章中
  • 1 表示该单词在文章中出现了一次

3.2 TF-IDF(词频-逆文档频率)

1. 为什么需要 TF-IDF?

BoW 只计算了单词的出现次数,但有个问题:

  • 高频词的影响:在中文里,“的”、“是”、“在” 这样的词出现次数很高,但它们对文本的意义贡献很小。
  • 重要但不常见的词被忽略:像 “人工智能” 这样的词可能只在部分文本中出现,但它们的信息量很大。

TF-IDF(词频-逆文档频率) 通过两部分来调整词的重要性:

  • TF(词频,Term Frequency):衡量某个词在文章中出现的频率。
    在这里插入图片描述

  • IDF(逆文档频率,Inverse Document Frequency):衡量某个词在所有文档中的重要性。
    [
IDF = \log(\frac{\text{总文档数}}{\text{包含该词的文档数} + 1})
]

    • 例如,“的” 在所有文本中都出现,IDF 低
    • “人工智能” 只在一部分文章出现,IDF 高

最终:
在这里插入图片描述

它的作用是:

  • 常见但无意义的词(如 “的”、“是”)权重降低
  • 罕见但重要的词(如 “人工智能”)权重提高

2. TF-IDF 代码示例

我们使用 Scikit-learnTfidfVectorizer 进行 TF-IDF 计算。

from sklearn.feature_extraction.text import TfidfVectorizer

# 1. 定义文本数据
texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶"]

# 2. 创建 TF-IDF Vectorizer 对象,确保单字符词也被保留
tfidf_vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words=None)

# 3. 训练 TF-IDF 并转换文本
tfidf_matrix = tfidf_vectorizer.fit_transform(texts)

# 4. 输出词表
print("词表:", tfidf_vectorizer.get_feature_names_out())

# 5. 输出 TF-IDF 矩阵
print("TF-IDF 矩阵:\n", tfidf_matrix.toarray())

运行结果(示例)

词表: ['也' '喜欢' '喝' '牛奶' '狗' '猫']
TF-IDF 矩阵:
[[0.     0.5    0.5    0.5    0.     0.707]
 [0.707  0.5    0.5    0.5    0.707  0.    ]]

3. 观察结果

  • “喜欢”、“喝”、“牛奶” 这些词在两篇文章中都出现,所以权重较低
  • “猫” 只在第一篇文章中出现,所以权重较高
  • “狗” 只在第二篇文章中出现,所以权重较高

3.3 难点总结

难点理解方式
BoW 忽略词序记住:BoW 只统计词频,而不考虑单词顺序
TF-IDF 计算复杂只需记住:TF 代表词频,IDF 代表重要性(少见但重要的词权重高)
向量化后数据文本转化为数字矩阵,方便机器学习使用

3.4 课后练习

1. 理解 BoW

练习:
请修改以下代码,增加一个新文本,并观察 BoW 变化:

texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶", "机器学习 是 人工智能 的 一部分"]
  • 你观察到哪些新单词?
  • 词表是否有变化?

2. 理解 TF-IDF

练习:
请修改以下代码,增加一个新文本,并观察 TF-IDF 变化:

texts = ["机器学习 很 有趣", "机器学习 使 生活 更 智能"]
  • 哪些词的权重较高?
  • 频繁出现的词的权重是否下降了?

总结

  • BoW 适用于简单 NLP 任务,但容易丢失语义信息
  • TF-IDF 解决了高频词影响,但仍无法完全理解上下文
  • 下一步学习:深度学习模型(如 Word2Vec、BERT)如何更好地理解文本语义

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++模板编程——typelist的实现

文章最后给出了汇总的代码,可直接运行 1. typelist是什么 typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似,只不过typelist存储的不是变量,而是类型。 typelist简单来说就是一个类型容器,能够提供一…

fastadmin 接口请求提示跨域

问题描述 小程序项目,内嵌h5页面,在h5页面调用后端php接口,提示跨域。网上查找解决方案如下: 1,设置header // 在入口文件index.php直接写入直接写入 header("Access-Control-Allow-Origin:*"); header(&q…

只需三步!5分钟本地部署deep seek——MAC环境

MAC本地部署deep seek 第一步:下载Ollama第二步:下载deepseek-r1模型第三步:安装谷歌浏览器插件 第一步:下载Ollama 打开此网址:https://ollama.com/,点击下载即可,如果网络比较慢可使用文末百度网盘链接 注:Ollama是…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Excel 笔记

实际问题记录 VBA脚本实现特殊的行转列 已知:位于同一Excel工作簿文件中的两个工作表:Sheet1、Sheet2。 问题:现要将Sheet2中的每一行,按Sheet1中的样子进行转置: Sheet2中每一行的黄色单元格,为列头。…

【故障处理】- ora-39126

【故障处理】- ora-39126 一、概述二、报错原因三、解决方法 一、概述 使用xtts迁移源端12.1.0.2版本,进行全库导入时(目标端19c),报错ORA-39126. 二、报错原因 根据mos反馈,是数据库bug导致,该bug会在20.…

C#运动控制——轴IO映射

1、IO映射的作用 该功能允许用户对专用 IO 信号的硬件输入接口进行任意配置,比如轴的急停信号,通过映射以后,可以将所有轴的急停信号映射到某一个IO输入口上,这样,我们只要让一个IO信号有效就可以触发所有轴的急停。 进…

MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作

#作者:任少近 文章目录 一、扩容在245节点上配置配置config server:配置mongos启动config server安装工具mongosh添加245新节点到副本集配置分片副本集启动路由并分片 二、缩容Conf server上去掉server4shard上去掉server4mongos上去掉server4 一、扩容…

【NLP】第十一章:隐马尔可夫模型 HMM (Hidden Markov Model)

本来是想讲BERT的,但是BERT的重点是部署应用,而且用BERT跑一些NLP领域的很多任务时,一般做法都是BERT后面再串一个概率模型来约束输出,比如串联一个条件随机场CRF模型。而我们还没讲CRF呢,而且要了解CRF需要首先了解隐…

APP端网络测试与弱网模拟!

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…

使用k3s高可用部署rancher

本次部署采用3节点的etcd服务2master节点的k3s使用helm部署的ranchervip(keepalived) 一、安装etcd服务 # 准备 3 个节点部署 etcd cd /hskj/tmp wget https://github.com/etcd-io/etcd/releases/download/v3.3.15/etcd-v3.3.15-linux-amd64.tar.gz tar xzvf etcd-v3.3.15-…

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器,其特点是…

uniapp开发h5部署到服务器

1.发行>网站-PC Web或手机H5(仅适用于uniapp) 2.填写网站域名 3.编译成功后会生成一个unpackage文件夹找到下面的h5 4.接下来会使用一个工具把h5里面的文件放到服务器上面(WinSCP使用其他能部署的工具也行) 5.登录 6.登录成功后…

【C/C++算法】从浅到深学习---滑动窗口(图文兼备 + 源码详解)

绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本章是算法训练的第二章----滑动窗口,它的本质是双指针算法的衍生所以我将…

AWTK-WEB 快速入门(4) - JS Http 应用程序

XMLHttpRequest 改变了 Web 应用程序与服务器交换数据的方式,fetch 是 XMLHttpRequest 继任者,具有更简洁的语法和更好的 Promise 集成。本文介绍一下如何使用 JS 语言开发 AWTK-WEB 应用程序,并用 fetch 访问远程数据。 用 AWTK Designer 新…

html 点击弹出视频弹窗

一、效果: 点击视频按钮后,弹出弹窗 播放视频 二、代码 <div class="index_change_video" data-video-src="</

FPGA实现UltraScale GTH光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头动态彩条输入视频之-->ADV…

HCIA项目实践--静态路由的总结和简单配置

七、静态路由 7.1 路由器获取未知网段的路由信息&#xff1a; &#xff08;1&#xff09;静态路由&#xff1a;网络管理员手工配置的路由条目&#xff0c;它不依赖网络拓扑的变化进行自动更新&#xff0c;而是根据管理员预先设定的路径来转发数据包。其优点是配置简单、占用系…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR

未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …