基于《戮仙》小说的数据获取及数据分析

github地址:https://github.com/haoxinl/novel_analysis

博客地址:http://haoxinl.club/2018/02/18/novel-analysis/

例行图o( ̄ヘ ̄o#)感谢画师

前言

这是以前做的一个对小说的数据分析小程序,虽然没什么太大的实际用处,但是通过这个程序也能复习不少常用库,还是有不少意义。

正文

数据收集

首先是数据收集部分,这个部分因为就不详细介绍了,无非是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()

以上为数据收集及直方图构建


基于《戮仙》小说的数据获取及数据分析_第1张图片
image
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

以上为词云的构成


基于《戮仙》小说的数据获取及数据分析_第2张图片
image
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

你可能感兴趣的:(基于《戮仙》小说的数据获取及数据分析)