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

自然语言处理:稀疏向量表示

介绍

大家好,我是博主。今天又来和大家分享自然语言处理领域的知识了。原本我计划这次分享NLP文本表示的相关内容,不过在整理分享计划的过程中,发现这部分知识里包含一些涉及复杂数学原理和抽象概念的内容。对于刚接触NLP的小伙伴们来说,理解起来可能会存在一定的难度。

经过慎重考虑,我决定先将其中一些基础且关键的知识单独提取出来,进行详细的讲解。这样做一方面是为了帮助大家更好地理解这些具有挑战性的内容,另一方面也是为后续深入探讨自然语言处理中的文本表示知识,做好充分的铺垫。(如果您是这方面的专家,这篇博文您可以选择性的去阅读)

稀疏向量

概念原理

在一个向量中,若大部分元素值为零,只有少数元素值是非零的,那么这个向量就被称为稀疏向量。例如,在一个长度为1000的向量里,只有10个元素的值不为0,其余990个元素的值都为0,这样的向量就是稀疏向量(Sparse Vector)

在自然语言处理中,我们通常将词汇表中的每个词映射到一个高维向量空间中的向量。例如,假设词汇表大小为,对于一个文本,其中可能只包含词汇表中少数几个词,那么对应的向量中只有这几个词对应的位置为非零值,其余位置为零,从而形成稀疏向量。这种表示方式能够突出文本中实际出现的词,忽略大量未出现的词,使得向量表示更加简洁和高效。

构建方法

独热编码

概念阐述

One-Hot Encoding。独热编码是一种简单且基础的编码方式,常用于处理类别数据。在自然语言处理中,它主要用于将词汇表中的每个词转化为向量形式。对于一个包含 n 个词的词汇表,每个词都可以用一个长度为 n 的向量来表示。在该向量中,只有对应词所在位置的元素为 1,其余元素均为 0。

这种编码方式的优点是简单直观,每个词都有唯一的向量表示,易于理解和实现。然而,它也存在一些缺点,当词汇表较大时,生成的向量维度会非常高,导致存储和计算成本增加,并且这种编码方式没有考虑词与词之间的语义关系。

原理解释

对于词汇表中的每个词,创建一个长度为词汇表大小的向量,其中只有该词对应位置的元素为1,其余元素均为0。例如,假设词汇表为["apple", "banana", "cherry"],则"apple"的独热编码向量为[1, 0, 0]"banana"的为 [0, 1, 0]"cherry"的为[0, 0, 1]

下面我们用Python代码来演示:

测试代码
# 从sklearn库的preprocessing模块导入OneHotEncoder类,用于进行独热编码操作
from sklearn.preprocessing import OneHotEncoder
# 导入NumPy库,用于处理数组和矩阵数据
import numpy as np# 定义词汇表,使用NumPy数组存储,每个元素是一个包含单个单词的列表
vocabulary = np.array([["apple"], ["banana"], ["cherry"]])# 创建OneHotEncoder类的实例对象,用于后续的独热编码转换
encoder = OneHotEncoder()# 对词汇表进行拟合和转换操作,拟合是让编码器学习词汇表中的类别信息,转换是将词汇表转换为独热编码形式
encoded_vocabulary = encoder.fit_transform(vocabulary)# 打印独热编码后的结果,将稀疏矩阵转换为普通的NumPy数组形式进行输出
print(encoded_vocabulary.toarray())
运行结果
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]进程已结束,退出代码为 0

使用scikit - learn库中的OneHotEncoder进行独热编码,是因为它提供了便捷、高效且标准化的实现方式。该库经过大量优化,能够处理各种复杂情况,并且在机器学习和数据处理的生态系统中具有良好的兼容性,便于与后续的其他算法和工具集成使用。 

词袋模型

概念阐述

Bag of WordsBoW。词袋模型是自然语言处理中一种常用的文本表示方法。它将文本看作是一个无序的单词集合,不考虑单词之间的顺序和语法结构。其核心思想是统计每个单词在文本中出现的次数,以此来构建文本的向量表示。

通过这种方式,词袋模型可以将文本转化为计算机能够处理的数值形式,便于进行后续的分析和处理。但词袋模型的缺点也很明显,它完全忽略了词序信息,而词序在很多情况下对于理解文本的语义至关重要。此外,它也无法区分同义词和多义词,可能会导致信息的丢失。

原理解释

词袋模型不仅考虑词的出现,还统计词的出现次数。对于一个文本,统计词汇表中每个词在该文本中出现的次数,以此构建向量。例如,对于文本“apple apple banana”,词汇表为["apple", "banana", "cherry"],则其词袋模型向量为[2, 1, 0]

