基于gensim实现word2vec模型(附案例实战)

news2024/10/6 20:40:59

目录

什么是word2vec?

Word2Vec的原理 

gensim实现word2vec模型(实战)


什么是word2vec?

Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。用词向量来表示词并不是Word2Vec的首创,在很久之前就出现了。最早的词向量采用One-Hot编码,又称为一位有效编码,每个词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1。比如我们有下面的5个词组成的词汇表:

采用One-Hot编码方式来表示词向量非常简单,但缺点也是显而易见的,一方面我们实际使用的词汇表很大,经常是百万级以上,这么高维的数据处理起来会消耗大量的计算资源与时间。另一方面,One-Hot编码中所有词向量之间彼此正交,没有体现词与词之间的相似关系。

Distributed representation可以解决One-Hot编码存在的问题,它的思路是通过训练,将原来One-Hot编码的每个词都映射到一个较短的词向量上来,而这个较短的词向量的维度可以由我们自己在训练时根据任务需要来自己指定。

下图是采用Distributed representation的一个例子,我们将词汇表里的词用"Royalty","Masculinity", "Femininity"和"Age"4个维度来表示,King这个词对应的词向量可能是(0.99,0.99,0.05,0.7)。当然在实际情况中,我们并不能对词向量的每个维度做一个很好的解释。

Word2Vec的原理 

Word2Vec 的训练模型本质上是只具有一个隐含层的神经元网络(如下图)。

 它的输入是采用One-Hot编码的词汇表向量,它的输出也是One-Hot编码的词汇表向量。使用所有的样本,训练这个神经元网络,等到收敛之后,从输入层到隐含层的那些权重,便是每一个词的采用Distributed Representation的词向量。比如,上图中单词的Word embedding后的向量便是矩阵 Wv x N 的第i行的转置。这样我们就把原本维数为V的词向量变成了维数为N的词向量(N远小于V),并且词向量间保留了一定的相关关系。

gensim实现word2vec模型(实战)

本次实战案例选取的数据集是四大名著中的三国演义。

首先使用jieba进行中文分词,

import jieba
import re
import warnings
warnings.filterwarnings('ignore')

with open("sanguo.txt", 'r',encoding='utf-8')as f: # 读入文本
    lines = []
    for line in f: #分别对每段分词
        temp = jieba.lcut(line)  #结巴分词 精确模式
        words = []
        for i in temp:
            #过滤掉所有的标点符号
            i = re.sub("[\s+\.\!\/_,$%^*(+\"\'””《》]+|[+——!,。?、~@#¥%……&*():;‘]+", "", i)
            if len(i) > 0:
                words.append(i)
        if len(words) > 0:
            lines.append(words)
print(lines[0:5])#预览前5行分词结果

分词之后使用gensim库中的word2vec构建模型,

from gensim.models import Word2Vec
# 调用Word2Vec训练 参数:size: 词向量维度;window: 上下文的宽度,min_count为考虑计算的单词的最低词频阈值
model = Word2Vec(lines,vector_size = 20, window = 2 , min_count = 3, epochs=7, negative=10,sg=1)
print("孔明的词向量:\n",model.wv.get_vector('孔明'))
print("\n和孔明相关性最高的前20个词语:")
model.wv.most_similar('孔明', topn = 20)# 与孔明最相关的前20个词语

 从结果中我们看出,与孔明相关性最高的是玄德、云长、孟获,也符合小说中的角色关系。

接着我们将模型可视化,

import numpy as np
from sklearn.decomposition import PCA
# 将词向量投影到二维空间
rawWordVec = []
word2ind = {}
for i, w in enumerate(model.wv.index_to_key):
    rawWordVec.append(model.wv[w]) # 词向量
    word2ind[w] = i # {词语:序号}
