Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

任务六:学会训练FastText、Word2Vec词向量

  • 说明:在这个任务中,你将学习如何训练FastText和Word2Vec词向量模型,这些词向量模型可以捕捉文本中的语义信息。
  • 实践步骤:
    1. 准备大规模文本语料库。
    2. 使用FastText或gensim库中的Word2Vec类,设置相应的参数(如词向量维度、窗口大小、训练迭代次数等)来构建词向量模型。
    3. 使用Word2Vec类的build_vocab()方法,构建词汇表。
    4. 使用Word2Vec类的train()方法,训练词向量模型。

Word2Vec

word2vec主要包括Skip-Gram和CBOW两种模型。

Skip-Gram是利用一个词语作为输入,来预测它周围的上下文 ,CBOW是利用一个词语的上下文作为输入,来预测这个词语本身 。

word2vec模型其中有两种训练方式:skip-gram与CBOW,此外,还有两种加速训练的trick:hierarchical sofmtmax与negative sampling。
在这里插入图片描述

简单情形

输入:one-hot encoder

隐层:对输入的词求和取平均+线性层

输出:隐层

word2vec的本质:是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示,是一个|V|分类问题。

训练目标: 极小化负对数似然

Tip: CBOW的窗口内部丢掉了词序信息,但是在窗口滑动过程中是按照通顺的自然语言顺序滑动的,或者样本就是按照一定的语序取出来的,所以最终得出的词向量中会包含一定的语序信息。

