第二课(上) 词向量
创始人
2025-05-28 04:30:09

一、词向量

1,词向量由来

很多情况下,我们希望将单词转换为vector,让计算机跟数字进行打交道
例如:猫这个词,人们希望会通过这个词进行联想,可以得到动物、有毛、宠物、吃鱼等
为了表示这些单词,出现了很多的方法

①词典表示

用一个词典进行表示,把每一个单词都变成对应的一个数字,例如:{"yanyu":1,"Beyond":2,"hjj":3}
这里的1、2、3并没有包含单词本身的语义信息
缺点:一万个单词需要一万个词典来接收,很麻烦

②One-hot表示

跟词典表示方法类似,只不过是把一个词变成了一个向量进行表示而已
yanyu:[0,0,0,0,0,0,0,1]、Beyond:[0,0,0,0,0,0,1,0]、hjj:[0,0,0,0,0,0,1,1]
缺点:工作量大,单词表膨胀

③Bag of Words表示

把所有单词出现的次数进行标识
在这里插入图片描述
缺点:单词的顺序没有被考虑,语义信息仍未被考虑

④TF-IDF

罕见的单词权重高一点,常见的单词权重低一些,稍微加了一些单词的语义信息,但仍然很难表示单词的具体语义信息
在这里插入图片描述

⑤Bi-gram和N-gram

将多个单词拼在一起作为整体加入单词表
在这里插入图片描述
虽然考虑了词的顺序,但词表过于膨胀,并未解决根本的问题

⑥分布式表示(Distributed representation)

"You shall know a word by the company it keeps." ----- J. R. Firth 1957: 11
用一个词附近的其他词来表示该词
若想知道某个单词的具体含义,就看这个单词会跟什么别的单词同时出现,就能知道这个单词的含有,例如:banking跟crises和regulation有关系
在这里插入图片描述

⑦Word2Vec:Skip-Gram模型

假设有50000个单词,每个单词都是100维
input embedding输入词向量:需要新建一个50000100的矩阵,进来一个单词,就把这个单词所在的那一行取出来,将其作为输入词向量,也就是公式里面的u(0)
output embedding输出词向量:这里也是一个50000
100的矩阵,也就是公式里面的v©

输入w(t),t表示单词的位置
使用一个一层神经网络预测周围的若干个单词,w(t-1)、w(t-2)、w(t+1)…
用中心词去预测周围的单词
最终的目的只是使用模型中的某些参数
在这里插入图片描述
在这里插入图片描述
所用到的损失函数完整展开式:
在这里插入图片描述

涉及到求和和点积,运算速度很慢,工作量大。

Skip-Gram:负例采样Negative Sampling

制定一个假的任务,用一个中心词去预测周围词,因为这个任务太困难了,所以使用负例采样。
给定一个中心词、一个正确的周围词和若干个错误的周围词(从单词表中随机采样),希望前面的部分越大越好,后面的部分因为有负号,所以也希望越大越好

P(w|context(w)): 一个正样本,V-1个负样本,对负样本做采样
在这里插入图片描述
本来是个超大的分类问题,通过负例采样就变成了一个二分类问题,只关心两个单词之间是不是相邻的,若相邻返回一个高一点的概率;若不相邻,返回一个低一点的概率

Negative Sampling想法提出的论文出处:《Distributed Representations of Words and Phrases and their Compositionality》

⑧应用

Ⅰ词嵌入可视化: 公司 — CEO

在这里插入图片描述

Ⅱ词嵌入可视化: 词向

在这里插入图片描述

Ⅲ词嵌入可视化: 比较级和最高级

在这里插入图片描述

Ⅳ词嵌入可视化: 词类比任务

在这里插入图片描述
在这里插入图片描述

Ⅴ词嵌入效果评估: 词相似度任务

在这里插入图片描述
在这里插入图片描述

Ⅵ词嵌入效果评估: 作为特征用于CRF实体识别

在这里插入图片描述
在这里插入图片描述

2,PyTorch实现

Ⅰ、对数据进行预处理操作

①导包

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as tud
from torch.nn.parameter import Parameter
import numpy as np
import random
import math
import pandas as pd
import scipy
import sklearn
from collections import Counter #计算某个单词出现的次数
from sklearn.metrics.pairwise import cosine_similarity

②固定随机初始化参数

为了保证实验结果的可复性,把所有的seed都固定下来,每次训练的结果就会一致
模型的随机初始化会对模型有一定的影响,每次跑出来的结果都不一样,为了让模型实验结果尽量保持一致,把seed都变成一个固定的值即可,每次随机初始化的结果都是一样的,结果就可以复现了

USE_CUDA = torch.cuda.is_available()# 为了保证实验结果可以复现,我们经常会把各种random seed固定在某一个值
random.seed(53113)
np.random.seed(53113)
torch.manual_seed(53113)
if USE_CUDA:torch.cuda.manual_seed(53113)

