一、词向量模型

article/2025/9/21 18:29:20

因为计算机不能理解词语,所以我们需要用词向量表示一个词。
词向量有一个发展历程:从one-hot到word embedding。

1 one-hot

设词典的大小为n(词典中有n个词),假如某个词在词典中的位置为k,则设立一个n维向量,第k维置1,其余维全都置0。这个思想就是one-hot编码,中文叫独热编码(茫茫0海中有一个1,不就是孤独的热点吗)。

比如这里有三句话,即三个样本:

“我喜欢你”;

“你喜欢你的狗狗”;

“你是狗狗”。

假设已经分词完成,那么如果我们要从这三个样本中挖掘信息的话,根据词袋模型的思想:

首先就要将这些句子中出现过的词构建一个词典。这个词典依次包含[我,喜欢,你,的,是,狗狗]这六个词。根据one-hot编码,“我”就会被编码为[1,0,0,0,0,0],而“喜欢”就被编码为[0,1,0,0,0,0],以此类推。

那么如何继续推进,利用one-hot编码来生成特征向量呢?

一个样本的特征向量等于该样本中的每个单词的one-hot向量直接相加。这三个样本的特征向量便会表示为:

我喜欢你:[1,1,1,0,0,0]

你喜欢你的狗狗:[0,1,2,1,0,1]

你是狗狗:[0,0,1,0,1,1]

其中,第二个句子中“你”出现了两次,因此第三维的值为2。但是注意一下,在有的机器学习模型,比如贝努利分布的朴素贝叶斯模型中,仅考虑每个词出现与否,此时第二个句子的词袋模型就变成了[0,1,1,1,0,1]。

看,特征向量构建完成啦,剩下的就交给机器学习吧
(原文链接:https://blog.csdn.net/xixiaoyaoww/article/details/105459590)

优点:思路简单。
缺点:一般词库是一个很大的库。例如词库会达到30万,那就需要一个30万维度的向量表示一个词。这样计算量很大。同时整个矩阵会是一个稀疏矩阵。极大的浪费内存与计算力。

2 TF-IDF

第二种是使用词出现的频率,以及逆文档频率表示一个词。
TF=某个词在文章中出现的频率/文章的总次数
IDF=log{语料库的总文档数/出现该词的文档数}
T F − I D F = T F ∗ I D F TF-IDF=TF*IDF TFIDF=TFIDF
对于一句话,就是把句子中的词的TF-IDF拼起来,形成一个向量。

优点:简单快速,结果比较符合实际
缺点:单纯考虑词频,忽略了词与词的位置信息以及词与词之间的相互关系。

3 bi-gram和n-gram

优点:考虑了词的顺序
缺点:词表膨胀,无法衡量向量之间的相似性

4 word embedding

用固定长度的向量表示一个词。
这个向量需要能够保证相似的词,距离近;在不同语言中,空间分布很相似;向量能够做加减运算: V k i n g − V q u e e n + V w o m e n = V m a n V_{king}-V{queen}+V_{women}=V_{man} VkingVqueen+Vwomen=Vman

流行的训练算法是Word2Vec。具体有两种形式:CBOW和skip-gram。它们很类似,这里介绍skip-gram。

  • skip-gram

在这里插入图片描述

用中心词预测周围单词。
输入第t个词,用一层的神经网络,预测周围的词,也就是第t-2个,t-1个,t+1个,t+2个…。

对于模型:
输入:一个单词的int表示。假设词表大小为N。
projection:将单词映射为一个词向量,维度是embedding_size.这里会产生一个形状为Nxembedding_size 的参数W。这个参数就是本次任务最重要的输出。作为词向量,提供给下游。
output:将这个词向量做线性变化后,得到在每个单词上的概率。希望在周围词上的概率最大。

在这里插入图片描述

目标函数:找到在给定 w t w_t wt的情况下 w t + j w_{t+j} wt+j出现的概率: p ( w t + j ∣ w t ) p(w_{t+j}|w_t) p(wt+jwt),再对这个概率取log。对所有窗口范围内的概率log和取最大值。t是从1到T的,再对这所有和,取和。
具体概率的计算方式是 u o u_o uo是输出的词向量, v c v_c vc是输入词向量。
p ( o ∣ c ) = e x p ( u o T v c ) ∑ w = 1 W e x p ( u w T v c ) p(o|c)=\dfrac{exp(u_o^Tv_c)}{\sum_{w=1}^W exp(u_w^Tv_c)} p(oc)=w=1Wexp(uwTvc)exp(uoTvc)

c:表示中心词
o:表示周为此
v c v_c vc表示输入词向量
u o u_o uo表示输出词向量
用两个词向量的点积表示o这个单词可能出现的概率: u o ∗ v c u_o*v_c uovc

损失函数:上面的概率越大越好,作为损失函数,就是将该函数取反,求最小值。
在这里插入图片描述

这里最大的问题是p(o|c)的分母是很大的。要计算 v c v_c vc与词库中每一个单词的词向量的和。如果词库有50万个单词,那就要计算50万次。计算量很大。看损失函数的最后一项,也是一样的。

可以采取的措施是负例采样。
我们的输入input embeding是一个50万x100维的矩阵。(假设我们用100维的向量表示一个词)。输出output embedding是一个50万x100维的矩阵。

我们把任务换一个角度。对于 w t w_t wt不要计算周围单词在整个词库上的概率。我们将词库的单词分为周围单词和非周围单词两类。这样就把一个50万分类问题变为2分类问题。如果单词 u k u_k uk w t w_t wt的周围单词,那就概率高一些。否则概率低一些。
在这里插入图片描述

用周为词向量点乘中心词向量,对结果做sigmoid,表示w是c的周围词的概率。对于需要连续计算m个周围词的概率的乘积,可以转为对概率求log和。因此出现了上面的公式。

我们希望目标函数越大越好。
对于负例我们从词库中采样一部分单词即可。采样后的概率做了一下变换才参与到计算中。
最后对我们有用的数据是输入的embedding,这是词的稠密向量。可以很好的表示词之间的相关性。

最后模型代码实现。

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_size):super(EmbeddingModel, self).__init__()self.vocab_size = vocab_sizeself.embed_size = embed_sizeinitrange = 0.5 / self.embed_sizeself.out_embed = nn.Embedding(self.vocab_size, self.embed_size, sparse=False)self.out_embed.weight.data.uniform_(-initrange, initrange)self.in_embed = nn.Embedding(self.vocab_size, self.embed_size, sparse=False)self.in_embed.weight.data.uniform_(-initrange, initrange)def forward(self, input_labels, pos_labels, neg_labels):# input_labels:[batch_size]# pos_labels:[batch_size, c-1]# neg_labels:[batch_size, (c-1)*K]batch_size = input_labels.size(0)input_embedding = self.in_embed(input_labels) # [batch_size,embedding_size]pos_embedding = self.out_embed(pos_labels) # [batch_size,c*2-1,embedding_size]neg_embedding = self.out_embed(neg_labels) # [batch_size,(c*2-1)*K,embedding_size]input_embedding = input_embedding.unsqueeze(2) # [batch_size,embedding_size,1]#  bmm((b×n×m), (b x m x p)) = (b x n x p)pos_dot = torch.bmm(pos_embedding, input_embedding) # [batch_size,c*2-1,1]neg_dot = torch.bmm(neg_embedding, -input_embedding)pos_dot = pos_dot.squeeze() # [batch_size,c*2-1]neg_dot = neg_dot.squeeze() # [batch_size,(c*2-1)*K]log_pos = F.logsigmoid(pos_dot).sum(1) # [batch_size]log_neg = F.logsigmoid(neg_dot).sum(1) # [batch_size]loss = log_pos + log_neg# 因为希望概率越大越好,所以损失就是越小越好,所以加负号。return -lossdef input_embeddings(self):return self.in_embed.weight.data.cpu().numpy()

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

