词向量训练

article/2025/9/21 17:18:05

词向量训练

一、 实验目的

  1. 掌握课堂所讲词向量的基本概念和训练方法。
  2. 加强对pytorch、tensorflow等深度学习框架的使用能力。

二、 实验要求

任选课上讲的一种词向量模型进行实现即可,如是其他模型则请写明模型结构,作业压缩文件中也提供给大家相关的一些论文来进行参考。

三、实验内容

1.数据读取及预处理

中文语料已经分好词了,还需要去掉停用词。
在这里插入图片描述

def load_stopwords():with open('data/stopwords.txt','r',encoding="utf-8") as f:return f.read().split("\n")def cut_stopwords(mode):if mode =="zh":stop_words=load_stopwords()with open('data/zh.txt','r',encoding="utf-8") as f:alldata=f.read().split(" ")result=[]for words in alldata:if words not in stop_words:result.append(words)return resultelse:with open('data/en.txt','r',encoding="utf-8") as f:alldata=f.read().split(" ")result=[]for words in alldata:result.append(words)return result

2.训练词向量选择的模型结构cbow及word2vec代码

①CBOW结构图

(1)CBOW是通过周围词去预测中心词的模型(skip-gram是用中心词预测周围词)
(2)word-embedding:将高维的词转换为低维的词表示,embedding之后向量中是一些浮点数
在这里插入图片描述

②结构代码

import torch.nn as nn
import torch.nn.functional as Fclass CBOW(nn.Module):def __init__(self, duplist_size, embedding_dim):super(CBOW, self).__init__()self.embeddings = nn.Embedding(duplist_size, embedding_dim)self.proj = nn.Linear(embedding_dim, 128)self.output = nn.Linear(128, duplist_size)def forward(self, inputs):embeds = sum(self.embeddings(inputs)).view(1, -1)out = F.relu(self.proj(embeds))out = self.output(out)nllp = F.log_softmax(out, dim=-1)return nllp

第一层embeddings嵌入,然后两层全连接,最后经一个softmax输出。
(1)embeddings输入是词表大小,输出是dim,词向量维度。
(2)第一层全连接输入是词向量维度个结点,输出128个个结点。
(3)第二层全接连输入128个结点,输出词表大小个结点。
(4)最后展平经softmax输出。

③构造词表

需要构造([‘加强’, ‘雨情’, ‘分析’, ‘研究’], ‘水情’,)的标签词表, 类似于滑动窗口中心词前后设为两个词,也就是4。

def pre(mode):data=[]raw_text=cut_stopwords(mode)print(len(raw_text))#词去重dup_list=set(raw_text)dup_list_size=len(dup_list)#转成字典,词对索引和索引对词的word2idx={word: i for i,word in enumerate(dup_list)}idx2word={i: word for i,word in enumerate(dup_list)}#([w1,w2,w4,w5],"label")for i in range(2, len(raw_text) - 2):context = [raw_text[i - 2], raw_text[i - 1],raw_text[i + 1], raw_text[i + 2]]target = raw_text[i]data.append((context, target))return dup_list_size,word2idx,idx2word,data

④训练和测试代码

def train(mode):for epoch in trange(epochs):total_loss = 0for context, target in tqdm(data):# 把训练集的上下文和标签都放到GPU中context_vector = make_context_vector(context, word2idx).to(device)target = torch.tensor([word2idx[target]]).cuda()# print("context_vector=", context_vector)# 梯度清零model.zero_grad()# 开始前向传播train_predict = model(context_vector).cuda()  #cudaloss = loss_function(train_predict, target)# 反向传播loss.backward()# 更新参数optimizer.step()total_loss += loss.item()tl=total_loss/len(data)/100losses.append(tl)print("\nlosses=", tl)Weight = model.embeddings.weight.cpu().detach().numpy()print("\n开始测试")test(mode)return Weight
def test(mode):if mode =="zh":context = ['香港', '澳门', '祖国', '台湾']else: context = ['helping', 'western', 'restore', 'its']context_vector = make_context_vector(context, word2idx).to(device)predict = model(context_vector).cpu().detach().numpy()  # 预测的值print('Test Context: {}'.format(context))max_idx = np.argmax(predict)  # 返回最大值索引print('Prediction: {}  {}'.format(idx2word[max_idx],np.max(predict)))  # 输出预测的值print("CBOW embedding'weight=", model.embeddings.weight)  #获取词向量Embedding

训练10个epoch,每个epoch都进行测试,测试用例为[‘香港’, ‘澳门’, ‘祖国’, ‘台湾’],原文中间词为回归,在第10个epoch时训练的权重预测到中心词为回归。
在这里插入图片描述
在这里插入图片描述