测试代码
# 从sklearn库的文本特征提取模块导入CountVectorizer类,用于将文本数据转换为词频矩阵
from sklearn.feature_extraction.text import CountVectorizer# 定义一个包含多个文本样本的列表,每个样本是一个由空格分隔单词的字符串
texts = ["apple apple banana", "banana cherry", "apple cherry"]
# 创建CountVectorizer类的实例,用于后续的文本特征提取操作
vectorizer = CountVectorizer()
# 对texts中的文本数据进行拟合(学习词汇表)和转换(生成词频矩阵),结果存储为稀疏矩阵
sparse_matrix = vectorizer.fit_transform(texts)
# 打印出由CountVectorizer学习到的词汇表,即所有出现过的单词列表
print("词汇表:", vectorizer.get_feature_names_out())
# 打印经过词袋模型处理后,将稀疏矩阵转换为普通二维数组形式的结果
print("词袋模型后的稀疏矩阵:\n", sparse_matrix.toarray())
运行结果
词汇表: ['apple' 'banana' 'cherry']
词袋模型后的稀疏矩阵:[[2 1 0][0 1 1][1 0 1]]进程已结束,退出代码为 0

CountVectorizer在实现词袋模型时,能够自动处理文本的分词、词汇表构建以及词频统计等一系列复杂操作,无需手动编写繁琐的代码。它还支持多种参数配置,可以根据不同的需求进行灵活调整,例如可以设置是否忽略常见词(停用词)、是否进行词干提取等,在自然语言处理任务中是一个非常实用且高效的工具。

TF-IDF

概念阐述

Term Frequency-Inverse Document FrequencyTF-IDF是一种用于衡量一个词在文档中重要性的统计方法,在自然语言处理中被广泛应用于文本表示。它综合考虑了词频(TF)和逆文档频率(IDF)两个因素。

词频表示一个词在文档中出现的频率,反映了该词在当前文档中的重要程度;逆文档频率衡量一个词在整个文档集合中的普遍程度,反映了该词在所有文档中的区分度。通过将词频和逆文档频率相乘,得到每个词的TF-IDF值,以此构建的稀疏向量能够更准确地表示文本的特征,突出文本中的重要单词,同时降低常见词的权重。

原理解释

TF-IDF综合考虑词频(TF)和逆文档频率(IDF)。TF表示一个词在文档中出现的频率,IDF衡量一个词在整个文档集合中的普遍程度。通过将TF和IDF相乘,得到每个词的TF-IDF值,以此构建稀疏向量。TF-IDF值越高,说明该词在当前文档中越重要且在其他文档中越不常见。

测试代码
# 从 sklearn 库的文本特征提取模块导入 TfidfVectorizer 类,用于将文本转换为 TF-IDF 特征矩阵
from sklearn.feature_extraction.text import TfidfVectorizer# 定义一个包含多个文本样本的列表,作为待处理的文本数据
texts = ["apple apple banana", "banana cherry", "apple cherry"]
# 创建TfidfVectorizer类的实例,用于后续的TF-IDF特征提取操作
vectorizer = TfidfVectorizer()
# 对文本数据进行拟合(计算词汇的IDF值)和转换(生成TF-IDF特征矩阵),结果存储为稀疏矩阵
sparse_matrix = vectorizer.fit_transform(texts)
# 打印出由TfidfVectorizer学习到的词汇表,即所有出现过的单词列表
print("词汇表:", vectorizer.get_feature_names_out())
# 打印经过TF-IDF处理后,将稀疏矩阵转换为普通二维数组形式的结果
print("TF-IDF后的稀疏矩阵:\n", sparse_matrix.toarray())
运行结果
词汇表: ['apple' 'banana' 'cherry']
TF-IDF后的稀疏矩阵:[[0.89442719 0.4472136  0.        ][0.         0.70710678 0.70710678][0.70710678 0.         0.70710678]]进程已结束,退出代码为 0

TfidfVectorizer提供了一种简单且高效的方式来计算TF-IDF值。它内部集成了复杂的计算逻辑,包括对文本的预处理、词频统计以及逆文档频率的计算等。使用该工具可以快速准确地得到TF-IDF 特征矩阵,并且与scikit-learn中的其他机器学习算法无缝集成,方便后续进行模型训练和分析。

应用优势

稀疏向量在自然语言处理、机器学习等众多领域都有着广泛的应用,其优势主要体现在存储、计算、可解释性以及对特定数据的适应性等多个方面:

  1. 存储高效:稀疏向量的大部分元素为零,这使得在存储时只需记录非零元素及其位置信息,而无需存储所有元素。
  2. 计算高效:在进行向量运算时,如点积、加法、乘法等操作,稀疏向量只需处理非零元素。
  3. 可解释性强:在许多基于稀疏向量的表示方法中,如词袋模型和 TF-IDF,向量中的每个非零元素都对应着一个具体的特征(如词汇表中的一个词)。
  4. 突出关键信息:由于稀疏向量只保留了少数非零元素,这些非零元素往往代表了数据中的关键特征或重要信息。
  5. 应数据稀疏性:在很多实际应用场景中,数据本身就具有稀疏性。
  6. 易于与其他技术结合:稀疏向量可以方便地与其他机器学习和数据处理技术相结合。

