从One-Hot到TF-IDF:NLP词向量演进解析与业务实战指南(一)

从One-Hot到TF-IDF:词向量演进之路

开场白:

想象一下,你试图用Excel表格分析《红楼梦》的情感倾向——每个字词都是孤立的单元格,计算机看到的只有冰冷的0和1,而“黛玉葬花”的凄美意境却消失得无影无踪。这就是NLP工程师每天面对的根本难题:如何让机器理解那些藏在文字背后的故事?

词向量技术如同一位“语言炼金术师”,它把“我”、“北京”、“开心”这些符号,熔炼成带有密码的数字向量。从最原始的One-Hot编码(像给每个词发唯一身份证)到TF-IDF(像给词语贴重要性标签),再到Word2Vec、GloVe等模型带来的语义深度捕捉,最后是现在最先进的编码器和解码器模型,这些技术已经极大地推动了自然语言处理的发展。

尽管技术越来越新,但是业务中总会有各种各样的问题,遇到这种情景你该怎么办呢?

  1. 当老板要求明天上线一个文本分类系统时,你是花3天调BERT模型,还是用2小时写TF-IDF+XGBoost?

  2. 明明ChatGPT已经能写诗,为什么电商大厂还在用20年前的技术检测刷单评论?

本文将撕开算法黑箱,带你亲历NLP史上最隐秘的生存法则——用80分的算法解决90分的业务问题,才是工程师的顶级智慧


一、One-Hot编码

1.1 缘起

由于计算机只能读懂二进制,所以直接喂给计算机自然语言计算机是不能工作的。

一个很简单的思路就是用0和1等二进制信息来表示自然语言,于是便有了one-hot编码表示自然语言的形式。

举个例子,假如全世界的词突然减少到了只剩下7个词,即["我", "要", "去", "北京", "想想", "就", "开心"],那么全世界的词表也就是["我", "要", "去", "北京", "想想", "就", "开心"],那么每个词的one-hot编码为:

  • "我" → [1, 0, 0, 0, 0, 0, 0]

  • "要" → [0, 1, 0, 0, 0, 0, 0]

  • "北京" → [0, 0, 0, 1, 0, 0, 0]

  • “我要去北京”  → [1, 1, 1, 1, 0, 0, 0]

代码案例:(使用sklearn进行onehot编码)

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
vectors = encoder.fit_transform([["我"], ["要"], ["去"], ["北京"], ["想想"], ["就"], ["开心"]])
1.2 核心优势解析
  • 数学可解释性:每个词对应唯一正交向量,保证词间独立性

  • 零计算成本:无需训练即可生成特征表示

1.3 缺陷
  • 维度灾难:词表规模(N)决定向量维度(N维),若词汇量达3万,每个词需3万维稀疏向量,存储和计算效率极低。

  • 语义鸿沟:Onehot编码无法捕捉词汇之间的语义关系,例如“猫”和“狗”在语义上更为接近,但通过onehot编码后,从向量角度来看,不同的词向量是正交的,所以相似度为零。

  • 特征稀疏:实际文本中99.9%的维度值为0


二、词袋模型(Bag of Words):从存在性到重要性的进化

有了one-hot的基础之后,就引出词袋模型了。

1.1 核心思想

词袋模型在One-Hot的"存在性判断"基础上,引入词频统计这一重要性维度。其核心假设是:词语在文档中出现的次数与其语义重要性正相关。这种从布尔逻辑到整数统计的转变,使得模型能够区分"重要关键词"与"普通修饰词"。

举个例子,假设我们有以下三句话:

  1. "我要去北京"
  2. "想想就开心"
  3. "我要去北京想想就开心"

基于之前的词表 ["我", "要", "去", "北京", "想想", "就", "开心"],我们可以构建一个词袋模型,表示如下:

文档编号北京想想开心
11111000
20000111
31111111

可以看到,每一行表示一个文档,每一列表示一个词,值表示该词在文档中出现的次数。


代码案例:(使用sklearn实现词袋模型)
from sklearn.feature_extraction.text import CountVectorizer# 构建语料库
corpus = ["我要去北京","想想就开心","我要去北京想想就开心"
]# 初始化词袋模型
vectorizer = CountVectorizer()# 训练并转换语料库
X = vectorizer.fit_transform(corpus)# 输出词表和对应的词袋矩阵
print("词表:", vectorizer.get_feature_names_out())
print("词袋矩阵:\n", X.toarray())

