前文介绍了文本向量化类 Gensim.Word2Vec 的用法,本文继续用 Word2Vec 写一个小案例,用《人民的名义》小说文本,来训练一个Word2Vec,分析小说中人物的姓名文本相似度。

当然,本文只是基于Word2Vec可视化文本特征,并不是做人物关系图谱,任务关系会在后面介绍。

代码示例

1、jieba分词并去停用词

import jieba

# 加载停用词表
stopwords_str = open('./datas/stopwords.txt').read()
stopwords = stopwords_str.split('\n')

# jieba添加自定义词语,防止误拆
name_list = ['沙瑞金', '田国富', '高育良', '侯亮平', '钟小艾', '陈岩石', '欧阳菁', '易学习', '王大路', '蔡成功', '孙连城', '季昌明', '丁义珍', '郑西坡', '赵东来', '高小琴', '赵瑞龙', '林华华', '陆亦可', '刘新建', '刘庆祝', '赵德汉']
for name in name_list:
    jieba.add_word(name)

# 分词并过滤停用词
text = open('./datas/in_the_name_of_people_all.txt').read()
words = jieba.lcut(text)
words_list = [word for word in words if word not in stopwords and len(word) >= 2]

2、训练Word2vec模型

from gensim.models import Word2Vec

model = Word2Vec([words_list], vector_size=20, min_count=1)
wv = model.wv

vocabs = []
vectors = []

# 防止人物没有出现报错
for name in name_list:
    try:
        vocabs.append(name)
        vectors.append(wv[name])
    except:
        pass

3、PCA降维并可视化

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# PCA降维
pca = PCA(2)
vec_dr = pca.fit_transform(vectors)
# print(pca.explained_variance_ratio_) 
# 降维后只携带了原始特征的0.4的信息,可视化效果不佳

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

# 可视化
plt.scatter(vec_dr[:, 0], vec_dr[:, 1])
for w, (x,y) in zip(vocabs, vec_dr):
    plt.annotate(w, (x,y))
plt.show()

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/read/315