【NLP入门系列六】Word2Vec模型简介,与以《人民的名义》小说原文实践
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C++,go语言的世界;在迷茫中寻找光芒🌸
博客主页:羊小猪~~-CSDN博客
内容简介:这一篇是介绍词嵌入模型—Word2Vec模型,并以一段《人民的名义》小说原文实践
🌸箴言🌸:去寻找理想的“天空“”之城
上一篇内容:【NLP入门系列五】中文文本分类案例-CSDN博客
文章目录
- Word2vec简介
- CBOW模型
- Skip-gram模型
- 对比
- 缺点
- Word2Vec实践
- 1、数据准备与处理
- 2、训练Word2Vec模型
- 3、模型应用
- 计算词汇相识度
- 找出不匹配的词汇
- 计算词汇词频
- 参考资料
Word2vec简介
在处理NLP
问题中,第一步就是对词语进行处理,比如:判断一个词的词性,这个时候我们可以构建一个映射函数f(x) -> y
,其中x
是词语,y
是词性,但是对于计算机来说,他只认识二进制,所以,为了使用计算机相关算法模型去处理,就需要将词语转化为数值形式。
在NLP
中,词语是人类的抽象总结,是符号形式的(比如中文、英文等等),不是数值形式的,因此需要将它们嵌入到一个数学空间中,这个过程就是词嵌入(word embedding)。
📖👀 word embedding和embedding的区别:
🌇 Embedding:指的是将离散变量(如词汇、用户ID、物品ID等)映射到连续的向量空间的过程。
🌆 word embedding: 是一种具体的embedding技术,主要用于生成单词的固定向量表示。
词嵌入的目的是将词语映射到一个向量空间中的过程,使得相似的词在向量空间中距离较近,而不相似的词距离较远。Word2Vec
则是其中的一种词嵌入方法,是一种用于生成词向量的浅层神经网络模型。
Word2Vec
通过学习大量文本数据,将每个单词表示为一个连续的向量,这些向量可以捕捉单词之间的语义和句法关系。
总的来说,Embedding只是将离散词嵌入到一个连续的词空间里,而word embedding不光嵌入到一个连续空间,还做到了相似的词在向量空间中距离较近,而不相似的词距离较远。
Word2Vec
有两种主要架构:连续词袋型(CBOW
)和Skip-Gram
模型。
CBOW模型
📘 简要介绍:CBOW
模型通过上下文来预测当前值,相当于一句话中扣掉一个词,让你根据上下文猜这个词是啥,有点像英语的完形填空。
原理简介:CBOW
模型首先将输入的词语转换为词向量,然后将这些词向量相加得到一个向量表示,这个向量表示就是当前上下文的表示。最后,CBOW
模型使用这个向量表示来预测目标词语的概率分布。
📄适合:训练目标词语出现频率较高的词语(词频高,说明预测这个词的概率高)
Skip-gram模型
📖 简介:Skip-gram 模型用当前词来预测上下文。换句话说,就是给一个词,让你猜前面和后面可能出现什么词。
👀 原理简介:Skip-gram 模型首先将目标词语转换为它的词向量,然后使用这个词向量来预测它周围的词语。
📄 适用:训练数据中目标词语出现频率较低的情况(词频低,即使某个词在整个语料库中出现次数不多,但每次出现时,它都会提供关于其上下文的重要信息,这个很像人一样,注意力总是比较喜欢“独特”的东西)
对比
总的来说,这张图很直观的展示了区别。
缺点
- 没有考虑同义词
- 串口长度有限
- 没有考虑全局的文本信息
- ……………………
Word2Vec实践
0️⃣ 数据简介:以人民的名义小说一段原文为题材。
1、数据准备与处理
import gensim
import jieba
import jieba.analyse
from gensim.models import Word2Vec'''
由于人名是固定的,故为了避免人名分词,需要去固定一些词语
固定方法:https://blog.csdn.net/m0_43432638/article/details/103773016
这里选择加载文档方式,文档内容:
沙瑞金
田国富
高育良
侯亮平
钟小艾
陈岩石
欧阳菁
易学习
王大路
蔡成功
孙连城
季昌明
丁义珍
郑西坡
赵东来
高小琴
赵瑞龙
林华华
刘新建
刘庆祝
赵德汉
陈海
'''
# 加载自定义词典
jieba.load_userdict("name.txt")result_cut = []# 加载数据
with open("in_the_name_of_people.txt") as f:lines = f.readlines() # 读取所有行for line in lines:result_cut.append(list(jieba.cut(line)))f.close()
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\WY118C~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.250 seconds.
Prefix dict has been built successfully.
# 停用词去除,一般nlp任务都会做
stopwords_list = [",","。","\n","\u3000"," ",":","!","?","…"] # 自定义def remove_stopwords(ls):res = []for word in ls: if word not in stopwords_list:res.append(word)return res # 处理后数据
data = []
for x in result_cut: # 一行一行处理后数据data.append(remove_stopwords(x))
# 查看一部分数据
data[119]
['开会','开会','开','你','个头','呀','侯亮平','骂骂咧咧','心','却','稍安','老同学','陈海','为','人','老实','办事','踏实','而且','干','了','几年','反贪局','局长','经验','还','算','丰富']
2、训练Word2Vec模型
- vector_size: 词向量的维度,默认是100。
- window: 上下文窗口大小,默认是5。
- min_count: 忽略所有单词频率低于这个值的单词,默认是5。
- sg: 决定使用 skip-gram (sg=1) 还是 CBOW (sg=0),默认是0
model = Word2Vec(data, vector_size=100, window=5, min_count=1, sg=1)
3、模型应用
计算词汇相识度
# api:similarity
print(model.wv.similarity("沙瑞金", "李达康"))
0.9310903
# 找出和沙瑞金最相关的5个词
for e in model.wv.most_similar(positive=["沙瑞金"], topn=5):print(e[0], e[1])
田国富 0.9316699504852295
李达康 0.9310902953147888
易学习 0.9205609560012817
省委 0.9166615605354309
沙 0.914297342300415
找出不匹配的词汇
# doesnt_model,可以找出一组词汇中与其他词汇不匹配的词汇
odd_word = model.wv.doesnt_match(["苹果", "香蕉", "书"])
print(odd_word)
书
计算词汇词频
# get_vecattr
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(word_frequency)
353
参考资料
- 【词向量 | word2vec | 理论讲解+代码 | 文本分析【python-gensim】】https://www.bilibili.com/video/BV1vS4y1N7mo?vd_source=1fd424333dd77a7d3e2e741f7d6fd4ee