输出结果:

词表: ['北京' '就' '开心' '想想' '去' '要' '我']
词袋矩阵:[[1 0 0 0 1 1 1][0 1 1 1 0 0 0][1 1 1 1 1 1 1]]

1.2 核心优势解析
  1. 简单易用:词袋模型实现简单,易于理解和使用。
  2. 高效性:对于小规模数据集,词袋模型能够快速生成特征向量。
  3. 兼容性强:生成的稀疏矩阵可以直接用于机器学习算法,如逻辑回归、支持向量机等。
  4. 无序性:忽略词序后,模型对短文本的处理表现较好。

1.3 缺陷
  1. 忽略语义信息:词袋模型完全忽略了词语之间的顺序关系,可能会丢失上下文信息。例如,“我喜欢你”和“你不喜欢我”会被视为相同的向量。
  2. 高维稀疏性:当词表很大时,生成的特征向量会非常稀疏,导致计算效率低下。
  3. 无法捕捉相似性:不同词之间没有相似性度量,例如“开心”和“快乐”会被视为完全不同的词。

1.4 业务价值

有人说,词袋模型太古老了,现在业务中已经没有价值了。

非也非也。即便是这么古老的技术也是有意义的。

比如从直播中检测是否有人用录播冒充直播的情况

输入是一段超长文本(重复录播可以做到24/7的不间断直播),输出是是否存在录播重复True/False。

录播检测场景的技术选型逻辑:
1. 编辑距离O(n²)时间复杂度,对10分钟直播流(约5000字)需计算2500万次对比
2. 词袋模型:滑动窗口内词频统计 → 向量化 → 余弦相似度计算,时间复杂度降为O(n)

技术对比

方案时间复杂度准确率适用场景
编辑距离O(n²)98%短文本精准匹配
词袋模型+余弦相似度O(n)92%实时流媒体检测

所以说,即便是最古老的技术也是有价值的


三、TF-IDF

1.1 核心思想

TF-IDF 是一种统计方法,用于评估一个词在文档或语料库中的重要性。

其核心思想是:如果某个词在一个文档中频繁出现,但在整个语料库中很少出现,则该词可能对这个文档来说是非常重要的。

  • TF(Term Frequency, 词频):衡量一个词在文档中出现的频率。可以通过简单计数、归一化等方式计算。

    • TF(词) = (该词在文档中出现的次数) / (文档中所有词的数量)

    • 举个例子,如果一个词在一篇有100个词的文档里出现了5次,那么这个词的词频就是 5/100=0.055/100=0.05。

  • IDF(Inverse Document Frequency, 逆文档频率):衡量一个词的普遍重要性。如果一个词在很多文档中都出现过,那么它可能不是一个好的区分者。

    • IDF(词) = log(总文档数 / 包含该词的文档数量)

    • 这里的 log 是以 e 为底的对数函数。例如,如果有1000篇文档,其中10篇包含某个词,则 IDF = log(1000/10)=log(100)log(1000/10)=log(100)。

  • TF-IDF:结合了上述两种指标,旨在通过降低在所有文档中都很常见的词汇的重要性来突出那些有助于区分文档的词汇。

    • TF-IDF = TF × IDF
    • 这意味着,一个词在一个特定文档中的重要性不仅取决于它在这个文档中出现的频率,还取决于它在整个文档集合中的普遍程度。

代码案例:(使用sklearn实现TF-IDF)
from sklearn.feature_extraction.text import TfidfVectorizer# 构建语料库
corpus = ["我要去北京","想想就开心","我要去北京想想就开心"
]# 初始化TF-IDF模型
vectorizer = TfidfVectorizer()# 训练并转换语料库
X = vectorizer.fit_transform(corpus)# 输出词表和对应的TF-IDF矩阵
print("词表:", vectorizer.get_feature_names_out())
print("TF-IDF矩阵:\n", X.toarray())

