【一起入门NLP】中科院自然语言处理作业二:中英文语料训练CBOW模型获得词向量(pytorch实现)【代码+报告】
目录
一、CBOW模型
二、程序说明
1.输入与预处理模块
2.训练模块
参数设置
模型结构
训练过程
3.测试模块
4.输出处理模块
5.可视化模块
三、实验结果
中文结果可视化:
英文结果可视化:
四、疑问与思考
1.cbow模型与词向量是什么关系
2.keras如何实现cbow
3.jieba分词:
4.关于训练负样本的问题
5.为什么中文语料要加载停用词
学校自然语言处理第二次大作业,训练中英文语料获得词向量,那我们开始吧~、
作业要求:选一种词向量模型,训练一份中文语料以及一份英文预料,提交报告以及词向量训练结果
代码链接:https://download.csdn.net/download/qq_39328436/41932914
代码结构/使用说明:
- data文件夹中存储语料(中文语料以及英文语料由老师提供,另一份为中文停用词语料)
- output文件夹中存储输出的词向量文件
- script文件夹中为CBOW的脚本,同时处理中文语料与英文语料
- 运行步骤:在脚本中确定训练中文或者是英语后,直接运行即可
一、CBOW模型
连续词袋模型(continuous bag of words, CBOW)
- 模型结构:
- 模型训练过程:
- 当前词的上下文词的one-hot编码(1*V:V表示不同的词语数量)送入输出层
- 这些词分别乘以同一个矩阵W1后,分别得到各自的1*N向量(这个就是词向量,N是降维之后的维度)
- 这些1*N向量相加取平均,得到一个新的1*N向量
- 将这个1*N向量乘矩阵W2得到一个1*V向量\
- 将这个1*Vsoftmax归一化之后输出每个词的概率向量1*V
- 将概率值最大的数对应的词作为预测值\
- 将预测结果的1*V向量,与真实标签的1*V向量计算误差
- 在每次向前传播之后反向传播误差,不断调整W1和W2矩阵的值
- 用CBOW训练词向量,想得到的是W1这个V*N的矩阵。当我们要查某个词向量的时,只需要和W1相乘就能得到结果。
二、程序说明
1.输入与预处理模块
相较于英文语料,加载中文语料时需要过滤一遍停用词,这是因为中文语料中会出现较多的特殊符号以及语气助词,例如:“啊,哎呀,哎哟”等,这些词语会干扰训练。
另外处理中文语料的一个难点是分词,即将一句话如“我超级想学习”,分割成“我 超级 想 学习”,常用的分词方法是jieba结巴分词(在本篇报告的最后一部分有介绍),由于提供的中文语料已经完成了分词操作,因此这边不再赘述。
读入数据之后还需要将其处理以便于训练,在第一部分在对CBOW的介绍中有提到这个模型是根据周围词来预测中心词,因此周围词是输出,中心词是标签。需要按照{[w1,w2,w4,w5],"label"}的格式构造一个词表,如:“the present food surplus can specifically.....”,可以构造(['the', 'present', 'surplus', 'can'], 'food') 以及(['present', 'food', 'can', 'specifically'],'surplus')可以理解为一个滑动窗口的机制,至于窗口多大根据训练要求确定的。
2.训练模块
参数设置
模型结构
class CBOW(nn.Module): def __init__(self, vocab_size, embedding_dim): super(CBOW, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.proj = nn.Linear(embedding_dim, 128) self.output = nn.Linear(128, vocab_size) def forward(self, inputs): embeds = sum(self.embeddings(inputs)).view(1, -1) out = F.relu(self.proj(embeds)) out = self.output(out) nll_prob = F.log_softmax(out, dim=-1) return nll_prob |
训练过程
for epoch in trange(epochs): total_loss = 0 for context, target in tqdm(data): context_vector = make_context_vector(context, word_to_idx).to(device) # 把训练集的上下文和标签都放到cpu中 target = torch.tensor([word_to_idx[target]]) model.zero_grad() # 梯度清零 train_predict = model(context_vector) # 开始前向传播 loss = loss_function(train_predict, target) loss.backward() # 反向传播 optimizer.step() # 更新参数 total_loss += loss.item() losses.append(total_loss) |
3.测试模块
由于实验不要求模型的准确率,所以测试模块仅做简单的预判。模型输出最大值即为预测值的下标。
4.输出处理模块
词向量矩阵中某个词的索引所对应的那一列即为所该词的词向量,将生成的词向量结果将保存在txt文件中,每一个词都由100维(100个浮点数)表示。
5.可视化模块
词向量设定为100维度,为将词向量进行可视化,首先要将维度降到2维,以便在坐标系中进行表示,用到的降维方法为PCA。考虑到可视化的效果,只取1000个词进行可视化。另外,为了将中文标签正确在figure中显示,需要设置plt.rcParams['font.sans-serif'] = ['SimHei'] 。
三、实验结果
中文结果可视化:
英文结果可视化:
四、疑问与思考
1.cbow模型与词向量是什么关系
词向量矩阵是CBOW模型的参数,CBOW本身的作用是用来进行中心词预测,当模型训练好了之后,说明参数矩阵经过损失传播调整以及优化后也收敛到了最佳状态,对于目标语料产生了最佳的词向量表示。
2.keras如何实现cbow
从零开始学自然语言处理(二)——手把手带你用代码实现word2vec
3.jieba分词:
4.关于训练负样本的问题
那为什么我们的代码中没有负样本一说呢,这是由于本次实验的目标是并不是测试模型效果,并且模型的规模也有限。
5.为什么中文语料要加载停用词
【一起入门NLP】中科院自然语言处理作业二:中英文语料训练CBOW模型获得词向量(pytorch实现)【代码+报告】相关推荐
- NLP【05】pytorch实现glove词向量(附代码详解)
上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...
- NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化、过程全记录
NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化 目录 输出结果 代码设计思路 代码运行过程全记录 输出结果 代码设计思路 代码运行过程全记录 3081 or ...
- 【一起入门NLP】中科院自然语言处理作业四:RNN+Attention实现Seq2Seq中英文机器翻译(Pytorch)【代码+报告】
这里是国科大自然语言处理的第四次作业,同样也是从小白的视角解读程序和代码,现在我们开始吧(今天也是花里胡哨的一天呢
- 企业隐患排查文本挖掘比赛(二):算法篇(从词向量到BERT)
1.文本挖掘的历程 对于NLP问题,首先要解决的是文本表示的问题.虽然人能够清楚地了解文本的含义,但是计算机只能处理数值运算,因此首先要考虑如何将文本转化为数值. 1.1 向量表示 1.1.1 词袋模 ...
- NLP发展大事记:顶会,预训练大模型,BERT系列
文章目录 1. NLP发展重要时间线 时间线 2. NLP以BERT发展的延伸 3. NLP领域顶会 1. NLP发展重要时间线 聊聊NLP那些大事儿,预训练大模型大势所趋. 时间线 Transfor ...
- 【一起入门NLP】中科院自然语言处理作业五:BiLSTM+Attention实现SemEval-2010 Task 8上的关系抽取(Pytorch)【代码+报告】
这里是国科大自然语言处理的第五次作业(终于是最后一次作业了,冲!),本篇博客是记录对论文:Attention-Based Bidirectional Long Short-Term Memory Ne ...
- torchtext处理文本数据——使用自己的word2vec模型作为词向量建立词表(学习二)
首先复制上一篇博客的完整代码,代码如下: 注:如果有不明白的地方请参考上一篇博客--torchtext处理文本数据--构造dataset读取文本(学习一) 数据源和解释都在上一篇博客中 from to ...
- 【NLP】第4章 从头开始预训练 RoBERTa 模型
- 机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)
目录 理论知识准备 构造文本特征向量 TF-IDF 值 sklearn中TfidfVectorizer 代码实例 CountVectorizer() 代码实操 Word2Vec 代码案例 总结 每文一 ...
- 学习笔记(06):自然语言处理Word2Vec视频学习教程-使用gensim构建word2vec词向量
立即学习:https://edu.csdn.net/course/play/5226/106444?utm_source=blogtoedu word2vec size 50 300 特征向量维度
最新文章
- python配置opencv最简单_(Python)从零开始,简单快速学机器仿人视觉Opencv—第二节:OpenCV的视频操作...
- debug assertion failed!报错
- 如何将某个groupbox中的数据赋值到另一个groupbox_React中的数据和数据流
- android+jni+构造函数,在JNI中调用构造函数失败Android
- C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别
- 软件工程概论 课堂练习 第2次作业5【顺序图思考题——绘制手机拨号顺序图】
- 前端学习(1730):前端系列javascript之发布窗口布局上
- ajax请求出错_学习笔记:Ajax总结
- JavaScript中的内置对象(数组、Boolean、Number、字符串)和自定义对象
- layui官方文档镜像,layui主页,layui镜像网站,layui资源下载,技术文档
- 项目实战之vue掘金小册`WebApp`
- 基于Matlab数字图像处理微表情情绪识别系统
- leetcode之幂集(C++)
- LaTeX插入参考文献教程 | 非BibTeX格式
- 普通电机、步进电机、伺服电机、舵机区别?
- Python对word文档进行操作
- 关于Win10创意者更新之后蓝屏的修复办法
- 组织结构图用什么做最简单?树图网组织结构图在线制作简单又漂亮
- linux下使用SP_Flash_tool刷机
- R中因子(factor)
热门文章
- 数据库系统实践 III 查询语句
- 微信小程序WebSocket使用案例
- 为什么不要用苹果的@icloud.com邮箱申请你的APP ID
- python 100天 github_GitHub - theroad/Python-100-Days: Python - 100天从新手到大师
- 群雄混战的短视频,繁荣背后存在的短板
- ZOJ 3551 Bloodsucker(概率dp)
- 程序员的英语学习指南
- 2021 ICPC Jinan C Optimal Strategy
- 笑是理想的热情与态度
- c语言flappy bird,c语言版本flappy bird