通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

    • 本文介绍的定义:
    • 一、语料库预处理
    • 二、单词的分布式表示
    • 三、单词的相似度
    • 四、相似单词排序

本文介绍的定义:

语料库、计数方法的目的、语料库预处理、单词的分布式表示、分布式假设、上下文、窗口大小、基于计数的方法表示单词、用向量表示单词、共现矩阵、单词的相似度、余弦相似度、相似单词排序。

一、语料库预处理

语料库:大量的文本数据。

计数方法的目的:从语料库中提取语言的本质。

语料库预处理:将文本分割为单词,并将分割后的单词列表转化为单词ID列表。实现代码如下,其中corpus 是单词ID列表,word_to_id 是单词到单词ID的字典,id_to_word是单词ID到单词的字典。

def preprocess(text):text = text.lower()text = text.replace('.', ' .')words = text.split(' ')word_to_id = {}id_to_word = {}for word in words:if word not in word_to_id:new_id = len(word_to_id)word_to_id[word] = new_idid_to_word[new_id] = wordcorpus = np.array([word_to_id[w] for w in words])return corpus, word_to_id, id_to_word

举个例子:

text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
print(corpus)
print(word_to_id)
print(id_to_word)

输出:

[0 1 2 3 4 1 5 6]
{'you': 0, 'say': 1, 'goodbye': 2, 'and': 3, 'i': 4, 'hello': 5, '.': 6}
{0: 'you', 1: 'say', 2: 'goodbye', 3: 'and', 4: 'i', 5: 'hello', 6: '.'}

二、单词的分布式表示

单词的分布式表示:颜色通过RGB三原色分别存在多少来表示,RGB这样的向量表示,可以更准确地指定颜色,颜色之间的关联性(是否是相似的颜色)也更容易通过向量表示来判断和量化。类似于颜色的向量表示方法运用到单词上,形成单词含义的向量表示,在自然语言处理领域,这称为分布式表示。

分布式假设:某个单词的含义由它周围的单词形成。单词本身没有含义,单词含义由它所在的上下文(语境)形成。

上下文:上下文是指某个单词的周围词汇。

窗口大小:将上下文的大小(即周围的单词有多少个)称为窗口大小。

基于计数的方法表示单词:如何基于分布式假设使用向量表示单词?可以在关注某个单词的情况下,对它的周围出现了多少次什么单词进行计数,然后再汇总,称为“基于计数的方法”。

用向量表示单词:向量表示的是每个单词的上下文(与窗口大小有关)所包含的单词的频数(出现次数)。

在这里插入图片描述

共现矩阵:如下图所示,汇总所有单词的向量表示的表格。

在这里插入图片描述

代码:

def create_co_matrix(corpus, vocab_size, window_size=1):'''生成共现矩阵:param corpus: 语料库(单词ID列表):param vocab_size:词汇个数:param window_size:窗口大小(当窗口大小为1时,左右各1个单词为上下文):return: 共现矩阵'''corpus_size = len(corpus)co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)for idx, word_id in enumerate(corpus):for i in range(1, window_size + 1):left_idx = idx - iright_idx = idx + iif left_idx >= 0:left_word_id = corpus[left_idx]co_matrix[word_id, left_word_id] += 1if right_idx < corpus_size:right_word_id = corpus[right_idx]co_matrix[word_id, right_word_id] += 1return co_matrix
C = create_co_matrix(corpus, vocab_size, window_size=1)
for i in range(7):print(C[i])

输出:

[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]

三、单词的相似度

单词的相似度:两个单词含义相近的程度。

前面通过共现矩阵将单词表示为了向量,如何测量向量间的相似度?有代表性的方法有向量内积、欧式距离、余弦相似度等。

余弦相似度:设有x、y两个向量,他们的余弦相似度公式如下。余弦相似度直观表示了两个向量在多大程度上指向同一方向,两个向量完全指向相同的方向时,余弦相似度为 1;完全指向相反的方向时,余弦相似度为 -1。

