词的表示方法笔记——词向量+代码练习

文章介绍了词的两种表示方法,一是one-hot编码,二是词向量(wordembedding)。one-hot编码存在维度灾难和无法衡量词语相似性的缺点,而词向量通过word2vec等模型能捕获词汇的语义信息。模型训练示例展示了如何使用word2vec生成词向量,并通过PCA进行可视化。最后,文章通过类比实验展示了词向量在表示词语关系上的能力。
摘要由CSDN通过智能技术生成

词的表示方法:
一、one-hot(最简单)
独热编码是一种将单词转化为稀疏向量的方法,其中每个单词都表示为一个只有一个元素为1其余元素均为0的向量,其维度由词库的大小决定。。例如,对于包含 4个单词的词汇表 [tapple, banana, orange, peach] 单词“banana”的独热编码为[0,1,0,0]。
缺点:
(1)纬度灾难,有多少个词语我们的维度就多大,对于庞大的语料库来说,存储量和计算量都是问题;
(2)无法度量词语之间的相似性;
二、word embedding(词向量)
词向量则是一种将单词映射到连续向量空间中的方法,旨在捕捉单词之间的语义信息和关系。通过词向量,可以将自然语言处理中的单词转化为计算机可以处理的数字形式,从而便于进行文本分类、情感分析、机器翻译等任务。常见的词向量模型包括word2Vec、Glove、ELMo、BERT等。
词向量如何获取?
针对word2vec
(1)重要假设:文本中离得越近的词语相似度越高。
(2)其使用CBOW和skip-gram来计算词向量矩阵:
CBOW:使用上下文词来预测中心词;
skip-gram(常用):使用中心词来预测上下文词;
评估词向量:输出与特定词语的相关度比较高的词语;可视化;类比实验:国王-王后=男人-女人
词向量的用途
(1)主题聚类;
(2)情感分析;
(3)信息检索……
word2vec缺点
(1)没有考虑多义词;
(2)窗口长度有限;
(3)没有考虑全局的文本信息;
(4)不是严格意义的语序……

代码实现

导包

import jieba
import re
import numpy as np
from sklearn.decomposition import PCA
import gensim
from gensim.models import Word2Vec
import matplotlib.pyplot as plt
import matplotlib

分词

f = open("sanguo.txt", 'r',encoding='utf-8') #读入文本
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行分词结果

[[‘三国演义’, ‘上卷’], [‘罗贯中’], [‘滚滚’, ‘长江’, ‘东’, ‘逝水’, ‘浪花’, ‘淘尽’, ‘英雄’, ‘是非成败’, ‘转头’, ‘空’, ‘青山’, ‘依旧’, ‘在’, ‘几度’, ‘夕阳红’], [‘白发’, ‘渔樵’, ‘江渚上’, ‘惯看’, ‘秋月春风’, ‘一壶’, ‘浊酒’, ‘喜相逢’, ‘古今’, ‘多少’, ‘事’, ‘都’, ‘付笑谈’, ‘中’], [‘–’, ‘调寄’, ‘临江仙’]]

模型训练

# 调用Word2Vec训练
# 参数:size: 词向量维度;window: 上下文的宽度,min_count为考虑计算的单词的最低词频阈值
#negative负采样,sg模型的训练算法1:skip-gram 0:CBOW
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个词语

在这里插入图片描述
可视化

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

在这里插入图片描述

X_reduced #降维之后2维

在这里插入图片描述

# 绘制星空图
# 绘制所有单词向量的二维空间投影
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 = ['孙权', '刘备', '曹操', '周瑜', '诸葛亮', '司马懿','汉献帝']

# 设置中文字体 否则乱码
zhfont1 = matplotlib.font_manager.FontProperties(fname='./华文仿宋.ttf', size=16)
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, fontproperties = zhfont1, alpha = 1, color = 'red')

在这里插入图片描述
类比关系实验

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

在这里插入图片描述

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

在这里插入图片描述
代码参考:【词向量 | word2vec | 理论讲解+代码 | 文本分析【python-gensim】-哔哩哔哩】 https://b23.tv/O02nfAb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小蔡呀~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值