目录

一、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相乘就能得到结果。

二、程序说明

本程序共分为5个模块,首先对语料进行输入以及预处理,然后送入模型进行训练,训练完成后便获得了词向量矩阵。简单对训练好的CBOW模型进行测试,即判断输入周围词获得的中心预测值是否和标签一致。最后将词向量存储在txt文件中,并挑选1000个词向量在降为2维之后绘制在平面图中。

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)

训练时需要注意,输入的上下文以及标签中心词都应该是张量形式,经过模型处理后输出值与标签都送入损失函数计算损失,损失向后传播并更新参数。经过十轮训练后,将embedding层的weight变量取出,里面存储的即为训练好的词向量

3.测试模块

由于实验不要求模型的准确率,所以测试模块仅做简单的预判。模型输出最大值即为预测值的下标。

4.输出处理模块

词向量矩阵中某个词的索引所对应的那一列即为所该词的词向量,将生成的词向量结果将保存在txt文件中,每一个词都由100维(100个浮点数)表示。

5.可视化模块

词向量设定为100维度,为将词向量进行可视化,首先要将维度降到2维,以便在坐标系中进行表示,用到的降维方法为PCA。考虑到可视化的效果,只取1000个词进行可视化。另外,为了将中文标签正确在figure中显示,需要设置plt.rcParams['font.sans-serif'] = ['SimHei'] 。

三、实验结果

中文结果可视化:

英文结果可视化:

四、疑问与思考

1.cbow模型与词向量是什么关系

从零开始学自然语言处理(十三)——CBOW原理详解

词向量矩阵是CBOW模型的参数,CBOW本身的作用是用来进行中心词预测,当模型训练好了之后,说明参数矩阵经过损失传播调整以及优化后也收敛到了最佳状态,对于目标语料产生了最佳的词向量表示。

2.keras如何实现cbow

从零开始学自然语言处理(二)——手把手带你用代码实现word2vec

3.jieba分词:

从零开始学自然语言处理(一)—— jieba 分词

4.关于训练负样本的问题

CBOW 是用周围词去预测中心词。怎么预测呢?就比如给了一个训练语料“我/出生/在/中国/。”,当给定[“我”,“出生”,“中国”,“。”]时,此时我的训练目标就是要预测“在”这个词的概率要大于其它所有词(即语料库中所有除了“在”的所有词)的概率。

但是词库中的词可能会有几十万个,这样训练下去想要收敛就会变得十分困难。因此提出 word2vec 的神人们就想出了一个取巧的方法:我给它要求降低一点,我不要求模型从几十万个词找到那个正确的中心词,我只要求模型能从十几个词中找到正确的中心词就可以了。因此就用到了 negtive sampling。

那为什么我们的代码中没有负样本一说呢,这是由于本次实验的目标是并不是测试模型效果,并且模型的规模也有限。

5.为什么中文语料要加载停用词

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。

【一起入门NLP】中科院自然语言处理作业二:中英文语料训练CBOW模型获得词向量(pytorch实现)【代码+报告】相关推荐

  1. NLP【05】pytorch实现glove词向量(附代码详解)

    上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...

  2. NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化、过程全记录

    NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化 目录 输出结果 代码设计思路 代码运行过程全记录 输出结果 代码设计思路 代码运行过程全记录 3081 or ...

  3. 【一起入门NLP】中科院自然语言处理作业四:RNN+Attention实现Seq2Seq中英文机器翻译(Pytorch)【代码+报告】

    这里是国科大自然语言处理的第四次作业,同样也是从小白的视角解读程序和代码,现在我们开始吧(今天也是花里胡哨的一天呢

  4. 企业隐患排查文本挖掘比赛(二):算法篇(从词向量到BERT)

    1.文本挖掘的历程 对于NLP问题,首先要解决的是文本表示的问题.虽然人能够清楚地了解文本的含义,但是计算机只能处理数值运算,因此首先要考虑如何将文本转化为数值. 1.1 向量表示 1.1.1 词袋模 ...

  5. NLP发展大事记:顶会,预训练大模型,BERT系列

    文章目录 1. NLP发展重要时间线 时间线 2. NLP以BERT发展的延伸 3. NLP领域顶会 1. NLP发展重要时间线 聊聊NLP那些大事儿,预训练大模型大势所趋. 时间线 Transfor ...

  6. 【一起入门NLP】中科院自然语言处理作业五:BiLSTM+Attention实现SemEval-2010 Task 8上的关系抽取(Pytorch)【代码+报告】

    这里是国科大自然语言处理的第五次作业(终于是最后一次作业了,冲!),本篇博客是记录对论文:Attention-Based Bidirectional Long Short-Term Memory Ne ...

  7. torchtext处理文本数据——使用自己的word2vec模型作为词向量建立词表(学习二)

    首先复制上一篇博客的完整代码,代码如下: 注:如果有不明白的地方请参考上一篇博客--torchtext处理文本数据--构造dataset读取文本(学习一) 数据源和解释都在上一篇博客中 from to ...

  8. 【NLP】第4章 从头开始预训练 RoBERTa 模型

  9. 机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)

    目录 理论知识准备 构造文本特征向量 TF-IDF 值 sklearn中TfidfVectorizer 代码实例 CountVectorizer() 代码实操 Word2Vec 代码案例 总结 每文一 ...

  10. 学习笔记(06):自然语言处理Word2Vec视频学习教程-使用gensim构建word2vec词向量

    立即学习:https://edu.csdn.net/course/play/5226/106444?utm_source=blogtoedu word2vec size 50 300 特征向量维度

最新文章

  1. python配置opencv最简单_(Python)从零开始,简单快速学机器仿人视觉Opencv—第二节:OpenCV的视频操作...
  2. debug assertion failed!报错
  3. 如何将某个groupbox中的数据赋值到另一个groupbox_React中的数据和数据流
  4. android+jni+构造函数,在JNI中调用构造函数失败Android
  5. C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别
  6. 软件工程概论 课堂练习 第2次作业5【顺序图思考题——绘制手机拨号顺序图】
  7. 前端学习(1730):前端系列javascript之发布窗口布局上
  8. ajax请求出错_学习笔记:Ajax总结
  9. JavaScript中的内置对象(数组、Boolean、Number、字符串)和自定义对象
  10. layui官方文档镜像,layui主页,layui镜像网站,layui资源下载,技术文档
  11. 项目实战之vue掘金小册`WebApp`
  12. 基于Matlab数字图像处理微表情情绪识别系统
  13. leetcode之幂集(C++)
  14. LaTeX插入参考文献教程 | 非BibTeX格式
  15. 普通电机、步进电机、伺服电机、舵机区别?
  16. Python对word文档进行操作
  17. 关于Win10创意者更新之后蓝屏的修复办法
  18. 组织结构图用什么做最简单?树图网组织结构图在线制作简单又漂亮
  19. linux下使用SP_Flash_tool刷机
  20. R中因子(factor)

热门文章

  1. 数据库系统实践 III 查询语句
  2. 微信小程序WebSocket使用案例
  3. 为什么不要用苹果的@icloud.com邮箱申请你的APP ID
  4. python 100天 github_GitHub - theroad/Python-100-Days: Python - 100天从新手到大师
  5. 群雄混战的短视频,繁荣背后存在的短板
  6. ZOJ 3551 Bloodsucker(概率dp)
  7. 程序员的英语学习指南
  8. 2021 ICPC Jinan C Optimal Strategy
  9. 笑是理想的热情与态度
  10. c语言flappy bird,c语言版本flappy bird