【Python机器学习】NLP词频背后的含义——奇异值分解

目录

左奇异向量U

奇异值向量S

右奇异向量

SVD矩阵的方向

主题约简


奇异值分解是LSA背后的算法。我们从一个小规模的语料库开始:

from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models,prettify_tdmbow_svd,tfidf_svd=lsa_models()
print(prettify_tdm(**bow_svd))

上面是一个文档-词项矩阵,其中的每一行都是文档对应的词袋向量。

这里我们限制了词汇表的大小,同时,我们将语料库限制为仅包含11篇使用了词汇表中的6个词的文档。但是,排序算法和大小有限的词汇表创建了几个完全相同的词袋向量。但是SVD应该能够“看到”这一点,并将主题分配给这对词。

下面首先在词项-文档矩阵(上述文档-词项矩阵的转置矩阵)上使用SVD,但是SVD也适用于TF-IDF矩阵或者任何其他向量空间模型:

tdm=bow_svd['tdm']
print(tdm)

SVD是一种可以将任何矩阵分解成3个因子矩阵的算法,而这3个因子矩阵可以相乘来重建原始矩阵。这类似于为一个大整数找到恰好3个整数因子,但是这里的因子不是标量整数,而是具有特殊性质的二维实矩阵。通过SVD计算出的3个因子矩阵具有一些有用的数学性质,这些性质可以用于降维和LSA。在这里,我们将使用它为LSA计算出主题(相关词的组合)。

无论是在基于词袋的词项-文档矩阵还是基于TF-IDF的词项-文档矩阵上运行SVD,SVD都会找到属于同类的词组合。SVD通过计算词项-文档矩阵的列(词项)之间的相关度来寻找那些同时出现的词。SVD能同时发现文档间词项使用的相关性和文档之间的相关性。利用这两条信息,SVD还可以计算出语料库中方差最大的词项的线性组合。这些词项频率的线性组合将成为我们的主题。我们将只保留那些在语料库中包含信息最多、方差最大的主题。SVD同时也提供了词项-文档向量的一个线性变换(旋转),它可以将每篇文档的向量转换为更短的主题向量。

SVD(LSA的核心)用数学符号表示如下:

W_{m*n}\Rightarrow U_{m*p}S_{p*p}V_{p*n}^{T}

在上式中,m为词汇表中的处词项数量,n为语料库中的文档数量,p为语料库中的主题数量。我们希望最终得到比词数更少的主题,因此可以使用这些主题向量(主题-文档矩阵的行)最为原始TF-IDF向量的降维表示。最终我们会得到这个结果。

左奇异向量U

U矩阵包含词项-主题矩阵,它给出此所具有的上下文信息。这是NLP中最重要的用于语义分析的矩阵。U矩阵称为“左奇异向量”,因为它包含一系列行向量,这些行向量必须左乘列向量组成的矩阵。基于词在同一文档中的共现关系,U给出了词与主题之间的相互关联。在截断(删除)之前,它是一个方阵,其行数和列数与词汇表中的次数(m)相同,在上面的例子中都是6。

以下面的代码,这里仍然得到6个主题(主题数目为p),因为我们还没有截断这个矩阵:

import numpy as np
import pandas as pd
U,s,Vt=np.linalg.svd(tdm)
print(pd.DataFrame(U,index=tdm.index).round(2))

要注意,SVD算法是一个基本的numpy数学运算,并非一个精巧的scikit-learn机器学习算法。

U矩阵包含所有的主题向量,其中每一列主题向量对应语料库中的一个词。这意味着它可以用作一个转换因子,将词-文档向量(TF-IDF向量或词袋向量)转换为主题-文档向量。我们只需将U矩阵(主题-词矩阵)乘以任何词-文档列向量,就可以得到一个新的文档-主题向量,这是因为U矩阵中每个元素位置上的权重或得分,分别代表每个词对每个主题的重要程度。