⑤输出词向量

每个词向量用100维的float数表示

def out(Weight,mode):#{单词1:词向量1,单词2:词向量2...}word2vec = {}  for word in word2idx.keys():word2vec[word] = Weight[word2idx[word], :]  #词向量矩阵中某个词的索引所对应的那一列即为所该词的词向量# 将生成的字典写入到文件中if mode == "zh":with open("out/zh_wordvec.txt", 'w', encoding='utf-8') as f:  #中文字符集要设置为utf-8,不然会乱码for key in word2idx.keys():f.writelines('"' + str(key) + '":' + str(word2vec[key]))f.write('\n')f.write('\n')else:with open("out/en_wordvec.txt", 'w') as f:for key in word2idx.keys():f.writelines('"' + str(key) + '":' + str(word2vec[key]))f.write('\n')f.write('\n')print("out over")

在这里插入图片描述

⑥词向量可视化,PCA降维

def show(W,mode):  # 将词向量降成二维绘图pca = PCA(n_components=2)  # 数据降维principalComponents = pca.fit_transform(W)word2ReduceDimensionVec = {}  #{单词1:(维度一,维度二),单词2:(维度一,维度二)...}for word in word2idx.keys():word2ReduceDimensionVec[word] = principalComponents[word2idx[word], :]plt.figure(figsize=(20, 20))  # 将词向量可视化count = 0if mode=="zh":for word, wordvec in word2ReduceDimensionVec.items():if count < 100:plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号,否则负号会显示成方块plt.scatter(wordvec[0], wordvec[1])plt.annotate(word, (wordvec[0], wordvec[1]))count += 1else:for word, wordvec in word2ReduceDimensionVec.items():if count < 100:  # 只画出100个plt.scatter(wordvec[0], wordvec[1])plt.annotate(word, (wordvec[0], wordvec[1]))count += 1plt.show()

3.程序模块

在这里插入图片描述

四、问题和思考

1.词向量?

在这里插入图片描述

2.word2vec?

word2vec是一种将word转为向量的方法,其包含两种算法,分别是skip-gram和CBOW,它们的最大区别是skip-gram是通过中心词去预测中心词周围的词,而CBOW是通过周围的词去预测中心词。


http://chatgpt.dhexx.cn/article/fbhNVBwt.shtml

相关文章

语言模型+词向量

文章目录 统计语言模型神经语言模型词向量&#xff08;浅层&#xff09; 统计语言模型 语言模型基本概念 弗莱德里克贾里尼克提出用数学的方法描述语言规律&#xff08;语言模型&#xff09; 语言模型基本思想&#xff1a; 用句子 S w 1 , w 2 , . . . , w n Sw_{1},w_{2},..…

学习笔记:深度学习(5)——词向量的相关概念

学习时间&#xff1a;2022.04.21 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机…

深度学习之词向量

一、词向量 自上世纪90年代开始&#xff0c;特征空间模型就应用于分布式语言理解中&#xff0c;在当时许多模型用连续性的表征来表示词语&#xff0c;包括潜在语义分析LSA、隐含狄利克雷分布LDA主题模型。Bengio et al.在2003年首先提出了词向量的概念&#xff0c;当时是将其与…

自然语言处理——使用词向量(腾讯词向量)

向量化是使用一套统一的标准打分&#xff0c;比如填写表格&#xff1a;年龄、性别、性格、学历、经验、资产列表&#xff0c;并逐项打分&#xff0c;分数范围[-1,1]&#xff0c;用一套分值代表一个人&#xff0c;就叫作向量化&#xff0c;虽然不能代表全部&#xff0c;但至少是…

词向量Word2Vec(深度细致分析)

本文以博客园刘建平Pinard对于word2vec的解释为基础&#xff0c;同时参考了其他相关博客的分析并加入了自己的理解&#xff0c;希望站在巨人的肩膀上进行一定的学习输出。至于本片文章的属性&#xff0c;个人认为是伪原创吧&#xff0c;有需要的同学可以自行转到相应的链接。 w…

一、词向量模型

因为计算机不能理解词语&#xff0c;所以我们需要用词向量表示一个词。 词向量有一个发展历程&#xff1a;从one-hot到word embedding。 1 one-hot 设词典的大小为n&#xff08;词典中有n个词&#xff09;&#xff0c;假如某个词在词典中的位置为k&#xff0c;则设立一个n维向…

词向量算法

https://www.cnblogs.com/the-wolf-sky/articles/10192363.html https://blog.csdn.net/weixin_37947156/article/details/83146141 基于神经网络的表示一般称为词向量、词嵌入(word embdding)或分布式表示。 神经网络的词向量和其他分布式类似&#xff0c;都基于分布式表达…

