通过共现矩阵和余弦相似度实现机器对单词的认知、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

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

  1. (转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)

    转自:http://zengzhaozheng.blog.51cto.com/8219051/1557054 一.概述 这2个月为公司数据挖掘系统做一些根据用户标签情况对用户的相似度进行评估,其中涉及 ...

  2. 文本挖掘(part6)--共现矩阵

    学习笔记,仅供参考,有错必纠 文档信息的向量化 共现矩阵(Co-currence matrix) 共现矩阵概述 I like deep learning. I like NLP. I enjoy mo ...

  3. 词向量发展史-共现矩阵-SVD-NNLM-Word2Vec-Glove-ELMo

    话不多说,直接上干货. 首先介绍相关概念: 词嵌入:把词映射为实数域上向量的技术也叫词嵌入(word embedding). 词向量的分类表示: 一.共现矩阵 通过统计一个事先指定大小的窗口内的wor ...

  4. A股实践 :图神经网络与新闻共现矩阵策略(附代码)

    量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者,荣获202 ...

  5. 关键词提取一:构造共现矩阵

    因为TFIDF算法的提取关键词的准确性很差,tfidf提取出的关键词很难看出文本的主旨,于是考虑结合文本语义对词汇的权重(IDF)重新分配,于是想要借鉴SKE算法,即将词语语义特征融入关键词提取过程中 ...

  6. hadoop矩阵乘法源码_使用Hadoop计算共现矩阵

    hadoop矩阵乘法源码 这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列. 这次,我们将从文本语料库创建单词共现矩阵. 本系列以前的文章是: 使用Map ...

  7. 使用Hadoop计算共现矩阵

    这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列. 这次,我们将从文本语料库创建单词共现矩阵. 本系列以前的文章是: 使用MapReduce进行数据密集型 ...

  8. 使用PPMI改进共现矩阵

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

  9. Java共现矩阵的构建(用于社交网络结构分析)

    本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com . 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 背景 Java实现共现矩阵 程序运行 ...

最新文章

  1. linux6 yum安装mysql_linux CentOS6.5 yum安装mysql 5.6
  2. framebuffer
  3. 10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1
  4. django 操作MySQL 中文乱码_Django 连接mysql数据库中文乱码
  5. 为什么python输入中文变成竖的_Python中文竖排显示的方法
  6. python图片转字符_二十行python代码实现图片转字符
  7. RabbitMQ 镜像模式 集群架构 工作最常用集群
  8. 60-150-044-使用-Sink-Flink自定义RetractStreamTableSink
  9. linux不编译设备树,petalinux 编译时报设备树语义错误
  10. MySQL:Specified key was too long; max key length is 1000 bytes
  11. Redis(RedisTemplate)使用hash哈希
  12. 《ShowYou数组代码》第38题:对数组元素进行排序
  13. 正态分布及其概率计算
  14. 【Oracle】交差并补
  15. It is a distutils installed project and thus we cannot accurately determine [已解决]
  16. 使用PPT画图,取消自动选点(自动吸附点)解决方案
  17. 手工定制眼镜将风靡中国(lyy bros)
  18. 打工不如当老板,注册公司费用和步骤
  19. 在 UltraEdit 或 UEStudio 中执行 DOS 或 Windows 命令
  20. javaweb三大框架

热门文章

  1. c#生成一组不同的随机数的方法
  2. 华为交换机如何通过tftp服务器上传下载文件
  3. Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo
  4. 下载人脸认证助手_关于微信人脸解封验证失败方法
  5. 在html中怎么写背景色渐变,css3背景色渐变
  6. android背景不填充,(Android Studio)应用程序背景图像不填充屏幕
  7. php 查文件sha1 内存不足,SHA是否足以检查文件重复? (PHP中的sha1_file)
  8. 百度编辑器图片上传 java_百度编辑器粘贴图片自动上传到服务器(Java版)
  9. cmd文件 c语言的段,对于TMS320F2812的CMD文件的理解
  10. oracle 数据抽取 java_oracle数据抽取步骤