1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入 高维数据降维)

【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入 高维数据降维)

时间:2022-05-06 10:12:59

相关推荐

【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入 高维数据降维)

【Gensim + TSNE使用】word2vec词向量处理中文小说

本文使用Gensim对小说斗破苍穹进行词嵌入可视化

流程

数据预处理,将小说数据滤除停止词,分词book_loader()。调用gensim.models.word2vec对语料建立词向量。词嵌入,使用TSNE进行数据降维,使用plt可视化词嵌入结果。

效果图

男主与各个女主的词向量嵌入到了一起

本文用到的资源:

小说下载地址停止词集合下载地址

代码实现

数据导入及预处理

import os, time, reimport numpy as npimport jiebafrom gensim.models.word2vec import Word2Vec,Text8Corpusimport refrom gensim.models import word2vecfrom sklearn.manifold import TSNEimport matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"] # 用來正常顯示中文標籤plt.rcParams["axes.unicode_minus"] = False # 用來正常顯示負號def book_loader():with open(r"D:\Edge_Download\斗.破苍穹.txt", "r") as f: # 打开文件data = f.read() # 读取文件data = re.sub(r'[^\w\s]', '', data) #仅保留汉字data = data.split('\n')#按行分句for i in data:#去除太短的句子if(len(i)<6):data.remove(i)def segment_sen(sen):sen_list = []try:sen_list = jieba.lcut(sen)word_list = []for word in sen_list:if word not in stoplist:word_list.append(word)except:passreturn word_listsens_list = [segment_sen(i) for i in data]#调用jieba分词return sens_list

Word2Wec and 词嵌入

class word_embedding:def __init__(self,sens_list=[],model_name="word2vec.model",min_count=300): #建立词向量模型self.min_count=min_countself.model=Word2Vec(sens_list, hs=1, min_count=min_count, window=6) #建立词向量,忽略出现次数小于min_count的词self.model.save("word2vec.model")self.data_process()def data_process(self):self.tokens = []self.label=[]for word in self.model.wv.key_to_index: #读取模型中提取到的词if 80000>=self.model.wv.get_vecattr(str(word), "count")>=self.min_count: #过滤掉出现频率过低和过高的词self.label.append(word)self.tokens.append(self.model.wv.get_vector(str(word), norm=True)) #读取每个词对应的嵌入向量def show_similar_word(self,word="我"): #/p/107663526print("count:"+str(word)+" ",self.model.wv.get_vecattr(str(word), "count"))print(self.model.wv.most_similar(str(word))) #找出一个两个词向量距离最近的词def TSNE_Plot(self):print("ploting:" + str(len(self.label)) + " labels")tsne_model = TSNE(perplexity=40, n_components=2, init="pca", n_iter=2500, random_state=23) #n_components:嵌入式空间的维度 n_iter最大迭代次数X_tsne =tsne_model.fit_transform(self.tokens) #对词向量集合进行降维plt.scatter(X_tsne[:, 0], X_tsne[:, 1])for i in range(len(self.label)):plt.annotate(self.label[i], #在每个词向量上标注其对应的词xy=(X_tsne[i, 0], X_tsne[i, 1]),textcoords="offset points",xytext=(5, 2),ha="right",va="bottom")plt.show()wd=word_embedding(book_loader(),model_name="D:\Codes\Python\Mechine_learning\Word_embedding\dpcq.model",min_count=500)wd.show_similar_word("萧炎") #找出与“萧炎”相似度最高的词汇wd.TSNE_Plot() #词嵌入可视化

改进点

去除文本中的虚词

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。