二、词向量

article/2025/9/21 18:26:57

 

目录

 

一、什么是词向量

二、词向量的离散表示

  1、one-hot编码

  2、 Bag of  Words表示

3、TF-IDF表示

4、 Bi-gram和N-gram

5、离散表示的问题:

三、词的分布式表示(Distributed representation)

1、Skip-Gram模型

2、代码 


一、什么是词向量

     计算机倾向于和vector(向量)打交道,而不是一一个个单词,所以需要吧单词转化为词向量

二、词向量的离散表示

离散表示:

  1、one-hot编码

      词典中有10000个单词,则one-hot编码为10000维的向量,在正确单词表示处为1,其余为0

缺点:不能表示单词间语义相近性

如:

  2、 Bag of  Words表示

将每个单词在语料库中出现的次数加到one-hot编码中,即为单词的Bag of words表示。

缺点:单词的顺序没有被考虑,语义信息也没有被考虑

3、TF-IDF表示

为了表示单词的重要性,给词加上一个权重,罕见的单词给高一点的权重,常见的给低一点的权重。

缺点:还是没有考虑单词顺序和语义信息。

4、 Bi-gram和N-gram

本来是1个单词的单词表,又把两个单词拼在一起组成单词表。还是没有在根本上解决语义的相关性问题。

5、离散表示的问题:

无法衡量词向量之间的关系
词表维度随着语料库增长膨胀
n-gram 词序列随语料库膨胀更快
数据稀疏问题

如何保证词编码之间的相似性,比如一个许多不同品种的鸟,都属于鸟类,所以要保证它们之间的相关性。

三、词的分布式表示(Distributed representation)

想要知道一个单词什么意思,看它周围经常出现什么单词就可以了。

Word2Vec文章介绍了两个词向量的模型:本章主要学习单词怎样编码才能更好的表示其相似性(学习更好的词编码),初始编码是随机初始化的。

1、Skip-Gram模型

 用一个词附近的词定义该单词。即这个单词如果能够预测处它附近的单词,那这个单词的特征也就知道了,意思也大约能猜出来了。

 

总的损失函数如下:

 为了加快训练速度,采用负例采样(Negative Sampling):不要在所有吧的单词上预测概率,相当于做一个二分类任务,给定一个单词,预测这个单词是不是中心词周围的单词,是的话输出1,不是的话,输出0。即把50万分类问题变为一个二分类问题。不计算具体的概率,只关心是不是周围词,如果是,给一个高一点的概率就可以了,不是就给一个低一点的概率。

首先给一个中心词v_{c}和一个正确 的周围单词u_{w},还有若干个错误的周围词(可以从单词表中随机采样),希望前面的部分越大越好(第二个公式加号前面的公式),后面的饿部分越小越好(第二个公式,但是加了一个负号,所以此处也是越大越好)。

下面为模型目标函数:p(D=1|w,c,\theta )=\frac{1}{1+e^{-v_{c}^{T}v_{w}}}是典型的sigmoid函数:\sigma (x)=\frac{1}{1+e^{-x}},第二个公式即为先对输入进行sigmoid,然后做log操作,sigmoid是一个增函数,单词相近性越高(u_{c-m+j}^{T}*v_{c}),则得到的数值越高。采样的单词和中心词相近性越低(\tilde{u}_{k}^{T}*v_{c}),得到的结果越低,但是此处添加了一个负号,表示得到的结果越高越好。则整个第二个公式表示得到的结果越高越好。以此来训练,形成更好的词向量编码。需要训练的参数在词向量编码中。

2、代码 