rawWordVec = np.array(rawWordVec)
X_reduced = PCA(n_components=2).fit_transform(rawWordVec)  # PCA降2维

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
# 绘制星空图
# 绘制所有单词向量的二维空间投影
fig = plt.figure(figsize = (15, 10))
ax = fig.gca()
ax.set_facecolor('white')
ax.plot(X_reduced[:, 0], X_reduced[:, 1], '.', markersize = 1, alpha = 0.3, color = 'black')


# 绘制几个特殊单词的向量
words = ['孙权', '刘备', '曹操', '周瑜', '诸葛亮', '司马懿','汉献帝']

for w in words:
    if w in word2ind:
        ind = word2ind[w]
        xy = X_reduced[ind]
        plt.plot(xy[0], xy[1], '.', alpha =1, color = 'orange',markersize=10)
        plt.text(xy[0], xy[1], w, alpha = 1, color = 'red')

 

最后,我们还可以做个类比关系实验,

比如,孔明是玄德的军师,那么曹操的军师是谁呢?

# 玄德-孔明=?-曹操
words = model.wv.most_similar(positive=['玄德', '曹操'], negative=['孔明'])
words

 

我们可以看到 排在最前面的是司马懿,也对上了原小说关系。

曹操跟魏国的关系很近(虽然他不是开国皇帝),那么跟蜀国关系最近的谁呢?

# 曹操-魏=?-蜀
words = model.wv.most_similar(positive=['曹操', '蜀'], negative=['魏'])
words

 

 我们看到排在最前面的是玄德,也应证了原小说。

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

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

相关文章

20+个很棒的 Python 脚本的集合(迷你项目)

💂 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的 前…

【软件分析第17讲-学习笔记】程序综合 Program Synthesis

文章目录前言正文程序综合枚举法CEGIS:基于反例的优化约束求解法启发式搜索法统计法基于组件的程序综合 Component-Based Synthesis小结参考文献前言 创作开始时间: 如题,学习一下程序综合 Program Synthesis的相关知识。参考:熊…

AUTOSAR-Fee模块

(73条消息) AUTOSAR-Fee模块_一ye残雪的博客-CSDN博客_fee 配置 0 前言 Fee模块全称Flash EEPROM Emulation Module,属于ECU抽象层 Fee模块本身是脱离硬件的,但是Fee模块可能会引用的Fls模块定制API,所以只能算半抽象 本文中,由于…

数据库高级 III

数据库高级 III 二叉排序树在极端情况下存在的问题 二叉排序树在极端情况下会产生失衡二叉树 失衡二叉树其实是不希望存在的,因为它失去了二叉排序树的查询优势,现在这种失衡二叉树的查询效率和单向链表一样,此时它就是单向链表 数据结构…

14.4、SpringWebFlux-1

14.4、SpringWebFlux-1 14.4.1、前置知识 SpringMVC,SpringBoot,Maven,Java8 新特性 14.4.2、基本介绍 官方文档 Web on Reactive Stack (spring.io) 是 Spring5 添加新的模块,用于 web 开发的,功能 SpringMVC 类…

网络热传App鉴定 |「得物」疑私删用户视频?从技术角度还原事件始末

声明:本文更注重于原理知识的普及,因此文中不会有大量实际代码的展示,如果想从代码层面上了解「应用存储分区」的内容,欢迎阅读我两年前写过的技术文章《Android 10 应用分区存储适配实践》 近日,有网友爆料&#xff0…

MySQL 分库分表

MySQL分库分表 概念 读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他的手段吗?实现数据库高可用,还有另外一个撒手锏&#xff…

Python性能优化指南--让你的Python代码快x3倍的秘诀

Python性能优化指南 Python最为人诟病的就是其执行速度。如何让Python程序跑得更快一直是Python核心团队和社区努力的方向。作为Python开发者,我们同样可以采用某些原则和技巧,写出性能更好的Python代码。本文将带大家深入探讨Python程序性能优化方法。…

99页4万字XX大数据湖项目建设方案

