【NLP入门系列六】Word2Vec模型简介,与以《人民的名义》小说原文实践

博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C++,go语言的世界;在迷茫中寻找光芒​🌸
博客主页:羊小猪~~-CSDN博客
内容简介:这一篇是介绍词嵌入模型---Word2Vec模型,并以一段《人民的名义》小说原文实践
🌸箴言🌸:去寻找理想的"天空""之城
上一篇内容:【NLP入门系列五】中文文本分类案例-CSDN博客

文章目录

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、数据准备与处理

python 复制代码
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.
python 复制代码
# 停用词去除,一般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))
python 复制代码
# 查看一部分数据
data[119]
复制代码
['开会',
 '开会',
 '开',
 '你',
 '个头',
 '呀',
 '侯亮平',
 '骂骂咧咧',
 '心',
 '却',
 '稍安',
 '老同学',
 '陈海',
 '为',
 '人',
 '老实',
 '办事',
 '踏实',
 '而且',
 '干',
 '了',
 '几年',
 '反贪局',
 '局长',
 '经验',
 '还',
 '算',
 '丰富']

2、训练Word2Vec模型

  • vector_size: 词向量的维度,默认是100。
  • window: 上下文窗口大小,默认是5。
  • min_count: 忽略所有单词频率低于这个值的单词,默认是5。
  • sg: 决定使用 skip-gram (sg=1) 还是 CBOW (sg=0),默认是0
python 复制代码
model = Word2Vec(data, vector_size=100, window=5, min_count=1, sg=1)

3、模型应用

计算词汇相识度

python 复制代码
# api:similarity
print(model.wv.similarity("沙瑞金", "李达康"))
复制代码
0.9310903
python 复制代码
# 找出和沙瑞金最相关的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

找出不匹配的词汇

python 复制代码
# doesnt_model,可以找出一组词汇中与其他词汇不匹配的词汇
odd_word = model.wv.doesnt_match(["苹果", "香蕉", "书"])
print(odd_word)
复制代码

计算词汇词频

python 复制代码
# get_vecattr
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(word_frequency)
复制代码
353

参考资料