③设定超参数

C=3,定义周围3个单词算周围词
K=100,没出现一个正确的周围词,就会伴随着出现100个非周围词
NUM_EPOCHS=2,训练多少次epoch
MAX_VOCAB_SIZE=30000,最终一共有多少个单词,词汇表有多大,这里训练三万个最常见的单词的词向量
BATCH_SIZE=128,每128个词为一组进行训练
LEARNING_RATE=0.2,学习率设置为0.2

# 设定一些超参数K = 100 # number of negative samples
C = 3 # nearby words threshold
NUM_EPOCHS = 2 # The number of epochs of training
MAX_VOCAB_SIZE = 30000 # the vocabulary size
BATCH_SIZE = 128 # the batch size
LEARNING_RATE = 0.2 # the initial learning rate
EMBEDDING_SIZE = 100

④定义分割单词函数

把一篇文本转化成一个个单词

def word_tokenize(text):return text.split()

⑤训练词向量

训练所需数据集下载
我这里放到了项目所在当前目录下了
在这里插入图片描述

with open("./text8.train.txt", "r") as fin:text = fin.read()# 测试一下
text[:500] # 看下训练集都是啥内容,一堆文章里面的东西,没有标点符号
text[:500].split() # 拿到一个个单词

从文本文件中读取所有的文字,通过这些文本创建一个vocabulary
由于单词数量可能太大,只选取最常见的MAX_VOCAB_SIZE个单词
添加一个UNK单词表示所有不常见的单词
text = text.split(),得到一个一个分割之后的单词
vocab = dict(Counter(text).most_common(MAX_VOCAB_SIZE - 1)),其中Counter(text)把text中的单词全部给数一遍,每一个单词究竟出现了多少次,统计最频繁出现的MAX_VOCAB_SIZE - 1这些词给取出来,通过.most_common来实现。减一操作是因为要留取UNK不常用的单词数量位置信息。dict()最后变成字典形式。
vocab[""] = len(text) - np.sum(list(vocab.values()))留一个位置给UNK不常用的单词数量位置信息。vocab.values()表示单词出现的次数,求和之后再减掉就大概是UNK不常用的单词出现的频率

text = text.split()
vocab = dict(Counter(text).most_common(MAX_VOCAB_SIZE-1))
vocab[""] = len(text) - np.sum(list(vocab.values()))
vovab # 查看下在训练数据中所获取的每个单词所出现的次数,就可以构建词汇表

idx_to_word = [word for word in vocab.keys()] ,把这个list中所有单词表中的单词给取下来
word_to_idx = {word:i for i, word in enumerate(idx_to_word)},出现的次数和单词交换位置

idx_to_word = [word for word in vocab.keys()] 
word_to_idx = {word:i for i, word in enumerate(idx_to_word)}idx_to_word 
"""
['the','of','and',...]
"""
list(word_to_idx.items())
"""
[('the', 0),('of', 1),('and', 2),('one', 3),('in', 4),...]
"""

word_counts = np.array([count for count in vocab.values()], dtype=np.float32),其中vocab.values()是每个单词的出现次数,最终获得每个单词出现的次数
word_freqs = word_counts / np.sum(word_counts),每个单词出现的次数除以所有的单词出现的次数,可以得到每个单词出现的频率
word_freqs = word_freqs ** (3./4.),因为Negative Sampling所在论文中提到了把概率提到原来的3/4次方,效果会更好些。
word_freqs = word_freqs / np.sum(word_freqs) ,因为概率发生了改变,故需要再次计算一下频率,相同的操作即可
VOCAB_SIZE = len(idx_to_word),需要再次更新一下VOCAB_SIZE ,以防万一训练数据中和预处理之前定义的30000个单词不一致

word_counts = np.array([count for count in vocab.values()], dtype=np.float32)
word_freqs = word_counts / np.sum(word_counts)
word_freqs = word_freqs ** (3./4.)
word_freqs = word_freqs / np.sum(word_freqs) # 用来做 negative sampling
VOCAB_SIZE = len(idx_to_word)
VOCAB_SIZE

Ⅱ、实现Dataloader

把所有text编码成数字,然后用subsampling预处理这些文字。
保存vocabulary,单词count,normalized word frequency
每个iteration sample一个中心词
根据当前的中心词返回context单词
根据中心词sample一些negative单词
返回单词的counts

二、Skip-thought模型

相关内容

热门资讯

