达观杯数据竞赛项目--初识word2vec

2023-10-31 15:11

本文主要是介绍达观杯数据竞赛项目--初识word2vec,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 初识词向量表示:word2vec
    • 1. 课程计划
      • 1.1 词义(word meaning)
      • 构造词汇的相似性关系(distributional learning)
      • 1.2 word2vec简介
        • 1.2.1 Skip-gram model
        • 1.2.2 Skip-gram 框架结构
        • 1.2.3 参数矩阵更新的相关推导
      • 1.3 小结
    • 2 gensim实现word2vec
      • 2.1 gensim 简介
      • 2.2 基于model的一些操作
      • 2.3 竞赛数据分词
  • 3. 参考资料

初识词向量表示:word2vec

  • CS224n 斯坦福NLP视频课程内容==》link

1. 课程计划

1.1 词义(word meaning)

词义通常是通单词、短语等表示的想法;在语言学中,单词像是一种语言学符号,用于指代某些具体的物品。

在计算机中常用分类资源来处理词义,例如用WordNet来处理英语词语的分类,包括查询上义词和同义词等。wordnet作为一个资源词典固然很好,但仍存在一些问题,例如:语义之间细微的差别(如同义词)、不能自动更新、缺少主观的选择、很难对词汇的相似性给出准确定义;这是离散化表征普遍存在的一个问题。

在现阶段的NLP研究中常使用原子符号去表征单词,就是常说的one_hot,但这种表述没有表示出任何词汇之间的内在关系概念,例如:web搜索中,我们想搜索Seattle motel,那么最终的匹配可以是"seattle hotel",因为 motel 和 hotel 是近义词,但one
hot 编码输出的两个vector 点积为0,即认为两者没有内在的联系。因此为解决这种问题,我们必须建立词汇之间的相似性关系。

构造词汇的相似性关系(distributional learning)

distributional similarity 分布相似性是指可以通过观察上下文得到大量表示某个词汇含义的值,基于此概念,为每个单词构造一个稠密向量,使之预测目标单词所在文本的其他词汇。

1.2 word2vec简介

我们通常会定义一个模型并根据中心词汇wt 预测它上下文的词汇w_t 来学习神经词嵌入问题,loss function = 1 - p(w_t | wt) ,word2vec 的基本应用是利用语言的意义理论去预测中心词汇和上下文的单词。目前,word2vec 已经被编译成一套软件,包含两个用于生成词汇向量的算法(Skip-gram 和 Continuous Bag of Words)及两套效率中等的训练方法(Hierarchical softmax 和 Negative sampling),故在提及word2vec时指的是其背后用于计算vector的skip_gram和CBoW模型

两种模型:

  • skip-gram : 预测上下文
  • CBOW : 预测目标单词

CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。
CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好

两种高效的训练方法:

  • Hierarchical softmax
  • Negative sampling
1.2.1 Skip-gram model

在每一个估算步都取一个词作为中心词汇,用概率表示某个单词在中心词上下文出现的概率,这里选取词汇的向量表示以让概率分布值最大化。

需注意对同一个词汇有且仅有一个条件概率分布(词袋模型,与位置无关)
在这里插入图片描述
目标函数:计算每个词在给定中心词附近(步长为m的窗口内)出现的最大概率
在这里插入图片描述
其中m为窗口大小,theta 表示词向量;在实际求解时将目标函数做一个对数似然的转化,得到在这里插入图片描述

  • 求解 p ( w t + j ∣ w j ) p(w_{t+j}|w_j) p(wt+jwj)
    根据由单词向量构造而成的中心词汇 求解 上下文的概率分布。
    在这里插入图片描述
    这里的o是outside(或者output)单词索引(下标),c是中心词的索引(下标), U o U_o Uo是索引为o的单词所对应的向量, V c V_c Vc是中心词汇对应向量

注:处理上下文文本时,关心的仅仅是该单词的ID在窗口中的位置

上下文条件概率 p ( w t + j ∣ w j ) p(w_{t+j}|w_j) p(wt+jwj)采用 softmax 函数去构造概率分布:利用点积去衡量相似性,利用softmax将实数域等比例映射到概率范围

softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道;这种选择作用类似于max函数

1.2.2 Skip-gram 框架结构

下图为一个完整的Skip-gram 模型
在这里插入图片描述
首先输入 中心词的one-hot词向量 w t w_t wt,将其乘以weight Matrix (W) ,得到中心词的词义表达 V c = W w t V_c = W_{w_t} Vc=Wwt,再乘以临近词(context word)的weight Matrix 矩阵W’ 得到对每个词语的“相似度”,对相似度取softmax得到概率。

最终要求的就是两个矩阵W和W’,在训练完毕之后,W和W’均包含一定的语义信息。

1.2.3 参数矩阵更新的相关推导

在这里插入图片描述
上述是对中心词部分的求导,还需对 u o u_o uo求导
实际上对 v c v_c vc求偏导是为了计算W的梯度,对 u o u_o uo求偏导是为了计算W‘的梯度,用于后续的参数更新。下图是link给出的一个推导:
在这里插入图片描述

1.3 小结

word2vec是基于网络的一种无监督模型,从语料库中随机抽取某个句子中的某个词 w c w_c wc,将中心词前后m个单词的集合作为一个window。skip-gram模型希望预测 w c w_c wc 附近是什么词,而CBOW模型希望用window中的词预测 w c w_c wc

