深度学习每周学习总结N5:调用Gensim库训练Word2Vec模型

目录

    • 0. 总结:
    • 1. 关于`nn.Embedding()`, `nn.EmbeddingBag()`, 和 `word2vec`
      • nn.Embedding()
      • nn.EmbeddingBag()
      • Word2Vec
      • 联系与区别
    • 2. 调用Gensim库训练Word2Vec模型
      • 准备工作
      • 对原始语料分词
      • 训练模型
      • 模型应用
        • 计算词汇相似度
        • 找出不匹配的词汇
        • 计算词汇的词频
      • 提问:
        • 问:每次运行得到的相似度都不一样正常吗 答:正常,可以通过设置随机种子保证结果一致

0. 总结:

之前有学习过文本预处理的环节,对文本处理的主要方式有以下三种:

1:词袋模型(one-hot编码)

2:TF-IDF

3:Word2Vec(词向量(Word Embedding) 以及Word2vec(Word Embedding 的方法之一))

详细介绍及中英文分词详见pytorch文本分类(一):文本预处理

上上上期主要介绍Embedding,及EmbeddingBag 使用示例(对词索引向量转化为词嵌入向量) ,上上期主要介绍:应用三种模型的英文分类

上期将主要介绍中文基本分类(熟悉流程)、拓展:textCNN分类(通用模型)、拓展:Bert分类(模型进阶)

本期主要介绍Word2Vec,和nn.Embedding(), nn.EmbeddingBag()相比都是嵌入技术,用于将离散的词语或符号映射到连续的向量空间。

nn.Embeddingnn.EmbeddingBag 是深度学习框架(如 PyTorch)中的层,直接用于神经网络模型中,而 Word2Vec 是一种独立的词嵌入算法。

使用来说,如果需要在神经网络中处理变长序列的嵌入,可以选择 nn.EmbeddingBag;如果需要预训练词嵌入用于不同任务,可以选择 Word2Vec

1. 关于nn.Embedding(), nn.EmbeddingBag(), 和 word2vec

都是嵌入技术,用于将离散的词语或符号映射到连续的向量空间。虽然它们的目的相似,但它们的实现和使用场景有明显的区别。

nn.Embedding()

nn.Embedding 是 PyTorch 提供的一种层,用于将输入的索引映射到高维向量。每个输入的索引对应一个固定的向量。

  • 特点:
    简单映射:将输入的词索引直接映射到嵌入向量。
    训练:可以通过反向传播算法训练嵌入向量。
    应用:常用于处理自然语言处理中的词嵌入,输入一个批次的词索引,输出对应的嵌入向量。

  • 示例代码:

import torch
import torch.nn as nn# 定义一个具有 10 个词汇,每个词汇被映射到 3 维向量空间的嵌入层
embedding = nn.Embedding(10, 3)# 输入一个词汇索引,输出对应的嵌入向量
input_indices = torch.LongTensor([1, 2, 3, 4])
output = embedding(input_indices)
print(output)

nn.EmbeddingBag()

nn.EmbeddingBagnn.Embedding 的变体,通常用于处理可变长度序列的嵌入。

  • 特点:
    加权求和:将输入索引对应的嵌入向量加权求和,默认不使用权重时就是求平均。
    无padding处理:可以避免填充操作,直接处理变长序列。
    应用:常用于文本分类等需要对变长文本序列进行聚合的任务。

  • 示例代码:

import torch
import torch.nn as nn# 定义一个具有 10 个词汇,每个词汇被映射到 3 维向量空间的嵌入层
embedding_bag = nn.EmbeddingBag(10, 3, mode='mean')# 输入索引和偏移量
input_indices = torch.LongTensor([1, 2, 3, 4])
offsets = torch.LongTensor([0, 2])# 输出对应的嵌入向量的平均值
output = embedding_bag(input_indices, offsets)
print(output)

Word2Vec