应用劣势

  1. 高维度问题:随着词汇表增大,稀疏向量维度会变得非常高,导致计算复杂度增加,可能引发 “维度灾难”。高维度向量不仅会增加存储和计算的难度,还可能导致模型的性能下降,出现过拟合等问题。
  2. 忽略词序信息:词袋模型等方法通常忽略文本中词的顺序信息,而词序在很多情况下对理解文本语义非常重要。这可能会导致在处理一些需要考虑词序的文本时,无法准确地捕捉文本的语义信息。
  3. 语义信息表达有限:主要基于词的统计信息,对于词的语义信息表达能力有限,难以区分同义词和多义词。这使得在一些对语义理解要求较高的任务中,稀疏向量表示可能无法满足需求。

结论赋能

稀疏向量表示是自然语言处理中的重要技术,在文本分类、信息检索等多个领域有广泛应用。虽然它存在一些缺点,但通过与其他技术结合(如深度学习中的词嵌入技术),可以弥补不足,进一步提升自然语言处理的效果。未来,随着技术的不断发展,稀疏向量表示有望在更多领域发挥更大的作用,并且可能会与更多新兴技术相结合,推动自然语言处理技术的不断进步。

结束

好了,以上就是本次分享的全部内容了,希望大家都能理解与掌握这部分内容。稀疏向量表示在文本表示中扮演着至关重要的角色,发挥着多方面不可替代的作用。

  • 从特征提取角度看,它能够高效地将文本转化为计算机易于理解的数值形式。在自然语言处理中,文本由大量词汇组成,而稀疏向量可以精准地提取出文本中的关键特征。
  • 在文本分类任务里,稀疏向量表示具有显著优势。当构建文本分类模型时,将训练文本转换为稀疏向量后,模型能够快速捕捉到不同类别文本的特征差异。
  • 在信息检索领域,稀疏向量表示同样不可或缺。当用户输入查询关键词时,系统将查询和文档都转换为稀疏向量。通过计算两者向量之间的相似度(如余弦相似度),能够快速筛选出与查询最为匹配的文档。

那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。

相关文章:

自然语言处理:稀疏向量表示

介绍 大家好,我是博主。今天又来和大家分享自然语言处理领域的知识了。原本我计划这次分享NLP中文本表示的相关内容,不过在整理分享计划的过程中,发现这部分知识里包含一些涉及复杂数学原理和抽象概念的内容。对于刚接触NLP的小伙伴们来说&a…...

ubuntu 20.04 安装labelmg

1. 下载安装包 下载链接:下载链接 2. 安装启动 # 创建labelImg的环境 conda create -n labelImg# 激活labelImg环境 source activate labelImg安装依赖 pip install pyqt5-dev-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/cd requirements/pip install -…...

Redis版本的EOL策略与升级路径(刷到别划走)

各位看官,刷到就点进来,大数据已经抓到你喽~😊 前言 在软件行业做服务端开发的我们,多多少少都会接触到Redis,用它来缓存数据、实现分布式锁等,相关八股文烂熟于心,但是往往会忽略具…...

ExpMoveFreeHandles函数分析和备用空闲表的关系

第一部分:ExpMoveFreeHandles和备用空闲表的关系 ULONG ExpMoveFreeHandles ( IN PHANDLE_TABLE HandleTable ) { ULONG OldValue, NewValue; ULONG Index, OldIndex, NewIndex, FreeSize; PHANDLE_TABLE_ENTRY Entry, FirstEntry; EXHAND…...

[预订酒店]

预订酒店 真题目录: 点击去查看 E 卷 100分题型 题目描述 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。 输入描述 第一行:n,…...

java项目之基于ssm的学籍管理系统(源码+文档)

项目简介 基于ssm的学籍管理系统实现了以下功能: 学生信息管理: 学生信息新增 学生信息修改 学籍异动管理: 学籍异动添加 学籍异动删除 学籍异动修改 学生学业管理: 学生学业添加 学生学业修改 学生学业删除 学院信息管理&am…...

SpringBoot+Redis+Mybatis-plus黑马点评

短信登录 基于Session实现登录 流程: 发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用) 不能每次请求服务都要进行登录状态校验,解决办法:拦截器 在Sp…...

算法-二叉树篇23-二叉搜索树中的插入操作

二叉搜索树中的插入操作 力扣题目链接 题目描述 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同…...

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...