词向量(Word Embedding)

一、词的表示 在自然语言处理任务中&#xff0c;首先需要考虑词如何在计算机中表示。通常&#xff0c;有两种表示方式&#xff1a;one-hot representation和distribution representation。简而言之&#xff0c;词向量技术是将词转化成为稠密向量&#xff0c;并且对于相似的词&…

二、词向量

目录 一、什么是词向量 二、词向量的离散表示 1、one-hot编码 2、 Bag of Words表示 3、TF-IDF表示 4、 Bi-gram和N-gram 5、离散表示的问题&#xff1a; 三、词的分布式表示&#xff08;Distributed representation&#xff09; 1、Skip-Gram模型 2、代码 一、什么是…

【NLP】词向量

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

第四章(1):词向量定义与意义

第四章(1):词向量定义与意义 目录 第四章(1):词向量定义与意义前言1. 词的表示1.1 离散表示1.1.1 One-Hot独热编码1.1.2 ngram特征表示1.2 分布式表示2. 意义前言 在自然语言处理的领域中,每个单词都可以被表示为一个向量,这些向量叫做“词向量”。换句话说,每个单词…

什么是词向量?(NPL入门)

什么是词向量&#xff1f; 我们组实训选择的主题是与自然语言识别相关的&#xff0c;那么就不得不学习和了解一下自然语言识别中非常重要和基础的。于是我对于自己对词向量的学习进行了以下的总结。 简而言之&#xff0c;词向量技术是将词转化成为稠密向量&#xff0c;并且对…

词向量表示

目录 1、语言表示 1.1、分布假说 1.2、语言模型 2、词向量表示 2.1、词向量表示之one-hot 2.2、词带模型之 &#xff08;Bag of Words&#xff09; 2.3、词的分布式表示 2.3.1 基于矩阵的分布式表示 2.3.2 基于聚类的分布式表示 2.4基于神经网络的分布式表示 2.4.1、…

词向量简介

最近深度学习技术有了突飞猛进的发展&#xff0c;为语音识别、图像识别、自然语言处理&#xff08;NLP&#xff09;提供了强大的工具&#xff0c;为这些领域今后的快速发展提供了新的契机。 深度学习为自然语言处理带来的最令人兴奋的突破是词向量&#xff08;word embedding&…

词向量

词向量是自然语言处理中重要的基础&#xff0c;有利于我们对文本、情感、词义等等方向进行分析&#xff0c;主要是将词转化为稠密向量&#xff0c;从而使得相似的词&#xff0c;其词向量也相近。 一、词向量的表示 词向量的表示通常有两种方式&#xff0c;一种是离散的&#x…

【深度学习】NLP基础--词向量(从One-hot到Word2Vec)

1.什么是词向量 在自然语言处理中&#xff0c;面临的首要问题是如何让模型认识我们的文本信息&#xff0c;比如向模型中输入‘我爱北京天安门’&#xff0c;那模型是如何认识文本的&#xff1f;词&#xff0c;是自然语言处理中基本单位&#xff0c;将数据输入到模型中&#xff…

关键词提取代码

我又来水博客了&#xff0c;今天我做了关键词提取算法。 代码我会上传到我的github中去&#xff0c;这个算法需要stopword和corpus两个txt格式&#xff0c;导入的时候&#xff0c;会出现下面的错误 gbk codec cant decode byte 0x80 in position 26: illegal multibyte seque…

KeyBERT进行中文关键词提取

原文链接 KeyBERTLeveraging BERT to extract important keywordshttps://maartengr.github.io/KeyBERT/index.html 一种基于BERT的极简关键词提取方法。 关键词提取是通过查找文档中与文档本身最相似的词来完成的。首先&#xff0c;用BERT提取文档嵌入&#xff0c;得…

关键词提取——有监督方法

在上一篇博客中&#xff0c;介绍了关键词提取的无监督方法&#xff1a;点击这里查看文章。本篇主要是介绍关键词提取的有监督方法。 可以从如下角度去做有监督学习&#xff1a; 二分类模型&#xff1a;短语是否为关键短语。LTR&#xff08;learn to rank&#xff09;&#xf…

NLP- 关键词提取 - 综述

NLP- 关键词提取 - 综述 一、关键词提取有以下几种方式二、TF-IDF三、TextRank四、LDA五、word2vec 一、关键词提取有以下几种方式 二、TF-IDF TF-IDF算法&#xff0c;主要是通过统计方法&#xff0c;评估词对文档的重要性。一个基本思想是&#xff0c;一个词在文档中出现的次…