深度学习进阶-自然语言处理-04-基于计数的方法(上)

news/2024/5/21 15:53:46/文章来源:https://blog.csdn.net/fuxun222/article/details/127148926

语料库:大量的文本数据

        语料库通常采用树的结构,我们这里的与料理假定没有添加任何标签,在实际项目中,一般都会给文本数据添加标签(如,词性)

1 语料库的预处理

步骤一:创建单词列表

#样本文章
text ='You say goodbye and I say hello.'
#将所有字母改为小写字母
text =text.lower()
text
#将之后的句号之前加一个空格
text =text.replace('.',' .')
text
#通过空格来分割词语
words =text.split(' ')
words
type(words)

 步骤二:给单词标上ID,以便使用单词ID列表。

        为此,我们使用Python的字典来创建单词的对应表

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]=word

步骤三:将单词列表转化为单词ID表

corpus=[]
for w in words:print(word_to_id[w])corpus.append(word_to_id[w])
import numpy as np
corpus=np.array(corpus)

步骤四:将预处理的代码封装成函数

import numpy as np
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]=wordpasspasscorpus =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.'
preprocess(text)

2 单词的分布式表示

单词的分布式表示是把单词表示为固定长度的向量。

分布式假设:“某个单词的含义由它周围的单词形成”

窗口大小为1:上下文包含左右各1个单词

窗口大小为2:上下文包含左右各2个单词

补充:也可以仅将左边的单词或右边的单词作为上下文,也可以考虑句子分隔符的上下文,但是在本篇专栏中不考虑这些

共现矩阵:以窗口大小为1为例,我们看看它的共现矩阵

yousaygoodbyeandihello..
you0100000
say1010110
goodbye0101000
and0010100
i0101000
hello0100001
.0000010

2.1. 动输入共现矩阵:

C = np.array([[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],
], dtype=np.int32)
text ='You say goodbye and I say hello.'
corpus,word_to_id,id_to_word=preprocess(text)
print(C[word_to_id['goodbye']])

2.2 从语料库自动化生成共现矩阵

# corpus 单词的ID列表
# vocab_size 词汇的不重复个数
# 窗口大小
def create_co_matrix(corpus, vocab_size, window_size=1):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   

2.3  向量间的相似度

余弦相似度:

        similarity(x,y)=\frac{x\cdot y}{\left \| x \right \| \left \| y \right \|}

分子是点乘,分母是二范数相乘。

两个向量方向相同时,余弦相似度为1,完全相反时为-1

我们将公式用代码表示为:

def cos_similarity(x,y):nx=x/np.sqrt(np.sum(x**2))ny=y/np.sqrt(np.sum(y**2))return np.dot(nx,ny)

补充:当出现除数为0的时候如何做:

        在执行除法前给除数加上一个很小的值eps=1e-8 

修改后余弦相似度的代码:

def cos_similarity(x,y,eps=1e-8):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(id_to_word)
C=create_co_matrix(corpus,vocab_size)
c0 = C[word_to_id['you']]
c1 = C[word_to_id['i']]
print(cos_similarity(c0,c1))

答案:0.7071067811865475

可以说非常相似了。

2.4 相似单词的排序

def most_similar(query,word_to_id,id_to_word,word_martix,top=5):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_martix[query_id]#计算余弦相似度vocab_size =len(id_to_word)similarity =np.zeros(vocab_size)for i in range(vocab_size):similarity[i]=cos_similarity(word_martix[i],query_vec)count=0pass#基于余弦相似度,按照降序输出值for 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
word_martix=create_co_matrix(corpus,7)
query=id_to_word[1]
most_similar(query,word_to_id,id_to_word,word_martix)
[query]say
and:0.7071067811865475
.:0.5
you:0.0
goodbye:0.0
i:0.0

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

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

相关文章

JavaScript学习笔记:Navigator

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script>// BOM// 浏览器对象模型// BOM可以使我们通过js来操作浏览器// 在BOM中为我们提供了一组对象&#xff0c;用来完成对浏览器的操作// BOM对象/…

基本控件案例集锦(下)

基本控件案例集锦&#xff08;下&#xff09; DatePicker&#xff0c;TimePicker&#xff0c;AlertDialoig 1.DatePicker 1.1简介 1.简介&#xff1a; Android为用户提供显示日期与时间的控件DatePicker和TimePicker。 日期选择控件(DatePicker)主要功能是向用户提供包含年…

JS面向对象之构造函数和原型(2)

文章目录1.构造函数1-1.使用构造函数面向对象1-2.构造函数里面的原型prototype1-3.对象原型__proto__1-4.constractor构造函数1-5.构造函数、实例、原型对象三者之间的关系1.构造函数 1-1.使用构造函数面向对象 ES6之前对象的公共部分&#xff0c;不是使用类解决的&#xff0…

沉睡者IT - [短视频运营] 抖音短视频成SEO新风口

下面会从以下5个企业关心的问题来聊聊&#xff0c;如果有什么不明白的地方可以评论交流。 一、什么是SEO? 二、为什么要做抖音SEO? ​三、哪些企业适合做抖音SEO? 四、抖音SEO怎么做? 五、影响抖音排名的因素有哪些? 一、什么是SEO? SEO是“搜索引擎优化”英文单词首字母…

C++ 函数学习笔记

前言&#xff1a;主要是自己学习过程的积累笔记&#xff0c;所以跳跃性比较强&#xff0c;建议先自学后拿来作为复习用。 文章目录1 函数基础2 参数传递2.1 const 形参和实参2.2 引用形参2.3 数组形参2.4 数组引用形参2.5 多维数组形参2.6 可变形参3 返回类型和 return 语句3.1…