在这里插入图片描述

实现余弦相似度:需要解决除数为0问题,可以在执行除法时加上一个微小值。

实现代码:

def cos_similarity(x, y, eps=1e-8):'''计算余弦相似度:param x: 向量:param y: 向量:param eps: 用于防止“除数为0”的微小值:return:'''nx = x / (np.sqrt(np.sum(x ** 2)) + eps)ny = y / (np.sqrt(np.sum(y ** 2)) + eps)return np.dot(nx, ny)

例子:求you和i的相似度 。

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)c0 = C[word_to_id['you']]  #you的单词向量
c1 = C[word_to_id['i']]  #i的单词向量
print(cos_similarity(c0, c1))

输出:

0.7071067691154799

四、相似单词排序

相似单词排序:当某个单词被作为查询词时,将与这个查询词相似的单词按降序显示出来。

实现步骤:

1.取出查询词的单词向量:

query_id = word_to_id[query]
query_vec = word_matrix[query_id]

2.求查询词的单词向量和其他所有单词向量的余弦相似度。

vocab_size = len(id_to_word)
similarity = np.zeros(vocab_size)
for i in range(vocab_size):similarity[i] = cos_similarity(word_matrix[i], query_vec)

3.基于余弦相似度的结果,按降序显示它们的值。argsort()方法可以按升序对 NumPy 数组的元素进行排序,返回值是数组的索引。将 NumPy 数组的各个元素乘以 -1 后,再使用 argsort() 方法,可以按降序输出单词相似度。

	count = 0for i in (-1 * similarity).argsort():if id_to_word[i] == query:continueprint(' %s: %s' % (id_to_word[i], similarity[i]))count += 1if count >= top:return

完整代码:

def most_similar(query, word_to_id, id_to_word, word_matrix, top=5):'''相似单词的查找:param query: 查询词:param word_to_id: 从单词到单词ID的字典:param id_to_word: 从单词ID到单词的字典:param word_matrix: 汇总了单词向量的矩阵,假定保存了与各行对应的单词向量:param top: 显示到前几位'''if query not in word_to_id:print('%s is not found' % query)returnprint('\n[query] ' + query)query_id = word_to_id[query]query_vec = word_matrix[query_id]vocab_size = len(id_to_word)similarity = np.zeros(vocab_size)for i in range(vocab_size):similarity[i] = cos_similarity(word_matrix[i], query_vec)count = 0for i in (-1 * similarity).argsort():if id_to_word[i] == query:continueprint(' %s: %s' % (id_to_word[i], similarity[i]))count += 1if count >= top:return

例子:按降序显示与you最相似的前五个单词。

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)most_similar('you', word_to_id, id_to_word, C, top=5)

输出:结果和我们的感觉存在很大的差异。一个可能的原因是,这里的语料库太小了。

[query] yougoodbye: 0.7071067691154799i: 0.7071067691154799hello: 0.7071067691154799say: 0.0and: 0.0

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

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

相关文章

使用PPMI改进共现矩阵

使用PPMI改进共现矩阵 共现矩阵的元素表示两个单词同时出现的次数&#xff0c;这里的次数并不具备好的性质&#xff0c;举个例子&#xff0c;有短语叫the car&#xff0c;因为the是个常用词&#xff0c;如果以两个单词同时出现的次数为衡量相关性的标准&#xff0c;与drive 相…

基于SVD的降维优化

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

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

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

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

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

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

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

stm32使用DAP下载程序

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

stm32 NVIC EXTI

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

stm32 HSE HSI

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

stm32 SysTick

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

stm32 USART

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

robot 用AP连PC

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

robot连PCwifi、PC开Shell连robot

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

ROS配置分布式通信

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

ROS rqt、rviz

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

nvm node 安装与配置

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

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

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

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

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

CBOW模型的数据预处理

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

实现CBOW模型类

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

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

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