目 录 1. 项目综述 1.1. 项目背景 1.2. 项目目标 1.3. 项目建设路线 2 需求分析 2.1功能需求 2.1.1 统一数据接入 2.1.2 数据迁移 2.1.3 数据范围与ETL 2.1.4 报表平台 2.1.5 安全管理 2.1.6 数据治理 2.2非功能需求 2.2.1运维保障需求 2.2.2可用性需求 2.2.3可…

MQTT 具备那些特征?

目录 1、MQTT 中的 QoS(消息服务质量) (1)为什么服务质量(QoS)很重要? (2)QoS 在 MQTT 中是如何工作的? (3)如何选择正确的 QoS 级别 (4&a…

Java开发中Word转PDF文件5种方案横向评测

Java开发中Word转PDF文件5种方案横向评测 前段时间接了个项目,需要各种处理Word模板、转PDF、签章等等,非常头疼,其中光是一个word转PDF就折磨我好久,实现转换很简单,但是效果总是达不到满意,于是我把市面…

【Linux】关于普通用户无法使用sudo指令的解决方案

文章目录前言解决方案结语前言 在这篇博客中,测试 rm -rf 删除文件时无视权限暴力删除的效果时,使用了 sudo 指令。 但是sudo指令是不能直接使用的,需要修改一些设置。 当时我遇到这个问题时,困惑了许久,查找解决方…

JVM执行引擎

文章目录学习资料执行引擎概述工作过程Java代码编译和执行的过程什么是解释器(Interpreter),什么是JIT编译器?为什么说Java是半编译半解释型语言?机器码、指令、汇编语言、高级语言机器码指令指令集汇编语言高级语言字…

UE5实现PS图层样式投影效果

一、PS图层样式投影效果 1、创建材质函数 MF_PS_Style_Shadow 公开到库(可选) 定义 function input。 Shadow代码: /** PS图层样式投影效果param {UVs} texture coordinateparam {TextureObject} texture objectparam {TextureSize} …

十、children的深入用法-React.Children对象上的方法

目标 理解什么是children掌握React.Children对象上的方法 知识点 什么是children上图中我们看到了,我们之前学过的React.createElement方法,现在大家发现jsx的内容,全部都体现在了该方法上;那么React.createElement其实是有三个…

专精特新企业数据集两份数据

专精特新企业数据集 一、三批专精特新上市、非上市公司数据分布 1、时间截止至2021年8月 2、区域范围:上市和非上市公司两大板块,涵盖申万一级行业 3、指标说明: 包含如下内容:专精特新上市公司名单汇总、第一批专精特新上市公…

opencv 入门学习

opencv 演示 输入说明 原图在顶层后然后再去按键,不然会失效(未知原因) 1.roberts 边缘检测 2.sobel算子 3.Canny算子 4.Laplace算子 5.Canny算子,轮廓显示 空格 人脸检测准备一张图片效果 默认显示原图和灰阶图 roberts 边缘…

MySQL版本号6和7去哪了

问题 MySQL版本号6和7去哪了 详细问题 笔者起初误以为MySQL版本号6和7可能由于存在诟病不受欢迎或由于MySQL版本迭代过快导致未能在市场上流行 但是在浏览MySQL官网注意到 MySQL在2017年发布了新的版本8.0,但是在此之前的上一一个版本是5.7,40,那么中间的6和7去哪…

并发编程永远绕不开的难题,跟着大牛带你Java并发编程从入门到精通

我们知道,很多框架或者自研组件的底层,都或多或少涉及到并发编程方面的技术点。 比如:在一些本地缓存组件中,当本地缓存过期后,需要从数据库加载数据,这个阶段中就会涉及到线程并发请求的处理;在…

微信小程序云开发

概念 小程序云开发,让前端程序员拥有后端的能力云函数 (nodejs)云数据库 (mogodb)云存储前端写好云函数 > 上传到云服务器 >实现自定云部署前端去调用云函数>间接通过云函数对数据库的操作前端>全栈 注意…