Word2Vec 是一种独立于深度学习框架的词嵌入算法,由 Google 提出。Word2Vec 有两个主要的变体:CBOW(Continuous Bag of Words)和 Skip-gram。

  • 特点:
    CBOW:通过上下文词预测目标词。
    Skip-gram:通过目标词预测上下文词。
    预训练模型Word2Vec 通常用于预训练词嵌入,可以在大规模语料上预训练,然后在特定任务中微调。
    独立实现:可以在 gensim 或其他库中使用,不需要特定的深度学习框架。

  • 示例代码(使用 gensim):

from gensim.models import Word2Vec# 示例语料
sentences = [['first', 'sentence'], ['second', 'sentence']]# 训练 Word2Vec 模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)# 获取词嵌入向量
vector = model.wv['sentence']
print(vector)

联系与区别

  • 相似点

    • nn.EmbeddingWord2Vec 都将词索引或词语映射到高维向量。
    • 它们都可以通过训练数据来学习嵌入向量。
  • 区别点

    • nn.Embeddingnn.EmbeddingBag 是深度学习框架(如 PyTorch)中的层,直接用于神经网络模型中,而 Word2Vec 是一种独立的词嵌入算法。
    • nn.EmbeddingBag 通过聚合(如求和或平均)处理变长序列,而 nn.Embedding 只能处理固定长度的输入。
    • Word2Vec 通常用于预训练嵌入,并可以在多个任务中复用,而 nn.Embeddingnn.EmbeddingBag 通常在特定任务中训练。

这些工具的选择取决于具体的应用场景和需求。例如,如果需要在神经网络中处理变长序列的嵌入,可以选择 nn.EmbeddingBag;如果需要预训练词嵌入用于不同任务,可以选择 Word2Vec

2. 调用Gensim库训练Word2Vec模型

准备工作

# 安装Gensim库
!pip install gensim
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: gensim in c:\programdata\anaconda3\lib\site-packages (4.1.2)
Requirement already satisfied: numpy>=1.17.0 in c:\users\chengyuanting\appdata\roaming\python\python39\site-packages (from gensim) (1.22.4)
Requirement already satisfied: smart-open>=1.8.1 in c:\programdata\anaconda3\lib\site-packages (from gensim) (5.1.0)
Requirement already satisfied: scipy>=0.18.1 in c:\users\chengyuanting\appdata\roaming\python\python39\site-packages (from gensim) (1.8.0)

对原始语料分词

import jieba
import jieba.analysejieba.suggest_freq('沙瑞金', True) # 加入一些词,使得jieba分词准确率更高
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('赵德汉', True)with open('./data/in_the_name_of_people.txt',encoding = 'utf-8') as f:result_cut = []lines = f.readlines()  # 读取的内容存储在 lines 列表中,每一行作为列表的一个元素。for line in lines:result_cut.append(list(jieba.cut(line))) # 对文件的每一行使用 jieba.cut 函数进行分词,并将分词结果(一个词列表)添加到 result_cut 列表中f.close()
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\CHENGY~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.583 seconds.
Prefix dict has been built successfully.
  • 这里使用 jieba.suggest_freq 函数来调整某些词语的词频,使得这些词语在分词时更准确。这对于一些特定的名字或短语尤为重要。参数 True 表示强制调整这些词语的词频

  • 批量添加指定词汇方法:

import jieba# 定义需要添加的词语列表
words_to_add = ['沙瑞金', '田国富', '高育良', '侯亮平', '钟小艾','陈岩石', '欧阳菁', '易学习', '王大路', '蔡成功','孙连城', '季昌明', '丁义珍', '郑西坡', '赵东来','高小琴', '赵瑞龙', '林华华', '陆亦可', '刘新建','刘庆祝', '赵德汉'
]# 批量添加词语
for word in words_to_add:jieba.add_word(word, freq=100000, tag='n')
# 添加自定义停用词
stopwords_list = [",","。","\n","\u3000"," ",":","!","?","…"]def remove_stopwords(ls):  # 去除停用词return [word for word in ls if word not in stopwords_list]result_stop=[remove_stopwords(x) for x in result_cut if remove_stopwords(x)]

拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词,仅仅去掉一些标点符号,做一个简单的数据清洗。
现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。在实际应用中,可以调参提高词的embedding的效果。

print(result_stop[100:103])
[['侯亮平', '也', '很', '幽默', '一把', '抓住', '了', '赵德汉', '的', '手', '哎', '赵', '处长', '我', '既', '来', '了', '还', '真', '舍不得', '和', '你', '马上', '就', '分手', '哩', '咱们', '去', '下', '一个点', '吧', '说', '罢', '从', '赵家', '桌上', '杂物', '筐', '里', '准确', '地', '拿出', '一张', '白色', '门卡', '插到', '了', '赵德汉', '的', '上衣', '口袋', '里'], ['赵德汉', '慌', '了', '忙', '把门', '卡往', '外', '掏', '这', '这', '什么', '呀', '这', '是'], ['你', '帝京', '苑', '豪宅', '的', '门', '卡', '啊', '请', '继续', '配合', '我们', '执行公务', '吧']]

训练模型

import gensim
from gensim.models import Word2Vecmodel = Word2Vec(result_stop,     # 用于训练的语料数据vector_size=100, # 是指特征向量的维度,默认为100。window=5,        # 一个句子中当前单词和被预测单词的最大距离。min_count=1)     # 可以对字典做截断,词频少于min_count次数的单词会被丢弃掉, 默认值为5。
  • 参数解析:
  1. result_stop:用于训练的语料数据。应该是一个包含分词后的句子的列表,每个句子本身是一个词列表。例如:[['word1', 'word2', ...], ['word3', 'word4', ...], ...]

  2. vector_size:生成词向量的维度。默认值是100。这个参数决定了每个词被表示成多少维的向量。

  3. window:窗口大小,表示当前词语与预测词语之间的最大距离。在训练过程中,模型会考虑窗口范围内的词作为上下文。

  4. min_count:忽略词频少于 min_count 的词。默认值是5。设为1意味着所有词语都会被考虑,不会丢弃低频词。

  • 示例代码
    假设 result_stop 已经定义为一个包含预处理后的文本数据的列表:
import gensim
from gensim.models import Word2Vec# 示例分词后的语料数据
result_stop = [['沙瑞金', '田国富', '高育良'],['侯亮平', '钟小艾', '陈岩石'],['欧阳菁', '易学习', '王大路'],['蔡成功', '孙连城', '季昌明'],# 更多的分词数据
]# 训练 Word2Vec 模型
model = Word2Vec(result_stop,     # 用于训练的语料数据vector_size=100, # 特征向量的维度,默认为100。window=5,        # 当前单词和被预测单词的最大距离。min_count=1)     # 词频少于min_count次数的单词会被丢弃掉, 默认值为5。# 保存模型
model.save("word2vec_model.model")# 加载模型
loaded_model = Word2Vec.load("word2vec_model.model")# 获取某个词的词向量
vector = loaded_model.wv['沙瑞金']
print(vector)# 找到与某个词最相似的词
similar_words = loaded_model.wv.most_similar('沙瑞金')
print(similar_words)

模型应用

计算词汇相似度

我们可以使用similarity()方法计算两个词汇之间的余弦相似度。

print(model.wv.similarity('沙瑞金','季昌明'))
print(model.wv.similarity('沙瑞金','田国富'))
0.9994391
0.9995074
# 选出最相似的5个词
for e in model.wv.most_similar(positive=['沙瑞金'],topn=5):print(e[0],e[1])
这位 0.9998624324798584
大 0.9997861385345459
领导 0.9997762441635132
个 0.999770998954773
政治 0.9997647404670715
找出不匹配的词汇

使用doesnt_match()方法,我们可以找到一组词汇中与其他词汇不匹配的词汇。

odd_word = model.wv.doesnt_match('["苹果","香蕉","猴子","书"]')
print(f"在这组词汇中不匹配的词汇:{odd_word}")
在这组词汇中不匹配的词汇:子

计算词汇的词频

我们可以使用get_vecattr()方法获取词汇的词频。

word_frequency = model.wv.get_vecattr("沙瑞金","count")
print(f"沙瑞金:{word_frequency}")
沙瑞金:353

提问:

问:每次运行得到的相似度都不一样正常吗 答:正常,可以通过设置随机种子保证结果一致

每次运行 Word2Vec 模型训练时,如果没有设置随机种子(seed),模型的初始化和训练过程会有随机性,因此得到的词向量和相似度结果可能会有所不同。为了确保每次运行得到的结果一致,可以设置随机种子。

下面是如何设置随机种子的示例代码:

import gensim
from gensim.models import Word2Vec# 示例分词后的语料数据
result_stop = [['沙瑞金', '田国富', '高育良'],['侯亮平', '钟小艾', '陈岩石'],['欧阳菁', '易学习', '王大路'],['蔡成功', '孙连城', '季昌明'],# 更多的分词数据
]# 设置随机种子以确保结果一致
seed = 42# 训练 Word2Vec 模型
model = Word2Vec(result_stop,     # 用于训练的语料数据vector_size=100, # 特征向量的维度,默认为100。window=5,        # 当前单词和被预测单词的最大距离。min_count=1,     # 词频少于min_count次数的单词会被丢弃掉, 默认值为5。seed=seed)       # 设置随机种子# 保存模型
model.save("word2vec_model.model")# 加载模型
loaded_model = Word2Vec.load("word2vec_model.model")# 获取某个词的词向量
vector = loaded_model.wv['沙瑞金']
print(vector)# 找到与某个词最相似的词
similar_words = loaded_model.wv.most_similar('沙瑞金')
print(similar_words)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全方位数据管理:一站式爬虫服务解决方案

摘要 面对互联网信息爆炸的时代,如何高效地收集、整理并分析海量数据,成为企业与开发者面临的一大挑战。本文将深入探讨一站式爬虫服务解决方案,揭示如何通过全方位数据管理策略,助力企业轻松驾驭大数据海洋,实现数据…

专业视频拍摄与编辑SDK,定制专属视频解决方案

无论是社交媒体营销、产品展示、教育培训还是直播电商,高质量的视频内容都是吸引眼球、传递信息的关键。美摄科技,作为视频编辑处理领域的佼佼者,以其强大的视频拍摄与编辑SDK,为企业开启了视觉创意的新篇章。 【专业级功能&…

web3d值得学习并长期发展,性价比高吗?

在数字化浪潮日益汹涌的今天,Web3D技术以其独特的魅力和广泛的应用前景,逐渐成为技术领域的焦点。对于许多热衷于技术探索和创新的人来说,学习并长期发展Web3D技术无疑是一个值得考虑的选择。那么,Web3D技术的学习和发展究竟是否性…

WHAT - 不同 HTTP Methods 使用场景、使用方法和可能遇到的问题

目录 前言基本介绍具体介绍前置知识:幂等和非幂等幂等操作非幂等操作幂等性和非幂等性的应用场景总结 1. GET2. POST3. PUT4. PATCH1. 确保操作是幂等的2. 使用版本控制或条件更新3. 全量更新部分属性4. 使用特定操作指令5. 幂等标识符示例代码总结 5. DELETE6. HEA…

07 JSP

文章目录 JSP1、JSP 概述2、JSP 脚本和缺点3、EL 表达式4、JSTL标签5、MVC模式和三层架构6、案例 JSP 1、JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面 (1)是一种动态的网页技术 (2&…

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现unordered 的奥秘 🌹🌹期待您的关注 🌹🌹 ❀哈希应用 &#x1f4…

C++中的虚函数与多态机制如何工作?

在C中,虚函数和多态机制是实现面向对象编程的重要概念。 虚函数是在基类中声明的函数,可以在派生类中进行重写。当基类的指针或引用指向派生类的对象时,通过调用虚函数可以实现动态绑定,即在运行时确定要调用的函数。 多态是指通…

Cocos Creator 小游戏案例

最近在计划学习小游戏开发,查阅了一些资料,也找到了许多有趣的案例,特此记录与大家分享。 1. 连点成线 http://game.zaiwuchuan.com/yibihua 2. 颜色分类 http://game.zaiwuchuan.com/zhaoxiansuo 3. 星空一笔画 http://game.zaiwuchu…

大模型llama结构技术点分享;transformer模型常见知识点nlp面经

1、大模型llama3技术点 参考:https://www.zhihu.com/question/662354435/answer/3572364267 Llama1-3,数据tokens从1-2T到15T;使用了MHA(GQA缓存);上下文长度从2-4-8K;应用了强化学习对其。 1、pretraini…

分布式事务(典型的分布式事务场景+CAP+解决方案)

分布式事务与分布式锁的区别: 分布式锁解决的是分布式资源抢占的问题;分布式事务和本地事务是解决流程化提交问题。 SQL中的4个事务隔离级别:(1)读未提交(2)读已提交(3&#xff09…

如何远程开发完整分析一台新能源车BMS电池管理系统CAN数据矩阵

随着我国新能源汽车的崛起,从网络管理平台、数据中心、科研机构、高校教学、车型对标、整车DBC控制策略分析、电池管理系统研究、电池健康管理、网约车管理、电池梯度利用、车队管理等多方面的市场需求,完整分析一台新能源车BMS电池管理系统的CAN矩阵开发…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…

生成式AI与自然语言处理的结合-提升生成式AI的语言理解能力

引言 近年来,生成式AI已逐渐成为科技发展的前沿领域,其未来发展方向备受关注。对于人类生活和工作方式的影响,生成式AI在对话系统(Chat)和自主代理(Agent)中的表现引发了广泛讨论。本文将全面探…

Postman中的API Schema验证:确保响应精准无误

Postman中的API Schema验证:确保响应精准无误 在API开发和测试过程中,验证响应数据的准确性和一致性是至关重要的。Postman提供了一个强大的功能——API Schema验证,它允许开发者根据预定义的JSON Schema来检查API响应。本文将详细介绍如何在…

微软全球蓝屏带来的思考及未来战争走向

微软全球蓝屏事件不仅揭示了技术层面的问题和挑战,还引发了对未来战争走向的一些深入思考。以下是关于这些思考的内容: 微软全球蓝屏带来的思考: 系统稳定性与安全性:微软全球蓝屏事件凸显了操作系统稳定性和安全性的重要性。一…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统:Linux 版本信息:Oracle 19c 参考文档…

asp.net core 集成redis详解

ASP.NET Core 集成 Redis 详解如下: 目录 一、Redis简介 二、在ASP.NET Core中集成Redis 三、Redis的高级用法 四、注意事项 一、Redis简介 Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis内置了复制、Lua脚本、…

在可编辑 div (contentEditable)末尾插入换行符(\n 或 \<br\>)无效的解决办法

背景: 给可编辑 div 末尾插入换行符, 发现仍然未换行; 解决方法: 提前给 div 末尾插入一个 <br> 就行了, 之后看自己情况要不要去掉 示例代码: // 如果输入框末尾没有 BR 换行符, 则自动加一个, 避免 Ctrl Enter 两次才显示 const currLastEl dom_input.lastElement…

缓存框架 Caffeine 的可视化探索与实践

作者&#xff1a;vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 一、背景 Caffeine缓存是一个高性能、可扩展、内存优化的 Java 缓存库&#xff0c;基于 Google 的 Guava Cac…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…