奇异值向量S

Sigma或S矩阵是一个对角方阵,其对角线上的元素主题即“奇异值”。奇异值给出了在新的语义(主题)向量空间中每个维度所代表的信息量。对角矩阵只有在从左上角到右下角的对角线上才包含非零值,而S矩阵的其余元素都是0,因此,numpy通过以数组的形式返回奇异值来节省空间,但是也可以使用numpy.diag函数轻松将其转换为对角矩阵:

print(s.round(1))
S=np.zeros((len(U),len(Vt)))
np.fill_diagonal(S,s)
print(pd.DataFrame(S).round(1))

同U矩阵一样,6个词6个主题的语料库的S矩阵有6行(p),但是它有很多列(n)都是0。每篇文档都需要一个列向量来表示,这样就可以将S乘以文档-文档矩阵V^{T}。因为目前还没有通过截断该对角矩阵来降维,所以词汇表中的词项数就是主题数6(p)。这里的维度(主题)的构造:第一个维度包含关于语料库的最多信息,这样,当想要截断主题模型时,可以一开始将右下角的维度归零,然后往左上角移动。当截断主题模型造成的错误开始对整个NLP流水线错误产生显著影响时,就可以停止将这些奇异值归零。

在大多数情况下,最好将S矩阵的对角线元素设置为1,从而创建一个矩阵单位矩阵,它只是重塑了V^{T}文档-文档矩阵,使之兼容于U词-主题矩阵。这样,如果将这个S矩阵乘以一些新的文档向量集,就不会使主题向量向原始主题组合(分布)倾斜。

右奇异向量V^{T}

V^{T}是一个文档-文档矩阵,其中每一列式“右奇异向量”。该矩阵将在文档之间提供共享语义,因为它度量了文档在新的文档语义模型中使用相同主题的频率。它的行数(p)和列数与小型语料库中的文档数相同,都是11:

print(pd.DataFrame(Vt).round(2))

就像S矩阵一样,当把新的词-文档向量转换成主题向量空间时,可以忽略V^{T}矩阵。我们仅仅使用V^{T}来检查主题向量的准确性,以重建用于“训练”该矩阵的原始词-文档向量。

SVD矩阵的方向

相对于在scikit-learn和其他软件包中的内容,这里的词项-文档矩阵时“翻转”(转置)的。

在朴素贝叶斯情感模型和TF-IDF向量中,我们将训练集创建为一个文档-词项矩阵,这就是scikit-learn模型所需要的方向。机器学习训练集对应的样本-特征矩阵中的每一行都是一篇文档,而每一列都代表该文档的一个词或特性。但是要直接进行SVD线性代数运算时,矩阵需要转换成词项-文档格式。

在训练机器学习模型之前,要将词项-文档矩阵或主题-文档矩阵转回到scikit-learn中规定的方向。在scikit-learn中,NLP训练集中的每一行都应该包含和文档(电子邮件、短消息等)相关的特征向量。在NLP训练集中,向量是行向量,而在传统的线性代数运算中,向量通常被认为是列向量。

主题约简

现在有一个主题模型,它可以将词频向量转换为主题权重向量。但是因为主题数和词数一样多,所以得到的向量空间模型的维数和原来的词袋向量一样多。刚刚创建了一些新词并把它们命名为主题,因为它们以不同的比例将词组合在一起。到目前为止,还没有减少维数。

这里可以忽略S矩阵,因为U矩阵的行和列已经排列妥当,以使最重要的主题(具有最大的奇异值)都在左边,可以忽略S矩阵的另一个原因是:将在此模型中使用的大部分词-文档向量(如TF-IDF向量),都已经进行了归一化处理。最后,如果这样设置的话,它只会生成更好的主题模型。

因此,我们开始砍掉U右边的列。度量LSA精确率的一种方法是看从主题-文档矩阵重构词项-文档矩阵的精确率如何。下面代码演示了SVD的9词项11文档矩阵的重构精确率:

err=[]
for numdim in range(len(s),0,-1):S[numdim-1,numdim-1]=0reconstructed_tdm=U.dot(S).Dot(Vt)err.append(np.sqrt(((reconstructed_tdm-tdm).values.flatten()**2).sum()/np.product(tdm.shape)))
print(np.array(err).round(2))

当使用奇异向量为11篇文档重构词项-文档矩阵时,截断的内容越多,误差就越大。

下图展示了随着主题模型丢弃的维度越来越多,精确率不断下降的情况:

无论在模型中使用TF-IDF向量还是词袋向量,精确率下降的趋势都非常相似。但是,如果计划在模型中只保留几个主题的话,使用TF-IDF向量的效果会稍好一些。

在某些情况下,在去掉了词项-文档矩阵中的几个维度之后,可能会获得完美的准确率。

LSA背后的SVD算法会“注意”到某些词总在一起使用,并将它们放在一个主题中。这就是它可以“无偿”获得几个维度的原因。即使不打算在流水线中使用主题模型,LSA(SVD)也可以是为流水线压缩词-文档矩阵已经识别潜在复合词或n-gram的一种好方法。

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

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

相关文章

如何消除工人们对TPM管理培训的抵触情绪?

在探讨如何消除工人们对TPM管理培训抵触情绪的问题时,我们首先需要深入理解这种抵触情绪的根源,进而设计出一套既科学又人性化的策略来逐步化解。TPM作为一种旨在通过全员参与,实现设备综合效率最大化的管理模式,其成功实施离不开…

kube-scheduler调度策略之预选策略(三)

一、概述 摘要:本文我们继续分析源码,并聚焦在预选策略的调度过程的执行。 二、正文 说明:基于 kubernetes v1.12.0 源码分析 上文我们说的(g *genericScheduler) Schedule()函数调用了findNodesThatFit()执行预选策略。 2.1 findNodesTha…

新手使用住宅代理有哪些常见误区?

作为新手,在使用住宅代理时往往会陷入一些常见误区,这些误区不仅可能影响到使用效果,甚至可能会带来安全风险。今天将与大家探讨新手在使用住宅代理时可能会遇到的几个关键误区,并提供相应的解决方案。误区一:盲目追求…

Spike-in:微生态16S扩增子绝对定量重磅上线!

16S扩增子测序是一种广泛应用于微生物群落分析的技术,主要用于研究环境样本中微生物的种类、丰度及其生态关系。 然而,传统的16S扩增子测序通常只能提供相对丰度数据,无法准确反映样本中各微生物的绝对数量,导致在一定程度上掩盖…

LACP链路聚合

链路聚合包含两种模式:手动负载均衡模式和LACP(Link AggregationControl Protocol)模式。 手工负载分担模式:Eth-Trunk的建立、成员接口的加入由手工配置,没有链路聚合控制协议的参与。该模式下所有活动链路都参与数…

如何在 MySQL 中匹配列

在 MySQL 中,匹配列可以通过多种方式实现,具体取决于你要执行的操作类型。常见的列匹配操作包括条件查询、JOIN操作、字符串匹配等。以下是具体解决的几种方式。 1、问题背景 在 MySQL 中,可以使用 “” 运算符来匹配列。例如: …

中断处理流程举例(21)

中断流程的截图: 下面主要就是解释这张图: 当中断发生之后,首先是硬件,保存CPSR到SPSR,设置CP&…

用MATLAB 画一个64QAM的星座图

由于QAM采用幅度和相位二维调制,其频谱效率大大提高,而且不同点的欧式距离也要大于调幅AM调制方式,QAM也是LTE和5G NR首选的调制方式,本期教大家画一个64QAM的星座图。 如下: 首先产生一个64QAM的调制数据&#xff0…

【windows】windows 如何实现 ps aux | grep xxx -c 统计某个进程数的功能?