Word2vec 的训练trick

Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,本质上是一个多分类问题,但实际当中,词语的个数非常非常多,会给计算造成很大困难,所以需要用技巧来加速训练。

  • Word pairs and “phase”: 对常见的单词进行组合或者词组作为单个words来处理(比如"New York","United Stated"

  • **高频词采样:**对高频词进行抽样来减少训练样本的个数(比如the这个词在很多次的窗口中出现吗,他对其他词语义学习的帮助不大,并且,更多包含the的训练数据远远超出了学习the这个词向量所需要的样本数)

  • **负采样:**用来提高训练速度并且改善所得到词向量的质量 。

    随机选取部分词作为负样本(比如当vocab_size为10000时,训练样本 input word:"fox",output word:"quick" ,在9999个负样本的权重中选择5-20个更新,参数大大减少)。

    • 如何选择negative words?

      根据词频进行负采样,出现概率高的单词容易被选为负样本。 每个单词被赋予一个权重。

    • 层次softmax(Hierarchical Softmax)

      在进行最优化的求解过程中:从隐藏层到输出的Softmax层的计算量很大,因为要计算所有词的Softmax概率,再去找概率最大的值。

      word2vec采用了霍夫曼树来代替从隐藏层到输出softmax层的映射 。

      和之前的神经网络语言模型相比,霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为 Hierarchical Softmax

      在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿 着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数, 采用随机梯度上升求解二分类,每计算一个样本更新一次误差函数 。

      使用霍夫曼树有什么好处:

首先,由于是二叉树,之前计算量为V,现在变成了log2V

第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合贪心优化思想。

fasttext

fasttext是基于浅层神经网络训练的,其训练方式与word2vec中的CBOW方式如出一辙,fasttext是对整个句子的n-gram特征相加求平均,得到句向量,在根据句向量做分类。

fasttext的输入:embedding过的单词的词向量和n-gram向量

内存考虑:哈希映射,将n-gram映射到固定K个的索引上,相同的索引共享相同的embedding。

fasttext与word2vec对比

  • fasttext用作分类是有监督的,word2vec是无监督的
  • fasttext输入部分考虑了n-gram特征,word2vec的输入只有one-hot encoder
  • fasttext可以表示oov的单词

word2vec的不足:

  1. 多义词的问题。
  2. Word2vec 是一种静态的方式,无法针对特定任务做动态优化

fasttext的不足:

fastText很难学出词序对句子语义的影响,对复杂任务还是需要用复杂网络学习任务的语义表达。

gensim中word2vec的使用

首先我们先介绍一下gensim中的word2vec API,官方API介绍如下:

class Word2Vec(utils.SaveLoad):
    def __init__(
            self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
            max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
            sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
            trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):

gensim中,word2vec相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:

  • sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出(通过word2vec提供的LineSentence类来读文件,word2vec.LineSentence(filename))。
  • vector_size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
  • window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
  • sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1,则是Skip-Gram模型,默认是0,即CBOW模型。
  • hs: 即我们的word2vec两个解法的选择了,如果是1, 则是Hierarchical Softmax,是0的话并且负采样个数negative大于0, 则是Negative Sampling。默认是0Negative Sampling
  • negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。
  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw��为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw��,默认值也是1,不推荐修改默认值。
  • min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
  • iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025
  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

导入相关库和模块

使用Python导入所需的库和模块。对于FastText,你可以使用FastText库;对于Word2Vec,你可以使用gensim库。

# 导入FastText库
from gensim.models.fasttext import FastText

# 导入Word2Vec库
from gensim.models import Word2Vec

训练Word2Vec

简单样例

首先我们可以设置模型参数并构建词向量模型:为模型选择适当的参数,例如词向量维度、窗口大小、训练迭代次数等。然后,使用FastText或Word2Vec类创建词向量模型。这里是一个比较小的样例,这样就可以进行训练我们的Word2Vec模型

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

model = Word2Vec(sentences=common_texts,vector_size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")

在上面的示例中,size 参数表示词向量的维度,window 参数表示词语的上下文窗口大小,min_count 参数表示词语在语料库中的最低出现次数。

构建词汇表

构建词汇表:使用Word2Vec类的 build_vocab() 方法,根据语料库构建词汇表。

这里我们可以根据我们的数据的content,构建一个词汇表,为接下来的训练做准备

contents = train_data['content'].apply(lambda x:x.split(' ')).tolist() # contents字段
model = Word2Vec(min_count=1)
model.build_vocab(contents)  # prepare the model vocabulary

训练模型

训练词向量模型:使用Word2Vec类的 train() 方法,对词向量模型进行训练。

# 训练Word2Vec词向量模型
model.train(contents, total_examples=model.corpus_count, epochs=model.epochs)  # train word vectors
model.save("word2vec.model")

在上面的示例中,cpmtents 是训练数据,total_examples 表示语料库的总样本数,epochs 表示训练迭代次数。这些也可以在定义模型的到时候修改一下参数,这里我们使用的是默认参数

训练过程会根据语料库中的文本数据来更新词向量模型的权重和参数,使得模型能够学习到词语之间的语义信息。

完成以上步骤后,你将得到训练好的FastText或Word2Vec词向量模型,可以使用它们来获取词语的向量表示,进行词语相似度计算、文本分类等自然语言处理任务。

预训练模型

Gensim在Gensim-data资源库中附带了几个已经预先训练好的模型

为了能得到更好的结果,所以如果利用一些预训练的Word2Vec可能会得到更好的结果,所以这里我们也可以下载一些已有的模型

import gensim.downloader

print(list(gensim.downloader.info()['models'].keys()))      # 在gensim-data中显示所有可用的模型
['fasttext-wiki-news-subwords-300', 'conceptnet-numberbatch-17-06-300', 'word2vec-ruscorpora-300', 'word2vec-google-news-300', 'glove-wiki-gigaword-50', 'glove-wiki-gigaword-100', 'glove-wiki-gigaword-200', 'glove-wiki-gigaword-300', 'glove-twitter-25', 'glove-twitter-50', 'glove-twitter-100', 'glove-twitter-200', '__testing_word2vec-matrix-synopsis']
glove_vectors = gensim.downloader.load('glove-twitter-25')      # 下载 "glove-twitter-25 "的嵌入
print(glove_vectors.most_similar('twitter'))      # 照常使用下载的向量

在这里我们使用的还是word2vec的模型,所以选取一个比较好的word2vec的模型进行微调,不过这里也会有一个缺陷,由于比赛的数据是已经经过处理的,所以其实很难看出原有的意思表示,所以来说,不一定能得到一个比较好的结果,不过可以先进行尝试

使用训练好的模型预测

import gensim
model = gensim.models.Word2Vec.load('word2vec.model')
#查看某个字词的向量:
print(model['5212'])
#查看与该词最接近的其他词汇及相似度:
print(model.most_similar(['0']))
#查看两个词之间的相似度:
model.similarity('5212','0')
[-5.3622725e-04  2.3643016e-04  5.1033497e-03  9.0092728e-03
 -9.3029495e-03 -7.1168090e-03  6.4588715e-03  8.9729885e-03
 -5.0154282e-03 -3.7633730e-03  7.3805046e-03 -1.5334726e-03
 -4.5366143e-03  6.5540504e-03 -4.8601604e-03 -1.8160177e-03
  2.8765798e-03  9.9187379e-04 -8.2852151e-03 -9.4488189e-03
  7.3117660e-03  5.0702621e-03  6.7576934e-03  7.6286553e-04
  6.3508893e-03 -3.4053659e-03 -9.4640255e-04  5.7685734e-03
 -7.5216386e-03 -3.9361049e-03 -7.5115822e-03 -9.3004224e-04
  9.5381187e-03 -7.3191668e-03 -2.3337698e-03 -1.9377422e-03
  8.0774352e-03 -5.9308959e-03  4.5161247e-05 -4.7537349e-03
 -9.6035507e-03  5.0072931e-03 -8.7595871e-03 -4.3918253e-03
 -3.5099984e-05 -2.9618264e-04 -7.6612402e-03  9.6147414e-03
  4.9820566e-03  9.2331432e-03 -8.1579182e-03  4.4957972e-03
 -4.1370774e-03  8.2453492e-04  8.4986184e-03 -4.4621779e-03
  4.5175003e-03 -6.7869616e-03 -3.5484887e-03  9.3985079e-03
 -1.5776539e-03  3.2137157e-04 -4.1406299e-03 -7.6826881e-03
 -1.5080094e-03  2.4697948e-03 -8.8802812e-04  5.5336617e-03
 -2.7429771e-03  2.2600652e-03  5.4557943e-03  8.3459523e-03
 -1.4537406e-03 -9.2081428e-03  4.3705511e-03  5.7178497e-04
  7.4419067e-03 -8.1328390e-04 -2.6384138e-03 -8.7530091e-03
 -8.5655687e-04  2.8265619e-03  5.4014279e-03  7.0526553e-03
 -5.7031228e-03  1.8588186e-03  6.0888622e-03 -4.7980524e-03
 -3.1072616e-03  6.7976285e-03  1.6314745e-03  1.8991709e-04
  3.4736372e-03  2.1777629e-04  9.6188262e-03  5.0606038e-03
 -8.9173913e-03 -7.0415614e-03  9.0145587e-04  6.3925339e-03]
[('4952', 0.37755849957466125), ('2195', 0.3286932408809662), ('4369', 0.32638630270957947), ('5137', 0.3003348112106323), ('4682', 0.29854971170425415), ('4130', 0.27968209981918335), ('97', 0.2749629318714142), ('339', 0.27286359667778015), ('3541', 0.27277031540870667), ('4780', 0.2706093490123749)]
-0.027750365

参考

  • https://xiaomindog.github.io/2021/06/22/word2vec-and-fastText/
  • Word2Vec Tutorial - The Skip-Gram Model
  • 秒懂词向量Word2vec的本质
  • https://radimrehurek.com/gensim/models/word2vec.html
  • gensim word2vec库入门——官方手册embeddings和KeyedVectors

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/37968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux地盘上AMD处理器称王了

近日资讯,尽管从全局来看,Linux系统份额远不及Windows,但在程序员、开发者、硬核玩家圈子,Linux则备受推崇。 来自Steam的最新数据显示,在Linux游戏用户中,AMD处理器的份额占据绝对优势,达到了…

ts学习(一):基础篇1

旨在记录! 这篇人都学废了,本想记录常用类型,越学越多,每一个都很重要… 一、string: 字符串类型二、number: 数字类型三、boolean: 布尔值四、array:数组五、tuple: 元组六、字面量七、object:对象八、any: 任意类型九、unknown:…

Spring MVC文件上传

Spring MVC文件上传 Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。 1. MultipartResolver接口 在 Spring MVC 中实现文件上传十分容易…

云和DevOps如何帮助加速数字化转型?

1.云和 DevOps:概述 数字化转型已成为寻求在现代时代蓬勃发展的企业的一项关键举措。为了加速这一转型,组织正在利用云计算的力量并采用DevOps实践。云计算提供可扩展且灵活的基础架构,而 DevOps 则支持协作和持续交付的文化。本文将探讨云和…

MySQL:数据的增删改查

数据的增删改查 前言一、插入数据1、实际问题2、方式1:VALUES的方式添加3、方式2:将查询结果插入到表中 二、删除数据三、更新数据四、查询数据五、MySQL8新特性:计算列 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知…

PyTorch中的torch.nn.Linear函数解析

torch.nn是包含了构筑神经网络结构基本元素的包,在这个包中,可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层,可以实现形如yXweight^Tb的加和功能。 nn.Linear():…

数据库的分片策略

数据库的分片策略 1、范围分片2、hash 取模分片3、一致性hash 分片 1.分片策略 数据库的分片策略是指将数据库中的数据按照一定的规则和方式进行分割(分片)存储在不同的物理节点或服务器上的策略。分片策略旨在实现水平扩展,提高数据库的性…

前端下载PDF内容空白且大小偏大问题解决

前端使用React框架axios请求后端接口下载文件,请求返回正常但文件大小和内容异常。经排查,其原因是使用了mockjs用作数据模拟,导致了请求异常,将其注释掉后,文件大小与内容恢复正常。 目录 1.文件异常 2.定位问题 3…

【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 开发环境:windows10虚拟机:VirtualBox 7.0.8 二、报错 ubun…

汽车销售数据可视化分析实战

1、任务 市场需求:各年度汽车总销量及环比,各车类、级别车辆销量及环比 消费能力/价位认知:车辆销售规模及环比、不同价位车销量及环比 企业/品牌竞争:各车系、厂商、品牌车销量及环比,市占率及变化趋势 热销车型&…

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址:https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…

亚马逊云科技,加速生成式AI的落地

编辑:阿冒 设计:沐由 “展望今天的世界,在机遇之外,更多事后我们看到的是前所未有的巨大挑战。事实证明,惟有通过创新、专注创新,方能挖掘和发现更多的增长机会。” 在2023亚马逊云科技中国峰会的第二天&am…

OpenCV(图像处理)-图片搜索

图片搜索 1.知识介绍2.实现流程2.1 计算特征点与描述子2.2 描述子的匹配2.3 求出单应性矩阵并画出轮廓2.4 将特征点标出 此篇博客作者仍在探索阶段,还有一些模糊的概念没有弄懂,请读者自行分辨。 1.知识介绍 Opencv进行图片搜索需要的知识有&#xff1…

MWeb Pro for Mac(苹果电脑最好用的Markdown编辑器)安装教程

MWeb Pro是一款专业的Mac平台上的Markdown编辑器,可以帮助用户更加高效地书写和排版文本内容,支持多种文本格式的导入和导出,如HTML、RTF、PDF等,还支持实时预览和代码高亮等功能,为用户提供了非常优秀的Markdown编辑体…

Linux与Windows:操作系统的比较与技巧分享

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

校园跑腿小程序都包括哪些业务呢?

校园创业,大家都知道,一直以来是个非常火热的话题,每位步入大学校园的学子们都有过在校创业的想法,包括我们一些有着学校资源的社会创业者们,早已经看好了中国高校这块巨大的市场。 在这里,我要跟大家分享…

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用

近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

用Python画一面五星红旗

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

Tomcat工作原理

一、Tomcat架构 ### 说明: Server:表示整个 Tomcat Catalina servlet 容器,Server 中可以有多个 Service。(可以通过telenet 8005后连接后输入“SHUTDOWN” 注意这里是大写,来关闭服务)Service&#xff1…

Linux进程信号【信号处理】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、信号的处理时机1.1、处理情况1.2、"合适" 的时机 2、用户态与内…