2 gensim实现word2vec

2.1 gensim 简介

Gensim是一款用于处理NLP的python包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。

它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,
支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口

使用gensim做Word2vec时,只需调用gensim.models.Word2Vec()函数即可,这里主要介绍一些模型内部的参数,参考link。

gensim 的 word2vec常规用法:

from gensim.models import word2vecmodel = word2vec.Word2Vec(sentences=text, size=100,min_count=5, workers=8, sg=0, iter=5)
# 训练skip-gram模型;默认window=5

默认参数列表:

参数名用法
sentences=None训练文本(单位:句)
size=100训练时向量的长度(one-hot的长度?)
alpha=0.025学习率 lr
window=5窗口大小
min_count=5字典截断,词频少于min_count次数的单词会被丢弃掉
max_vocab_size=None词向量构建期间的RAM限制。如果所有不重复单词个数超过这个值,则就消除掉其中最不频繁的一个,None表示没有限制
sample=1e-3高频词汇的随机负采样的配置阈值,默认为1e-3,范围是(0,1e-5)
seed=1用于随机数发生器。与初始化词向量有关
workers=3设置多线程训练模型,机器的核数越多,训练越快
min_alpha=0.0001字典截断,词出现概率少于min_alpha的单词会被丢弃掉
sg=0训练时用的算法,当为0时采用的是CBOW算法,当为1时会采用skip-gram
hs=0若为1则采用hierarchica·softmax策略,若为0(默认值),则负采样策略会被使用
negative=5若大于0,就采用负采样,此时该值的大小就表示有多少个“noise words”被使用,通常设置在(5-20),默认是5,若该值为0,则表示不采用负采样
cbow_mean=1在采用cbow模型时,此值如果是0,就会使用上下文词向量的和,如果是1(默认值),就会采用均值
hashfxn=hashhash函数来初始化权重。默认使用python的hash函数
iter=5迭代次数
trim_rule=None用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受(word, count, min_count)并返回utils.RULE_DISCARD,utils.RULE_KEEP或者utils.RULE_DEFAULT,这个设置只会用在构建词典的时候,不会成为模型的一部分
sorted_vocab=1如果为1,则在分配word index 的时候会先对单词基于频率降序排序。
batch_words=MAX_WORDS_IN_BATCH每一批传递给每个线程单词的数量,默认为10000,如果超过该值,则会被截断

Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值

2.2 基于model的一些操作

以达观杯的训练数据为例:

  • 获取特定词的词向量
print('word vector of'+text[1][1]+'is :')
print(model[text[1][1]]) #获取指定词的词向量
  • 计算两个词之间的相似度
model.similarity(text[1][3], text[3][1])
  • 计算某个词的相关词列表
model.most_similar(text[1][2], topn=20)  # 20个最相关的
  • 寻找离群词
model.doesnt_match("书 书籍 教材 很".split())
  • 保存模型
 model.save("name.model")
  • 对应的加载方式
model = word2vec.Word2Vec.load("name.model")

2.3 竞赛数据分词

# 数据预处理:去除空格,句子转化为list
def sentence2list(sentence):return sentence.strip().split() # 去除空格后拆分# 准备数据
sentence_train = list(df_train['word_seg'].apply(sentence2list)) #数据格式为df,运用apply()对每列数据做处理
sentence_test = list(df_test['word_seg'].apply(sentence2list))
text = sentence_train + sentence_test
print('准备数据完成!')# 训练模型
model = word2vec.Word2Vec(sentences=text, size=100,min_count=5, workers=8, sg=1, iter=5)
# 训练skip-gram模型;默认window=5# 提取词汇表
wv = model.wv # 单词权重
vocab_list = wv.index2word
word_idx_dict = {}
for idx, word in enumerate(vocab_list):word_idx_dict[word] = idxvectors_arr = wv.vectors 
vectors_arr = np.concatenate((np.zeros(100)[np.newaxis, :], vectors_arr), axis=0)#第0位置的vector为'unk'的vectorfeature_path = 'D:\\NLP_datasets\\daguan'
f_wordidx = open(feature_path + 'word_seg_word_idx_dict.pkl', 'wb') # 记录词序
f_vectors = open(feature_path + 'word_seg_vectors_arr.pkl', 'wb') # 记录词向量
pickle.dump(word_idx_dict, f_wordidx)
pickle.dump(vectors_arr, f_vectors)
f_wordidx.close()
f_vectors.close()
print("训练结果已保存到该目录下! ")

np.newaxis 在这一位置增加一个一维
x1 = np.array([1, 2, 3, 4, 5]) # shape is (5,)
x1_new = x1[:, np.newaxis] # shape is (1,5),有reshape 的作用

3. 参考资料

word2vec详解:
1)https://blog.csdn.net/u014665013/article/details/79128010
2)https://zhuanlan.zhihu.com/p/56176647
gensim简介:
3)https://www.jianshu.com/p/9ac0075cc4c0
word2vec多种实现方式:
4)https://www.jianshu.com/p/972d0db609f2
5)https://github.com/Heitao5200/DGB/blob/master/feature/feature_code/train_word2vec.py

这篇关于达观杯数据竞赛项目--初识word2vec的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316241

相关文章

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