1.2 核心优势解析
  1. 强调关键信息:相比于简单的词袋模型,TF-IDF 更加关注那些能够区分不同文档的关键词汇。
  2. 减少常见词影响:通过 IDF 部分,减少了像“的”、“是”这样的高频但无实际意义的词汇的影响。
  3. 适应性强:可以应用于各种类型的文本数据,并且不需要复杂的参数调整。
1.3 缺陷
  1. 忽略上下文:尽管TF-IDF能有效识别关键词,但它仍然忽略了词语之间的顺序和上下文关系。
  2. 维度灾难:对于非常大的语料库,生成的特征向量维度非常高,可能导致计算效率问题。
  3. 无法捕捉同义词:不同的词即使具有相似的含义,也会被视为完全不同的实体。
1.4 业务价值

TF-IDF 在如今仍然很常用,如低成本策略大多采用TF-IDF做特征工程,然后接一个分类器做文本分类,这种业务实际中太多了。

较常用的,TF-IDF (特征) + XGBoost/SVM(分类器)= 分类模型

虽然效果上限低于GPU类模型(RNN和预训练模型),但是成本超低,响应超快,仍然有不少企业采用这种解决方案。


四、技术演进全景图与业务选型建议

4.1 技术对比矩阵

评估维度One-Hot词袋模型TF-IDF
语义区分能力词频差异跨文档重要性
空间复杂度O(V)O(V)O(V)
实时计算性能O(1)O(n)O(n log n)
上下文感知
最佳适用场景小规模枚举特征短文本聚类信息检索


五、结语

今天就是本专栏的第一篇干货,简单介绍了一下 tf-idf 的由来和实现。

由于本专栏的策略是实践中学习,所以我这期将原理,下期就要讲代码了,欢迎订阅,谢谢大家~

思考题🤔

  1. 对于TF-IDF考虑这样一种情况,有若干篇文档,但一种一篇文章是单独讨论狗的,所以狗这个词的权重就会变的很高。你觉得这样合理么?有什么解决方案吗?
  2. TF-IDF出来50000维特征,领导却说‘反正现在内存便宜直接跑模型呗’——你们会乖乖照做,还是偷偷降维?如果降,怎么和老板解释‘降维不丢信息’


下期预告:使用 tfidf 进行常见业务的文本分类(代码实现)🚀

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

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

相关文章

2. kubernetes操作概览

以下是 Kubernetes 的核心操作概览,涵盖常用命令、资源管理和典型场景的操作流程: 1. 核心操作工具 (1) kubectl 命令行工具 Kubernetes 的所有操作均通过 kubectl 实现,常用命令如下: 操作类型命令示例作用说明查看资源状态ku…

从Ampere到Hopper:GPU架构演进对AI模型训练的颠覆性影响

一、GPU架构演进的底层逻辑 AI大模型训练效率的提升始终与GPU架构的迭代深度绑定。从Ampere到Hopper的演进路径中,英伟达通过‌张量核心升级‌、‌显存架构优化‌、‌计算范式革新‌三大技术路线,将LLM(大语言模型)训练效率提升至…

p2p的发展

PCDN(P2P内容分发网络)行业目前处于快速发展阶段,面临机遇与挑战并存的局面。 一、发展机遇 技术融合推动 边缘计算与5G普及:5G的高带宽、低延迟特性与边缘计算技术结合,显著提升PCDN性能,降低延迟&#x…

计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结

视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…

Ubuntu 24.04 中文输入法安装

搜狗输入法,在Ubuntu 24.04上使用失败,安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况,是这个帖子里描述的: https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…

阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护

作者:张文浩 阿里云在其微服务引擎(MSE)注册配置中心 Nacos 上正式推出全新“安全防护”功能模块,旨在帮助企业用户有效管理安全状态和降低开启安全相关功能的学习成本,提升微服务架构的安全性。首期推出的“安全防护…

C#核心(23)StringBuilder

前言 我们先前已经了解了String的一些基本规则和常见的用法,今天就来讲一下和string有所区别的StringBulider。 在 C# 中,StringBuilder 类是一个非常有用的工具,特别是在需要频繁修改字符串时。与 String 类型不同,StringBuilder 类提供了一种动态字符串,可以在不创建新…

活动图与流程图的区别与联系:深入理解两种建模工具

