基于gensim实现word2vec模型(附案例实战)
目录
什么是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
我们看到排在最前面的是玄德,也应证了原小说。
基于gensim实现word2vec模型(附案例实战)相关推荐
- wiki中文数据语料抽取-gensim构建word2vec模型
阅读目录: 1. WikiCorpus提取xml数据集语料 2. opencc繁转简 3. jieba中文分词 4. word2vec词向量转化 5. 模型测试(相似度) wiki数据集获取途径:点此 ...
- 基于Gensim的Word2Vec的应用
一:word2vec的基础简介可以参考: https://blog.csdn.net/lilong117194/article/details/82018008 https://blog.csdn.n ...
- Python实现因子分析(附案例实战)
因子分析 因子分析(Factor Analysis)是一种数据简化的技术.它通过研究众多变量之间的内部依赖关系探求观测数据中的基本结构,并用少数几个假想变量来表示其基本的数据结构.这几个假想变量能够反 ...
- Linux基本常用命令大全(附案例实战)
目录 1.基本命令 1.1 命令入门 1.1.1 命令提示符详解 1.1.2 命令格式 1.2 获取命令的帮助 1.2.1 查手册&搜索引擎 1.2.2 man 1.2.3 命令 --help ...
- 机器学习:基于AdaBoost算法对信用卡精准营销建立模型(附案例实战)
机器学习:基于AdaBoosts算法对信用卡精准营销建立模型 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页
- 基于Tomotopy构建LDA主题模型(附案例实战)
- 使用gensim训练word2vec模型
代码如下: from gensim.models import Word2Vec, word2vec import jieba import multiprocessing# 1. 停用词表 def ...
- 机器学习之KMeans聚类算法原理(附案例实战)
14天阅读挑战赛 KMeans聚类 什么是聚类任务 1 无监督机器学习的一种 2 目标将已有数据根据相似度划分到不同的簇 3 簇内样本彼此之间越相似,不同簇的样本之间越不相似,就越好 为什么叫KMe ...
- 【SPSS】回归分析详细操作教程(附案例实战)
最新文章
- 人脸识别数据集精粹(下)
- NSUserDefaults读取和写入自定义对象
- oracle启动报参数不正确,【oracle】模拟故障 - 参数修改导致无法启动oracle
- 深圳学校积分计算机,深圳小学入学积分多少才够
- java的地位_Java地位无可动摇的12个原因
- Mysql的IF()函数:如果返回True值,返回第一个值,为False值,返回第二个值
- go语言学习--string、int、int64互相转换,字符串的截取,数组和字符串的转换
- 从非数组对象转数组方法小结
- 了解链表和二叉树的结构
- python获取指定区域的像素_如何获得某个区域的像素值?
- jvm之对象的创建与内存模型解析
- 爬虫——获取联行行号
- 如何通过SEO思维收割各大平台的流量?
- Python ftp 下载AHI数据
- WinDjView对AfxMessageBox的定制
- 微信小程序 09 前后端交互
- S4不得不知道的SQL查询工具DB01
- oracle not turn on,how to turn on the tracing ?
- 课时31 永久储存:腌制一缸美味的泡菜
- C语言视频教程-谭浩强版-小甲鱼主讲—P18