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

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

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

流程

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

效果图

男主与各个女主的词向量嵌入到了一起
【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入、高维数据降维)_第1张图片

本文用到的资源:

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

代码实现

数据导入及预处理

import os, time, re
import numpy as np
import jieba
from gensim.models.word2vec import Word2Vec,Text8Corpus
import re
from gensim.models import word2vec
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
plt.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:
            pass
        return word_list
    sens_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_count
        self.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="我"):  #https://zhuanlan.zhihu.com/p/107663526
        print("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()   #词嵌入可视化

改进点

  • 去除文本中的虚词

你可能感兴趣的:(word2vec,自然语言处理,机器学习)