目录 前言1. 活动图概述1.1 活动图的定义1.2 活动图的基本构成要素1.3 活动图的应用场景 2. 流程图概述2.1 流程图的定义2.2 流程图的基本构成要素2.3 流程图的应用场景 3. 活动图与流程图的联系4. 活动图与流程图的区别4.1 所属体系不同4.2 表达能力差异4.3 使用目的与语境4.4…

idea运行springboot项目,运行时不能生成target

1,问题 项目本来运行正常,突然重启项目运行时,提醒主类找不到,发现target未生成 2,解决办法 查看.idea里面的文件,正常是下面这样的 如果有缺失,删除.idea里面的文件,清除idea缓…

【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller

注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——Animator动画】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么?二、实战专栏推荐完结 一、状态机复…

山东大学软件学院创新项目实训(11)之springboot+vue项目接入deepseekAPI

因为该阶段是前后端搭建阶段,所以没有进大模型的专项训练,所以先用老师给的deepseek接口进行代替 且因为前端设计部分非本人负责且还没有提交到github上,所以目前只能先编写一个简易的界面进行功能的测试 首先进行创建model类 然后创建Cha…

FreeRTOS入门与工程实践-基于STM32F103(二)(互斥量,事件组,任务通知,软件定时器,中断管理,资源管理,调试与优化)

互斥量 一、互斥量(Mutex):解决多任务 “抢资源” 的问题 1. 是什么? 互斥量是一种 “任务间互斥访问资源” 的工具,本质是一个 只能被锁定(0)或释放(1)的二进制信号量…

软考笔记10——网络与信息安全基础知识

第十章节——网络与信息安全基础知识 网络与信息安全基础知识 第十章节——网络与信息安全基础知识一、网络概述1. 计算机网络概念2. 计算机网络分类3. 网络拓补结构4. ISO/OSI网络体系结构1. ISO/OSI参考模型 二、网络互联硬件1. 网络的设备2. 网络的传输介质 三、网络协议与标…

Tycoon2FA钓鱼工具包发布重大更新,强化反检测能力

钓鱼即服务(PhaaS)平台升级反检测功能 网络安全公司Sekoia于2023年发现的钓鱼工具包Tycoon2FA近期发布重大更新,显著提升了其反检测能力。该工具包现采用多项高级规避技术,包括通过HTML5 canvas实现的自定义验证码、混淆JavaScri…

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(旅游景区导游管理平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、制定项目章程二、制订项目管理计划三、指导和管理项目工作四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段论文 在国家《中国旅游“十三五”发展规划信息化专项规划的背景下…

深入理解微信小程序开发:架构、组件化与进阶实战

📘博文正文: 深入理解微信小程序开发:架构、组件化与进阶实战 微信小程序已成为移动互联网的重要入口。随着业务复杂度提升,仅靠入门知识已无法应对日常开发需求。本文将深入剖析小程序开发架构、组件化模式、状态管理、网络封装…

PBKDF2全面指南(SpringBoot实现版)

文章目录 第一部分:PBKDF2基础概念1. 什么是PBKDF2?2. 为什么需要PBKDF2?3. PBKDF2的工作原理4. PBKDF2与其他密码散列函数的比较第二部分:在Java和SpringBoot中使用PBKDF21. Java内置的PBKDF2支持2. SpringBoot中集成PBKDF22.1 添加依赖2.2 配置PBKDF2密码编码器2.3 自定义…

RTP Payload Format for H.264 Vide(1)

摘要:: 本备忘录描述了一种用于 ITU-T H.264 视频编码标准(与 ISO/IEC 国际标准 14496-10 技术上相同)的 RTP 负载格式,但不包括可伸缩视频编码(SVC)扩展和多视角视频编码(MVC&#…

论文翻译:2024-arxiv How to Steer LLM Latents for Hallucination Detection?

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 How to Steer LLM Latents for Hallucination Detection? https://arxiv.org/pdf/2503.01917 https://www.doubao.com/chat/2818934852496130 其它资料: https://blog.csdn.net/we…

第四篇:[特殊字符] 深入理解MyBatis[特殊字符] 掌握MyBatis Generator ——入门与实战

引言 什么是 MyBatis Generator? MyBatis Generator (MBG) 是一个代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写…