如家快捷酒店上海(如家快捷酒店... 本篇文章极速百科给大家谈谈如家快捷酒店上海,以及如家快捷酒店上海人民广场对应的知识点,希望对各位有所...
梅河口酒店(梅河口酒店排行榜)... 本篇文章极速百科给大家谈谈梅河口酒店,以及梅河口酒店排行榜对应的知识点,希望对各位有所帮助,不要忘了...
宇豪海逸酒店(宇豪海逸酒店地址... 本篇文章极速百科给大家谈谈宇豪海逸酒店,以及宇豪海逸酒店地址对应的知识点,希望对各位有所帮助,不要忘...
温州金球国豪大酒店(温州金球国... 本篇文章极速百科给大家谈谈温州金球国豪大酒店,以及温州金球国豪大酒店餐饮预订电话对应的知识点,希望对...
[数据分析与可视化] Pyth... 本文主要介绍GeoPandas的基本使用方法,以绘制简单的地图。GeoPandas是一...
stm32H7内部flash存... 目录一、慎用固件库1.HAL_FLASH_Program有问题,写入不正常2.采用直接...
厦门环岛路客栈(厦门环岛路客栈... 本篇文章极速百科给大家谈谈厦门环岛路客栈,以及厦门环岛路客栈图片对应的知识点,希望对各位有所帮助,不...
欣燕都连锁酒店(欣燕都连锁酒店... 本篇文章极速百科给大家谈谈欣燕都连锁酒店,以及欣燕都连锁酒店北京前门店对应的知识点,希望对各位有所帮...
大连火车站附近旅店(大连火车站... 本篇文章极速百科给大家谈谈大连火车站附近旅店,以及大连火车站附近旅店哪家有小姐对应的知识点,希望对各...
厦门至石家庄机票(厦门到石家庄... 今天给各位分享厦门至石家庄机票的知识,其中也会对厦门到石家庄机票查询进行解释,如果能碰巧解决你现在面...
Web系统优化实战 1. 课程介绍2. 系统优化原理 1.1. Web系统优化概述 1.1.1. 提高网站速度 1.1....
笨鸟学数据结构(绪论) 数据结构的定义按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储...
经典卷积模型回顾24—利用模型... 模型剪枝是指在训练深度学习模型时将某些不重要的部分剪掉,以实现更快速、更高效的模型精度...
关于重庆通信学院的信息 重庆通... 本篇文章极速百科给大家谈谈重庆通信学院,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本...
新民到沈阳的火车(新民到沈阳的... 今天给各位分享新民到沈阳的火车的知识,其中也会对新民到沈阳的火车时间表和票价进行解释,如果能碰巧解决...
中国携程网(中国携程网上订票官... 本篇文章极速百科给大家谈谈中国携程网,以及中国携程网上订票官网对应的知识点,希望对各位有所帮助,不要...
全国各地旅游景点(全国各地旅游... 今天给各位分享全国各地旅游景点的知识,其中也会对全国各地旅游景点大全地图进行解释,如果能碰巧解决你现...
《MongoDB入门教程》第2... 本文将会介绍 MongoDB 复合索引的概念,以及如何创建复合索引。 复合索引 复合索...
Python 关键字globa... 变量作用域 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量。 ...
力扣-《剑指offer》-链表... 目录 第一题:从尾到头打印链表 第二题:删除链表的节点 第三题ÿ...
上海七天快捷酒店(上海七天连锁... 本篇文章极速百科给大家谈谈上海七天快捷酒店,以及上海七天连锁酒店预订对应的知识点,希望对各位有所帮助...
临沂观塘温泉(临沂观塘温泉大酒... 今天给各位分享临沂观塘温泉的知识,其中也会对临沂观塘温泉大酒店进行解释,如果能碰巧解决你现在面临的问...
2min是多少时间 ,2min... 2min是多少时间 目录2min是多少时间 2min是多少时间2min是什么意思2min是多少时间2...
廊坊酒店预订(廊坊酒店多少钱一... 本篇文章极速百科给大家谈谈廊坊酒店预订,以及廊坊酒店多少钱一晚对应的知识点,希望对各位有所帮助,不要...
vuex学习笔记(一) 目录 一、Vuex的介绍 1、简介 2、通俗理解 二、安装,配置Vuex 1、安装 2...
c指针(二) 1.指针和指针变量的关系指针 就是内存的地址编号。指针变量:本质是变量 只是该变量 保...
【并发基础】join()方法底... 目录 一、简介 1.1 作用 1.2 join()方法和join(long timeout)方法的使...
Java操作Zookeeper... 1. Java操作ZooKeeper 引入jar包: org.apache.zoo...
北京宾馆预订(北京宾馆预订携程... 今天给各位分享北京宾馆预订的知识,其中也会对北京宾馆预订携程官网进行解释,如果能碰巧解决你现在面临的...
广州到重庆的火车票(广州到重庆... 今天给各位分享广州到重庆的火车票的知识,其中也会对广州到重庆的火车票价是多少进行解释,如果能碰巧解决...