windows 如何实现 ps aux | grep xxx -c 统计某个进程数的功能? 在Windows中,要实现类似Linux中ps aux | grep xxx -c的功能,即统计某个特定进程的数量,可以使用PowerShell或命令提示符(cmd.exe)来实现。 …

【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容

一、引言: 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划,是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析(一&#xff…

SQL-多表查询

1、多表关系 一对多、多对一:在多的一方建立外键,指向一的一方。 多对多:至少两个外键,通过中间表维护。 一对一 2、多表查询概述 3、内连接 4、外连接 5、自连接 6、联合查询 7、子查询 8、多表查询案例 # 1、多表关系 #…

【EtherCAT】运行原理

目录 1、有个兄弟提了个问题,如下: 2、EtherCAT运行原理 1、有个兄弟提了个问题,如下: “您好,在这篇文章中https://blog.csdn.net/qq_46211259/article/details/139824335 EtherCAT的数据区有三个子报文&#xff0c…

IP SSL证书——为IP升级加密

在数字化浪潮中,每一份数据传输都承载着重要信息与价值。当您的业务跨越国界,触及全球用户时,确保通信安全、提升品牌信任度,成为了不可或缺的一环。IP SSL证书,作为网络安全的守护者,正以其独特的优势&…

【达梦数据库】DBeaver连接达梦数据库

打开 DBeaver&#xff0c;新建驱动管理器 新建驱动管理器&#xff0c;配置信息如下 添加库文件&#xff0c;jar包使用项目上使用的jdbc驱动包即可&#xff0c;找到本地maven仓库jar位置进行添加。 <dependency><groupId>com.dameng</groupId><artifact…

NLP从零开始------文本中阶序列处理之语言模型(完整版)

语言模型( language model) 用于计算一个文字序列的概率&#xff0c; 评估该序列作为一段文本出现在通用或者特定场景中的可能性。每个人的语言能力蕴涵了一个语言模型&#xff0c;当我们说出或写下一段话的时候&#xff0c;已经在不自觉地应用语言模型来帮助我们决定这段话中的…

【C++】vector(下)--下篇

个人主页~ vector&#xff08;上&#xff09;~ vector&#xff08;下&#xff09;–上篇~ vector 二、模拟实现3、test.cpptest1test2test3test4test5test6 三、一个难题 二、模拟实现 3、test.cpp test1 这个没啥好说的&#xff0c;就是尾插和迭代器都能正常使用 //测尾…

微电网光储充用什么电能表?

背景 在可再生能源的需求不断增加&#xff0c;以及能源转型的推进&#xff0c;储能技术的重要性日益凸显。储能计量表作为储能系统的关键组成部分&#xff0c;对于监测、评估和管理储能系统性能具有重要作用。 在新能源发电领域&#xff0c;如分布式光伏、风电等&#xff0c;…

面相对象的成员介绍

2.面相对象的成员 -> 类: a.类的定义&#xff1a; 1.类是对公共特点的抽象&#xff0c;其中包含了很多成员&#xff0c;如属性&#xff08;成员变量 &#xff09;、方法、构造器等.要想很好的定义类&#xff0c;就必须要好好的了解这些类的成员 b.访问修饰符 控制属性的…

TCP数据包——报文头部组成

TCP协议报头包括以下字段: 源端口和目标端口:分别是发送方和接收方的端口号,用于标识通信的应用程序。 序列号:用于标识数据流的序列号,保证数据包的顺序性。每一个报文都有一个序列号。 确认号:用于确认收到的数据包序列号,用于实现可靠传输。每发送一个数据包都需要收…

突破编程 C++ 设计模式(组合模式)详尽攻略

在软件开发中&#xff0c;设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性&#xff0c;还能帮助团队更好地进行协作。在这篇文章中&#xff0c;我们将深入探讨组合模式——一种结构型设计模式。 组合模式允许你将对象组合成树形结…