相关文章

词向量算法

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

词向量(Word Embedding)

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

二、词向量

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

【NLP】词向量

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

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

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

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

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

词向量表示

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

词向量简介

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

词向量

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

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

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

关键词提取代码

我又来水博客了,今天我做了关键词提取算法。 代码我会上传到我的github中去,这个算法需要stopword和corpus两个txt格式,导入的时候,会出现下面的错误 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的极简关键词提取方法。 关键词提取是通过查找文档中与文档本身最相似的词来完成的。首先,用BERT提取文档嵌入,得…

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

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

NLP- 关键词提取 - 综述

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

基于yake的中文关键词提取试验

前言: 之前看了云朵dalao的一篇关于关键词提取的文章,其中介绍的 Yake 模型采用了大写词、词位置、全文词频、上下文关系、句间词频等 5 个指标,计算候选词得分。感觉设计上较直观、易解释,但原 yake 库不支持中文,于是…

RAKE-无监督英文关键词提取算法

没想到吧,在深度学习大行其道的当今,我突然写了一篇上古时代的文章(其实也就2010年,奈何知识更新真快…) 话不多说,一起来看一下RAKE算法 RAKE RAKE全称为Rapid Automatic Keyword Extraction&#xff0c…

tfidf关键词提取_基于深度学习的个性化商品评论标签提取

商品评论标签提取作为商品评论中的一个比较有意思的问题。评论标签提取的主要任务是从评论中了解到用户对产品的哪些功能、属性进行了怎样的评论,并抽取成简短有效的信息。 关键词提取Vs评论标签提取 商品标签提取和关键词的抽取还不是同样的NLP问题,关键词提取更侧重于文章或…

NLP-关键词提取算法

一、提取关键字技术简介 关键字提取技术一般也可以分为有监督和无监督两类。 有监督的关键词提取方法主要是通过分类的方式进行的,通过构建一个比较丰富完善的词表,然后通过判断每个文档与词表中每个词的匹配程度,以类似打标签的方式&#x…

关键词提取算法概述

关键词提取概述 概念 关键词是指能反映文本主题或者主要内容的词语。关键词提取是NLP领域的一个重要的子任务。在信息检索中,准确的关键词提取可以大幅提升效率;在对话系统中,机器可以通过关键词来理解用户意图;在自动文摘、文本…

关键词提取算法

来源:《Python自然语言处理实战:核心技术与算法》 1.TF-IDF TF-IDF从词频、逆文档频次两个角度对词的重要性进行衡量,可以根据tf-idf值由大到小排序取前n个作为关键词。 传统的TF-IDF算法中,仅考虑了词的两个统计信息&#xff0…