前言
这是以前做的一个对小说的数据分析小程序,虽然没什么太大的实际用处,但是通过这个程序也能复习不少常用库,还是有不少意义。
正文
数据收集
首先是数据收集部分,这个部分因为就不详细介绍了,无非是requests库及bs4库的应用。详情请见我的github:https://github.com/haoxinl/novel_analysis
模型构建
依赖库
- pandas
- matplotlib
- jieba
- gensim
- wordcloud
详细程序
def find_pepple_showup_cont(num=10):
novel = ''.join(content)
showup_counts = []
for name in names:
showup_counts.append([name, novel.count(name)])
showup_counts.sort(key=lambda v: v[1], reverse=True)
result= showup_counts[:num]
show = pd.DataFrame(result, columns=['names', 'counts'])
return(show)
def makebar(show):
# 设置中文子字体(特别注意)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 展示的姓名和数据
data = list(show.counts)
index = list(show.names)
# 绘制直方图
plt.bar(range(len(data)), data, tick_label=index)
plt.xlabel('出现的人物')
plt.ylabel('出现的次数')
plt.title('戮仙人物出现频次图')
# 利用结巴分词来进行关键词查找
plt.savefig('test.png')
plt.show()
以上为数据收集及直方图构建
def makewordcloud():
print('关键词:')
for k, v in tags:
print('关键词:{} 权重:{:.3f}'.format(k, v))
# 利用关键词制作图云:
font = r'C:\Windows\Fonts\simfang.ttf'
txt = ''.join([v + ',' for v, x in tags])
wordcloud = WordCloud(background_color='white',font_path=font, max_font_size=40).generate(txt)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
wordcloud.to_file('wordcloud.jpg')
return tags
以上为词云的构成
def makemodel():
for tag, x in tags:
jieba.add_word(tag)
# 将小说中的姓名加入结巴分词的关键词
for name in names:
jieba.add_word(name)
# 加入中文停用词列表
with open('stopwords.txt', 'r',encoding='utf-8') as f:
STOPWORD = [word.strip() for word in f.readlines()]
# 开始进行分词
print('开始进行分词。。。。')
# 我们期待的分词结果是保存着小说每一句话的分词结果
# 即一个二元数组,这将方便我们一会进行模型的训练
sentence = []
for line in content:
seg_list = list(jieba.cut(line, cut_all=False))
unique_list = []
# 开始去除停用词
for seg in seg_list:
if seg not in STOPWORD:
unique_list.append(seg)
sentence.append(unique_list)
print('分词完毕')
# 开始训练模型
# Gensim中的Word2Vec期望的输入是经过分词的 句子列表。即是一个包含句子分词结果的二维数组
print('开始训练模型。。。这个时间很长,去喝杯咖啡吧')
model = gensim.models.Word2Vec(
sentence, size=100, min_count=4, workers=4)
print('训练完毕。正在将模型保存到本地')
model.save('戮仙.model')
print('Okey ')
最后是模型的构建
import gensim
# 读入训练好的模型
model = gensim.models.Word2Vec.load('戮仙.model')
# 我们来找找和范闲类似的人物
print('===============和杜铁剑类似的人物=================')
for s in model.most_similar(positive=['杜铁剑'])[:5]:
print(s)
print('\n\n')
print('===============和黄明类似的人物=================')
for s in model.most_similar(positive=['黄明'])[:5]:
print(s)
print('\n\n')
print('================与沈石相关的人物================')
for s in model.most_similar(positive=['沈石'])[:5]:
print(s)
print('\n\n')
print('===============云霓徒弟=================')
for s in model.most_similar(positive=['云霓'])[:5]:
print(s)
print('\n\n')
print('===============和甘泽类似的人物=================')
for s in model.most_similar(positive=['甘泽'])[:5]:
print(s)
print('\n\n')
之后进行模型的测试
最后说几句
因为篇幅有限,本文没有对程序进行详细介绍,同时爬虫代码也未优化,而且还有一些其他的辅助文本,有兴趣的可以去我的github前去查看:https://github.com/haoxinl/novel_analysis