ASP.NET Core--依赖注入

文章目录依赖注入什么是依赖注入什么是依赖什么是注入依赖注入解决的问题.Net Core DI替换默认服务容器依赖注入 什么是依赖注入 什么是依赖 Rely类 public class Rely {public Task Test(string testMessage){Console.WriteLine(testMessage);return Task.FromResult(0);}…

【QT学习】如何绘制圆角窗口?

文章目录前言一、实现效果二、基础知识1.QBitmap类2.QPainter类3.setMask函数三、实现代码总结前言 在使用QT创建窗口时&#xff0c;所创建出来的默认窗口都是矩形的。当我们隐藏默认标题栏&#xff0c;想自己绘制自定义的标题栏时&#xff0c;就会发现矩形的窗口过于棱角分明。…

加深印象篇之Servlet

环境配置 需要配置web.xml文件,如图所示: userServlet:是指那个继承自HttpServlet的.java文件的名称 index.jsp:是指那个随意一个.jsp文件名称即可 要使用到Servlet相关类,需要提前将相关导包导入到pom.xml文件中 相关文件的编写 1、JDBCUtils.java文件(存储连接数据库的…

(附源码)计算机毕业设计ssm大数据学院图书管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

web前端面试题附答案016-怎么让顶部轮播图渲染的更快?

一、为什么强调轮播图&#xff1f; 很多时候我们强调用户体验&#xff0c;而这里更多时候我们更强调完美的首屏体验&#xff0c;而现在几乎每个网站顶部第一个大模块就是轮播图。轮播图占得区域最大&#xff0c;图片质量也更高&#xff0c;几乎一张图片的面积&#xff0c;体积就…

【C语言】结构体字节对齐

目录 前言 一、什么是字节对齐&#xff1f; 二、结构体字节对齐 三、#pragma pack()的使用 总结 结语 封面 前言 本教程可能会用到一点汇编的知识&#xff0c;看不懂没关系&#xff0c;知道是那个意思就行了。使用的工具是vs2010。 一、什么是字节对齐&#xff1f; 字节…

【易购管理系统】商品列表

我们来写一下商品管理界面 在Goods.vue中 <template><div><!-- 1.搜索区域 --><div class"header"></div><!-- 2.表格区域展示视图数据 --><div class"wrapper"></div><!-- 3.分页 --></div&g…

数据分析3-pandas

文章目录pandaspandas常用数据类型1.Series的创建pandas读取外部数据pandas读取数据库DataFrame基础字典列表排序索引loc与iloc字符串离散化数据的合并pandas pandas常用数据类型 Series一维数据&#xff0c;带标签数组 DataFrame 二维&#xff0c;Series容器 import pandas …

【ElasticSearch】(分组统计,自动补全,数据同步)

分组统计&#xff0c;自动补全&#xff0c;数据同步1.分组统计1-1.聚合为桶1-2.桶内度量2.RestAPI结果条件过滤数据同步安装MQ声明交换机、队列发送MQ消息接收MQ消息搭建集群修改系统配置集群状态监控1.分组统计 桶(bucket): 桶的作用&#xff0c;是按照某种方式对数据进行分…

关苏哲-洞察问题本质,解决工作难题

高效管理者的三大技能 问题界定的6个问题 1.你所需要解决的问题是什么&#xff1f; 2.你为什么需要解决这个问题&#xff1f; 3.你期待的理想结果是什么&#xff1f; 4.这个问题包括哪些子问题&#xff1f; 5.你曾经尝试过哪些解决方式&#xff1f;其他人呢&#xff1f; 6.这个…

(机器学习-深度学习快速入门)第二章数据分析基本工具正则表达式

文章目录一&#xff1a;说明二&#xff1a;正则表达式学习建议三&#xff1a;Python正则表达式简要说明&#xff08;1&#xff09;基本匹配&#xff08;2&#xff09;元字符①&#xff1a;.号②&#xff1a;字符集③&#xff1a;重复次数④&#xff1a;{}号⑤&#xff1a;(...)…

Spring(二)- 工厂高级

八&#xff1a;控制Spring工厂创建对象的次数 为什么要控制对象创建的次数 &#xff1f; 好处&#xff1a;节省不必要的内存浪费 &#xff01; 九&#xff1a;对象的生命周期 1.什么是对象的生命周期 指的是一个对象创建&#xff0c;存活&#xff0c;消亡的一个完整过程 2.…

基于朴素贝叶斯算法对肿瘤类别分类

目录 朴素贝叶斯算法​编辑 朴素贝叶斯的三种方式 实战——肿瘤类别的分类 朴素贝叶斯算法 贝叶斯定理 贝叶斯定理&#xff08;Bayes Theorem&#xff09;也称贝叶斯公式&#xff0c;是关于随机 事件的条件概率的定理 定理内容&#xff1a; 如果随机事件A1 ,A2 ,...,An构成…

【177】Java利用JNI调用C++编写的DLL,连接海康人脸抓拍机,实现人脸库全量更新。

C开发环境&#xff1a;Visual Studio 2022、windows10 Java开发环境&#xff1a;Java8、idea、windows10 这个DLL功能&#xff0c;是输入一个设备IP&#xff0c;删除设备中的所有以前的人员资料&#xff0c;然后用文件夹中XML和图片的新人脸库资料上传到设备的人脸库中。相当于…