DeepSeek-V3关键技术之一:DeepSeekMoE

DeepSeekMoE 是一种创新的大规模语言模型架构,旨在通过高效的计算流程和优化设计,在保持高性能的同时显著降低计算成本。 1. 架构设计 DeepSeekMoE 基于 Transformer 架构,融合了以下核心技术: 专家混合系统(Mixture…...

MySQL--DQL、DML、DDL、DCL概念与区别

在SQL中,根据功能和操作对象的不同,通常将语文分为四大类:DQL(数据查询语言)、DML(数据操作语言)、DDL(数据定义语言)、DCL(数据控制语言) 一、D…...

Android Activity启动流程详解

目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理(AMS 阶段) 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…...

夜天之书 #106 Apache 软件基金会如何投票选举?

近期若干开源组织进行换届选举。在此期间,拥有投票权的成员往往会热烈讨论,提名新成员候选人和治理团队的候选人。虽然讨论是容易进行的,但是实际的投票流程和运作方式,在一个成员众多的组织中,可能会有不少成员并不清…...

保姆级教程:用Chart.js实现柱状图与折线图联动

保姆级教程:用Chart.js实现柱状图与折线图联动 ▲ 最终实现的交互式组合图表效果 一、技术原理剖析 1.1 Chart.js渲染机制 Chart.js基于HTML5 Canvas实现图表绘制,其核心原理包括: 数据绑定:将数据对象映射为图形元素分层渲染:通过order属性控制图层叠加顺序坐标系计算:…...

初阶MySQL(两万字全面解析)

文章目录 1.初识MySQL1.1数据库1.2查看数据库1.3创建数据库1.4字符集编码和排序规则1.5修改数据库1.6删除数据库 2.MySQL常用数据类型和表的操作2.(一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 2.(二)表的操作1查看指定库中所有表2.创建表 3.查看表结构和查看表…...

大模型应用:多轮对话(prompt工程)

概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...

4.3MISC流量分析练习-wireshark-https

流量分析题目的例题 1.了解wireshark的过滤方式 2.了解tls跟ssl协议基本还原 3.了解xor基本变换方式,获取flag 附件是一个流量包,打开之后有各种流量,但是分析无果,然后丢到kali中使用binwalk进行分析,发现有一个r…...

【AGI】DeepSeek开源周:The whale is making waves!

DeepSeek开源周:The whale is making waves! 思维火花引言一、DeepSeek模型体系的技术演进1. 通用语言模型:DeepSeek-V3系列2. 推理优化模型:DeepSeek-R1系列3. 多模态模型:Janus系列 二、开源周三大工具库的技术解析1…...

CSS Selectors

当然,理解纯CSS选择器(CSS Selectors)对于进行UI自动化测试非常重要。CSS选择器允许您通过元素的属性、层级关系、类名、ID等来精准定位页面上的元素。下面我将详细讲解CSS选择器的常见用法,并结合您的需求提供具体的示例。 1. 基…...

Java Junit框架

JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...

3-3 WPS JS宏 遍历文件名获取函数(遍历指定文件夹下的所有工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口,STBY置0电机全部停止,置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端(AIN1与AIN2)只能控制AO1与…...

用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较

文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...

【Qt】ffmpeg照片提取、视频播放▲

目录 一、图像的成像原理: RGB成像原理: YUV成像原理: 二、多线程 三、ffmpeg解码(照片提取) 1.准备工作 (1)在工程文件夹里面新建三个文件夹 (2)在main函数中加…...

Vue+Elementui 全局配置el-table表格列宽可拖拽

1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…...

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中,增、删、改是最基础的操作,它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…...

鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计

本博文对于鸿蒙APP程序员来说,很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言,未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本, 2022年7月27日, 华为发布了HarmonyOS 3.0。 请看下图: 因此&#…...

Linux三种网络方式

前言 发现运维啥都得会,这周就遇到了网络问题自己无法解决,因此痛定思痛学一下。 参考文献 你管这破玩意叫网络? 桥接模式、NAT模式、仅主机模式,原来是这样工作的 交换机 构成局域网,实现所有设备之间的通信。 …...

计算机网络之传输层(传输层提供的服务)

一、可靠的数据传输 传输层提供可靠的数据传输服务,确保数据在传输过程中不丢失、不重复、不乱序,并且能够被正确接收。这通常通过面向连接的协议(如TCP)来实现,TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...

Ubuntu 防火墙iptables和 ufw

文章目录 iptables 和 ufw 的区别Ubuntu 上使用 ufw 配置 iptables 和 ufw 的区别 iptables 和 ufw 是 Linux 系统中用于管理防火墙的工具,但它们的设计目标和使用方式有所不同。 iptables:功能强大,适合高级用户和复杂场景,但配…...