使用PPMI改进共现矩阵

使用PPMI改进共现矩阵

共现矩阵的元素表示两个单词同时出现的次数,这里的次数并不具备好的性质,举个例子,有短语叫the car,因为the是个常用词,如果以两个单词同时出现的次数为衡量相关性的标准,与drive 相比,the和car的相关性更强,这是不对的。

点互信息(Pointwise Mutual Information,PMI):表达式如下,P(x)表示x发生的概率,P(y)表示y发生的概率,P(x,y)表示x和y同时发生的概率。PMI的值越高,表明x与y相关性越强。

在这里插入图片描述

用共现矩阵重写PMI表达式:将共现矩阵表示为C,将单词X和Y的共现次数表示为C(x,y),将单词x和y的出现次数分别表示为C(x)、C(y),将语料库的单词数量记为N。表达式如下。

在这里插入图片描述

正的点互信息(Positive PMI,PPMI):当两个单词的共现次数为0时, log0=-∞。为解决这个问题,实践上会使用下述正的点互信息。可以将单词间的相关性表示为大于等于0的实数。

在这里插入图片描述

共现矩阵转化为PPMI矩阵的函数实现:代码中防止 np.log2(0)=-inf 而使 用了微小值 eps。

分析一下源码,函数里加一个print:

	M = np.zeros_like(C, dtype=np.float32)N = np.sum(C)S = np.sum(C, axis=0)total = C.shape[0] * C.shape[1]print(C)print(M)print(N)print(S)print(total)

输出如下,可见N是把共现矩阵C中所有数相加;M是维度和C相同的全为0的数组,用来存PPMI矩阵;S是记录每个词和别的词共现的次数,total是等于7*7,这个是输出进展情况时候用的,用来判断当前进度。

[[0 1 0 0 0 0 0][1 0 1 0 1 1 0][0 1 0 1 0 0 0][0 0 1 0 1 0 0][0 1 0 1 0 0 0][0 1 0 0 0 0 1][0 0 0 0 0 1 0]][[0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0.]]14[1 4 2 2 2 2 1]49

下面这句代码,S[j]和S[i]指的是i和j和别的词共现的次数,这里就知道了,代码的实现和PMI表达式定义其实还是有差别的,代码是在共现范围内判断两个词的相关性。举个例子,a和b共现了x次,b和其他人现了y次,a和其他人现了j次,群体中人的个数是n,那在这个群体里b和a现的程度就是(x * n)/(y * j) 。(‘现’理解成XO)。

pmi = np.log2(C[i, j] * N / (S[j]*S[i]) + eps)

完整代码:

def ppmi(C, verbose=False, eps = 1e-8):'''生成PPMI(正的点互信息):param C: 共现矩阵:param verbose: 是否输出进展情况:return:'''M = np.zeros_like(C, dtype=np.float32)N = np.sum(C)S = np.sum(C, axis=0)total = C.shape[0] * C.shape[1]cnt = 0for i in range(C.shape[0]):for j in range(C.shape[1]):pmi = np.log2(C[i, j] * N / (S[j]*S[i]) + eps)M[i, j] = max(0, pmi)if verbose:cnt += 1if cnt % (total//100 + 1) == 0:print('%.1f%% done' % (100*cnt/total))return M

例子:

text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
vocab_size = len(word_to_id)
C = create_co_matrix(corpus, vocab_size)
W = ppmi(C)np.set_printoptions(precision=3)  # 有效位数为3位
print('covariance matrix')
print(C)
print('-'*50)
print('PPMI')
print(W)

输出:PPMI矩阵各个元素均为大于等于0的实数。

covariance matrix
[[0 1 0 0 0 0 0][1 0 1 0 1 1 0][0 1 0 1 0 0 0][0 0 1 0 1 0 0][0 1 0 1 0 0 0][0 1 0 0 0 0 1][0 0 0 0 0 1 0]]
--------------------------------------------------
PPMI
[[0.    1.807 0.    0.    0.    0.    0.   ][1.807 0.    0.807 0.    0.807 0.807 0.   ][0.    0.807 0.    1.807 0.    0.    0.   ][0.    0.    1.807 0.    1.807 0.    0.   ][0.    0.807 0.    1.807 0.    0.    0.   ][0.    0.807 0.    0.    0.    0.    2.807][0.    0.    0.    0.    0.    2.807 0.   ]]

随着语料库词汇量增加,各个单词向量的维数也会增加,这个矩阵很多元素都是0,表明向量中的绝大多数元素并不重要,对于这些问题,一个常见的方法是向量降维。

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

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

相关文章

基于SVD的降维优化

基于SVD的降维优化 向量降维:尽量保留数据“重要信息”的基础上减少向量维度。可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下。 稀疏矩阵…

微变等效电路法分析放大电路

微变等效电路法分析放大电路本文介绍的定义一、简化的h参数微变等效电路1.静态工作点计算2.微变等效电路法估算电压放大倍数二、微变等效电路法应用本文介绍的定义 微变等效电路法、h参数微变等效电路、单管共射放大电路的微变等效电路、Rbe近似估算、微变等效电路法应用。 一…

分压式静态工作点稳定电路

分压式静态工作点稳定电路本文介绍的定义:一、静态工作点稳定问题二、分压式静态工作点稳定电路本文介绍的定义: 静态工作点稳定问题、温度对三极管参数的影响、分压式静态工作点稳定电路、电流负反馈式工作点稳定电路、旁路电容、静态分析、动态分析。…

双极型三极管共集电极、共基极放大电路

双极型三极管共集电极、共基极放大电路本文介绍的定义共集电极放大电路共基极放大电路本文介绍的定义 双极型三极管放大电路的接法、共集电极放大电路、射极跟随器、带负载能力、共基极放大电路、改善频率响应。 共集电极放大电路 接法:根据输入信号与输出信号公…

stm32使用DAP下载程序

jym认为,会下载程序等于学会stm32,hahaha。 首先点这个魔术棒 接下来进行下面的设置: 配置Debug选项 配置Utilities选项 配置Degug-setting选项 选择目标板,flash大小由板子芯片型号决定,勾选reset and run&#xff…

stm32 NVIC EXTI

stm32 NVIC EXTINVICEXTI原理图main.cexti.hexti.cstm32f10x_it.cNVIC NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器&#…

stm32 HSE HSI

stm32 HSE HSI时钟树main.cclkconfig.hclkconfig.c时钟树 HSE_SetSysClock和HSI_SetSysClock这两个函数就是根据上面这个时钟树编写的。 main.c 这个实验是通过HSE或者HSI配置系统时钟,结果就是,用HSE比HSI灯闪的快点,因为代码设置的是使用…

stm32 SysTick

SysTick是系统定时器,属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候&am…

stm32 USART

介绍的定义 串行通信、并行通信、全双工、半双工、单工、同步、异步、比特率、码元、波特率、TTL、RS232、DB9接口、DTE、DCE、协议层、USART、UART、CH340G芯片、USB。 通信基础 根据数据传送的方式,通讯可分为串行通讯与并行通讯。 串行通信:同一时…

robot 用AP连PC

1.启动机器人 2.PC找到机器人的热点,连接 3.看机器人分配的电脑ip 4.打开putty软件,下图里面是机器人的ip。然后点击open 。 5.输入机器人用户名和密码,现在已经登陆进去了。 6.输入ifconfig查看网络状况

robot连PCwifi、PC开Shell连robot

用网线将机器人和路由器连接,登录路由器管理界面,获取机器人 IP 地址。 打开Xshell,新建会话,主机设成机器人IP。 输入机器人用户名和密码 然后pc通过ssh连接上机器人 用ifconfig查看当前网络连接状态。有线连接是192.168.0.108&a…

ROS配置分布式通信

ROS配置分布式通信关键是,机器人和 PC 要处于同一网段。 虚拟机网络适配器设置成桥接。 ifconfig查看虚拟机和机器人端的网络连接状态,看是否处于一个网段。下面两图,说明机器人和 PC 都是一个网段。 互相Ping测试连通性。 修改PC端bashrc文…

ROS rqt、rviz

首先机器人端启动摄像头。 pc端用rqt_image_view就可以打开rqt工具,然后选择话题,就看到摄像头图像了。 下面是compressed话题和不是compressed话题的对比,这两个话题带宽有倍数级差异。 然后就可以用opencv做一些事情。下面这个其实就是机器…

nvm node 安装与配置

nvm Node Version Manager(NVM) 是一种用于管理多个主动节点.js版本的工具。 nvm官网下载地址 https://github.com/coreybutler/nvm-windows/releases 如果电脑上之前已经单独安装了node,先卸载(可以在控制面板里面卸载&#xf…

采用推理的方法认知单词、CBOW模型

基于计数的方法,根据一个单词周围的单词的出现频数来表示该单词。需要生成所有单词的共现矩阵,再对这个矩阵进行 SVD,以获得密集向量,如果语料库处理的单词数量非常大,将需要大量的计算资源和时间。基于计数的方法使用…

CBOW模型正向传播、矩阵乘积层实现

把矩阵乘积称为MatMul节点: 下面这个图表示矩阵乘积yxW的计算图 。因为考虑了mini-batch 处理,假设x中保存了N个数据。此时x 、W、y 的形状分别是 ND、DH 、NH 。 下面是推反向传播的数学式: 用代码表述MatMul层:params 中保存要…

CBOW模型的数据预处理

数据预处理:从语料库生成上下文和目标词。如下图所示,contexts 的各行成为神经网络的输入,target 的各行成为正确解标签(要预测出的单词)。 之前做过一个preprocess函数,将文本分割为单词,并将分…

实现CBOW模型类

初始化:初始化方法的参数包括词汇个数 vocab_size 和中间层的神经元个数 hidden_size。首先生成两个权重(W_in 和 W_out),并用一些小的随机值初始化这两个权重。设置astype(‘f’),初始化将使用 32 位的浮点数。 生成…

CBOW模型的学习、Trainer类的实现

CBOW 模型的学习的实现:给神经网络准备好学习数据。然后求梯度,并逐步更新权重参数。 Trainer类:学习的类。 初始化:类的初始化程序接收神经网络(模型)和优化器(SGD、Momentum、AdaGrad、Adam) 学习&…

stm32 I2C、EEPROM

main.c 硬件结构如下,EEPROM 芯片(AT24C02)的 SCL 及 SDA 引脚连接到了 STM32 的 I2C 引脚中,结合上拉电阻,构成了 I2C 通讯总线,它们通过 I2C 总线交互。 EEPROM 芯片的设备地址:一共有 7 位,其中高 4 位…