'''中心思想:
在一个text(文章)中:输入:一个中心词w(t),t表示这个单词的位置得到其附近C位置上的单词,以及负采样单词(负采样是把单词出现频率作为一个list,然后在其中采样k*2*c次,返回其下标),返回这三种单词的编码center_input,pos_input,neg_input(神经网络输入的是数据,把单词变为数据/list下标进行输入)神经网络再对其进行编码,得到center_encode,pos_encode,neg_encode损失函数:对于center_encode*pos_encode,其乘积越高表示对center_encode的编码效果越好,-(center_encode*neg_encode)越高表示编码效果越好,再对乘积做logsigmoid操作,取负值即为loss。注意将两个乘积的第1维进行sum()操作(第0维表示有多少个中心词,第1维表示每个中心词产生多少个周围/负采样词,第2维表示每个词的编码长度)。权重取值:取出对center_encode的权重(__init__()中nn.Embedding方法训练的权重,而不是forward中单个单词产生的权重),变为numpy数据类型。eg:self.in_encode.weight.data.numpy()
'''
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as tud
from collections import Counter
import numpy as np
import random
import math
import pandas as pd
import sklearn
from sklearn.metrics.pairwise import cosine_similarity
#USE_CUDA=torch.cuda.is_available()
#模型每次训练得到的值都不一样,这是因为有些数据是随机初始化的,现在让这些数据初始化都一样
random.seed(1)
np.random.seed(1)
torch.manual_seed(1)
#设定一些超参数
c=3#定义中心词周围有3个单词
k=100#随机采样100个负例,如果训练数据够大的话,可以把k调到20以下,即没出现一个正确的词要出现100个错误的词
num_epoch=2#训练2个epoch
max_vocab_size=30000#词汇表有多少个单词,此处训练30000个常见的单词
batch_size=128
learning_rate=0.2
embedding_size=100#编码长度为100#读进来的是一篇文章,希望把它变成一个一个单词
def word_tokenize(text):return text.split()
with open("text8.train.txt","r") as fin:text=fin.read()#text[:100].split()#split()字符串自动切割,默认以空格为切割点
#将单词变为一张词汇表
text=text.split()
print(type(text))
vocab=dict(Counter(text).most_common(max_vocab_size-1))#Counter(text)能够把每个单词都数一遍,并计算出不同的单词出现多少遍,,然后把最常见的3000个单词取出来并变为字典vocab["<unk>"]=len(text)-np.sum(list(vocab.values()))#vocab.values()表示每个vocab单词出现的次数(取出字典中的值),变成list,然后再求和,就是所有常见单词的出现次数,用所有单词的长度减去它,即所有不常见单词的出现次数构建两张关于词汇的mapping
index_to_word=[word for word in vocab.keys()]#取出所有单词表中的单词
word_to_index={word:i for i,word in enumerate(index_to_word)}#把index_to_word中的内容反过来,并标上序号,enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
word_count=np.array([count for count in vocab.values()],dtype=np.float32)#为什么用numpy数据类型
word_freqs=word_count/np.sum(word_count)#得到每个单词出现的概率
#论文中提到要把概率都提到3/4次方
word_freqs=word_freqs**(3./4.)
word_freqs=word_freqs/np.sum(word_freqs)#再重新normalize一次(归一化)
vocab_size=len(index_to_word)#如果训练数据不够30000个,则更新单词数量
class WordEmbaddingDataset(tud.Dataset):def __init__(self,text,word_to_index,index_to_word,word_count,word_freqs):super(WordEmbaddingDataset,self).__init__()self.text_encode=[word_to_index.get(word,max_vocab_size-1) for word in text]self.text_encode=torch.tensor(self.text_encode).long()self.word_to_index=word_to_indexself.index_to_word=index_to_wordself.word_count=word_countself.word_freqs=word_freqs   def __len__(self):#数据集一共有多少个item()return len(self.text_encode)def __getitem__(self,idx):#给定一个index,返回其代表的哪一个数据,一般返回torch.tensor,然后把这些tensor 拼在一起,拼成一个batchcenter_word=self.text_encode[idx]pos_word=list(range(idx-c,idx))+list(range(idx+1,idx+c+1))pos_word=[i%len(self.text_encode) for i in pos_word]pos_word=self.text_encode(pos_word)neg_word=torch.multinorminal(self.word_freqs,K*pos_word.shape[0],True)return center_word,pos_word,neg_word
dataset=WordEmbaddingDataset(text,word_to_index,index_to_word,word_count,word_freqs)
dataloader=tud.DataLoader(dataset,batch_size=batch_size,shuffle=True,num_workers=0)
class EmbaddingModel(nn.Module):def __init__(self,vocab_size,embad_size):super(EmbaddingModel,self).__init__()self.vocab_size=vocab_sizeself.embad_size=embad_sizeself.in_embad=nn.Embedding(self.vocab_size,self.embad_size)self.out_embad=nn.Embedding(self.vocab_size,self.embad_size)def forward(self,input_lable,pos_lable,neg_lable):input_embadding=self.in_embad(input_lable)pos_embadding=self.out_embad(pos_lable)neg_embadding=self.out_embad(neg_lable)input_embadding=input_embadding.unsqueeze(2)pos_dot=torch.bmm(pos_embadding,input_embadding).squeeze(2)neg_dot=torch.bmm(neg_embadding,-input_embadding).squeeze(2)log_pos=F.logsigmoid(pos_dot ).sum(1)log_neg=F.logsigmoid(neg_dot).sum(1)loss=-(log_pos+log_neg)return lossdef input_embadding(self):return self.in_embad.weight.data.numpy()
model=Embaddingmodel(vocab_size,embad_size)
optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate)
for e in range(epoch):for i,(input_lable,pos_lable,neg_lable) in enumerate(dataloader):input_lable=input_lable.long()pos_lable=pos_lable.long()neg_lable=neg_lable.long()optimizer.zero_grad()loss=modle(input_lable,pos_lable,neg_lable)loss.backward()optimizer.step()if i%100==0:print("epoch",epoch,"iteration",i,loss.item())

 


http://chatgpt.dhexx.cn/article/8GV4oXZQ.shtml

相关文章

【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;一个词在文档中出现的次…

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

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

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

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

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

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

NLP-关键词提取算法

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

关键词提取算法概述

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

关键词提取算法

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

KeyBert关键词提取 :原理、方法介绍、代码实践

创建于&#xff1a;20210708 修改于&#xff1a;20210708, 20221104 文章目录 1 概述2 方法介绍2.1 安装2.2 KeyBERT(model)2.3 extract_keywords参数介绍 3、代码实践3.1 英文示例3.2 中文示例 4、加载不同的模型库4.1 SentenceTransformers模型调用4.2 Transformers模型调用4…

常用的Python3关键词提取方法

诸神缄默不语-个人CSDN博文目录 本文将介绍一些简单的使用Python3实现关键词提取的算法。目前仅整理了一些比较简单的方法&#xff0c;如后期将了解更多、更前沿的算法&#xff0c;会继续更新本文。 文章目录 1. 基于TF-IDF算法的中文关键词提取&#xff1a;使用jieba包实现2.…

NLP——关键词提取

NLP——关键词提取 文章目录 NLP——关键词提取前言一、TF-IDF算法1. 基本原理2. 算法改进 二、TextRank算法1. 基本原理2. PageRank算法3. TextRank算法4. TextRank算法在关键词提取的应用 三、LSA/LSI/LDA算法1. LSA/LSI算法2. LDA算法 四、实战练习 前言 关键词提取分为有监…