本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

先简单介绍一下jieba中文分词包,jieba包主要有三种分词模式:

  • 精确模式:默认情况下是精确模式,精确地分词,适合文本分析;
  • 全模式:把所有能成词的词语都分出来, 但是词语会存在歧义;
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,适合用于搜索引擎分词。

jieba 包常用的语句:

  • 精确模式分词:jieba.cut(text,cut_all = False),当cut_all = True时为全模式
  • 自定义词典:jieba.load_userdict(file_name)
  • 增加词语:jieba.add_word(seg,freq,flag)
  • 删除词语:jieba.del_word(seg)

《哈利·波特》是英国作家J·K·罗琳的奇幻文学系列小说,描写主角哈利·波特在霍格沃茨魔法学校7年学习生活中的冒险故事。下面将以《哈利波特》错综复杂的人物关系为例,实践一下jieba包。

#加载所需包
import numpy as np
import pandas as pd
import jieba,codecs
import jieba.posseg as pseg  #标注词性模块
from pyecharts import Bar,WordCloud#导入人名、停用词、特定词库
renmings = pd.read_csv('人名.txt',engine='python',encoding='utf-8',names=['renming'])['renming']
stopwords = pd.read_csv('mystopwords.txt',engine='python',encoding='utf-8',names=['stopwords'])['stopwords'].tolist()
book = open('哈利波特.txt',encoding='utf-8').read()
jieba.load_userdict('哈利波特词库.txt')#定义一个分词函数
def words_cut(book):words = list(jieba.cut(book))stopwords1 = [w for w in words if len(w)==1]  #添加停用词seg = set(words) - set(stopwords) - set(stopwords1) #过滤停用词,得到更为精确的分词result = [i for i in words if i in seg]return result#初次分词
bookwords = words_cut(book)
renming = [i.split(' ')[0] for i in set(renmings)] #只要人物名字,出掉词频以及词性
nameswords = [i for i in bookwords if i in set(renming)]  #筛选出人物名字#统计词频
bookwords_count = pd.Series(bookwords).value_counts().sort_values(ascending=False)
nameswords_count = pd.Series(nameswords).value_counts().sort_values(ascending=False)
bookwords_count[:100].index

经过初次分词之后,我们发现大部分的词语已经ok了,但是还是有小部分名字类的词语分得不精确,比如说’布利’、‘罗恩说’、‘伏地’、‘斯内’、‘地说’等等,还有像’乌姆里奇’、'霍格沃兹’等分成两个词语的。

#自定义部分词语
jieba.add_word('邓布利多',100,'nr')
jieba.add_word('霍格沃茨',100,'n')
jieba.add_word('乌姆里奇',100,'nr')
jieba.add_word('拉唐克斯',100,'nr')
jieba.add_word('伏地魔',100,'nr')
jieba.del_word('罗恩说')
jieba.del_word('地说')
jieba.del_word('斯内')#再次分词
bookwords = words_cut(book)
nameswords = [i for i in bookwords if i in set(renming)]
bookwords_count = pd.Series(bookwords).value_counts().sort_values(ascending=False)
nameswords_count = pd.Series(nameswords).value_counts().sort_values(ascending=False)
bookwords_count[:100].index

再次分词之后,我们可以看到在初次分词出现的错误已经得到修正了,接下来我们统计分析。

#统计词频TOP15的词语
bar = Bar('出现最多的词语TOP15',background_color = 'white',title_pos = 'center',title_text_size = 20)
x = bookwords_count[:15].index.tolist()
y = bookwords_count[:15].values.tolist()
bar.add('',x, y,xaxis_interval = 0,xaxis_rotate = 30,is_label_show = True)
bar

整部小说出现最多的词语TOP15中出现了哈利、赫敏、罗恩、邓布利多、魔杖、魔法、马尔福、斯内普和小天狼星等字眼。

我们自己串一下,大概可以知道《哈利波特》的主要内容了,就是哈利在小伙伴赫敏、罗恩的陪伴下,经过大法师邓布利多的帮助与培养,利用魔杖使用魔法把大boss伏地魔k.o的故事。当然啦,《哈利波特》还是非常精彩的。

#统计人物名字TOP20的词语
bar = Bar('主要人物Top20',background_color = 'white',title_pos = 'center',title_text_size = 20)
x = nameswords_count[:20].index.tolist()
y =nameswords_count[:20].values.tolist()
bar.add('',x, y,xaxis_interval = 0,xaxis_rotate = 30,is_label_show = True)
bar

整部小说按照出场次数,我们发现哈利作为主角的地位无可撼动,比排名第二的赫敏远超13000多次,当然这也是非常正常的,毕竟这本书是《哈利波特》,而不是《赫敏格兰杰》。

#整本小说的词语词云分析
name = bookwords_count.index.tolist()
value = bookwords_count.values.tolist()
wc = WordCloud(background_color = 'white')
wc.add("", name, value, word_size_range=[10, 200],shape = 'diamond')
wc


在学习过程中有什么不懂得可以加我的
python学习qun,855408893
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
#人物关系分析
names = {}
relationships = {}
lineNames = []
with codecs.open('哈利波特.txt','r','utf8') as f:n = 0for line in f.readlines(): n+=1print('正在处理第{}行'.format(n))poss = pseg.cut(line)lineNames.append([])for w in poss:if w.word in set(nameswords):lineNames[-1].append(w.word)if names.get(w.word) is None:names[w.word] = 0relationships[w.word] = {} names[w.word] += 1
for line in lineNames:for name1 in line:for name2 in line:if name1 == name2:continueif relationships[name1].get(name2) is None:relationships[name1][name2]= 1else:relationships[name1][name2] = relationships[name1][name2]+ 1
node = pd.DataFrame(columns=['Id','Label','Weight'])
edge = pd.DataFrame(columns=['Source','Target','Weight'])
for name,times in names.items():node.loc[len(node)] = [name,name,times]
for name,edges in relationships.items():for v, w in edges.items():if w > 3:edge.loc[len(edge)] = [name,v,w]

处理之后,我们发现同一个人物出现了不同的称呼,因此合并并统计,得出88个节点。

node.loc[node['Id']=='哈利','Id'] = '哈利波特'
node.loc[node['Id']=='波特','Id'] = '哈利波特'
node.loc[node['Id']=='阿不思','Id'] = '邓布利多'
node.loc[node['Label']=='哈利','Label'] = '哈利波特'
node.loc[node['Label']=='波特','Label'] = '哈利波特'
node.loc[node['Label']=='阿不思','Label'] = '邓布利多'
edge.loc[edge['Source']=='哈利','Source'] = '哈利波特'
edge.loc[edge['Source']=='波特','Source'] = '哈利波特'
edge.loc[edge['Source']=='阿不思','Source'] = '邓布利多'
edge.loc[edge['Target']=='哈利','Target'] = '哈利波特'
edge.loc[edge['Target']=='波特','Target'] = '哈利波特'
edge.loc[edge['Target']=='阿不思','Target'] = '邓布利多'
nresult = node['Weight'].groupby([node['Id'],node['Label']]).agg({'Weight':np.sum}).sort_values('Weight',ascending = False)
eresult = edge.sort_values('Weight',ascending = False)
nresult.to_csv('node.csv',index = False)
eresult.to_csv('edge.csv',index = False)

有了节点node以及边edge后,通过gephi对《哈利波特》的人物关系进行分析:

Python爬虫爬取哈利波特小说,并用数据可视化分析出场人物相关推荐

  1. python 爬虫爬取统计局北京统计数据

    python 爬虫爬取统计局统计数据 写在前面 主要因为朋友写论文,要爬取北京的经济数据.拜托我写一个爬虫爬取数据.爬取的都是公开的数据,代码仅供学习使用,切勿用作非法. http://tjj.bei ...

  2. python爬虫爬取起点小说_python3爬虫-使用requests爬取起点小说

    import requests from lxml import etree from urllib import parse import os, time def get_page_html(ur ...

  3. python爬虫爬取网络小说

    近日沉迷网络小说不能自拔的某人让我趁着网站限免把她想看的小说爬取下来,免得到时候又要付费看书,本来对于这种又要看正版又想占便宜不给钱的行为的我是深恶痛绝的,然而...为了小命我还是做一下吧.     ...

  4. Python爬虫爬取某小说网的教程(含全代码)#大佬勿喷

    1.主要使用三个库 import parsel import requests import os 2.利用parsel解析网页 3.利用os库保存一本小说 4.链接上 小说专题: https://w ...

  5. Python爬虫-爬取17K小说

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  6. 如何用python爬虫爬取网络小说?

    这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节的URL. 分析了该小说的目录页htt ...

  7. 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

    项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...

  8. Python实战 | 爬取天气信息并数据可视化

    Github项目完整源码地址:https://github.com/xylon666/Visualization 结果展示: 环境配置 IDE:Pycharm 第三方库:requests,pandas ...

  9. 爬取猫眼短评相关数据可视化分析《悲伤逆流成河》 | 郭敬明五年电影最动人之作

    欢迎关注微信公众号:简说Python 账号:xksnh888 关注回复:1024,可以领取精选编程学习电子书籍. 本篇所有源码已上传github,点击这里获取 一.我的感受 知道<悲伤逆流成河& ...

  10. Python爬虫爬取手机APP的数据

    1.抓取APP数据包 方法详细可以参考这篇博文:http://my.oschina.net/jhao104/blog/605963 得到超级课程表登录的地址:http://120.55.151.61/ ...

最新文章

  1. Python切分图像小案例(1、3、2、4象限子图互换)
  2. Android LruCache 压缩图片 有效避免程序OOM
  3. 我的学习之路_第二十三章_HTML
  4. centos 推荐使用epel源
  5. 我们真的仍然需要32位JVM吗?
  6. python意外缩进引发逻辑错误_python – IndentationError:意外的缩进错误
  7. JS操作iframe里的dom
  8. github 仓库管理及代码上传
  9. Java抽奖抢购算法
  10. jdbc编程遇到文件上传
  11. 关于 javadoc
  12. ios 监测网页按钮_关于iOS加载WebView监控网页上的点击事件
  13. 论文中设置章节自动编号
  14. QQ上接收的文件资料在哪里能打印?
  15. 香浓熵(Shannon)与冯诺伊曼熵(Von Neumann)
  16. 新的一年,如何做好日计划、月计划与年计划?
  17. AR涂涂乐⭐一、unity高版本ImageTarget识别图开始是空白的解决办法、UI自适度
  18. 极客星球 | 图像技术在上亿规模实拍图片中的应用
  19. 解决tar: Error is not recoverable: exiting now
  20. 歌曲:后来的我们 歌手:品冠

热门文章

  1. 伤害世界服务器修改,伤害世界获取GM权限修改方法讲解
  2. 跑revit计算机硬件要求,什么样的电脑能流畅跑Revit?Revit对电脑配置要求
  3. 阿里数据中台与OneData
  4. 电脑屏幕怎么截取,常见的几种电脑截屏方法
  5. 基于SuperMap iDesktop制作天地图1--10级详细说明
  6. 开发对接微信卡包会员卡_微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)...
  7. DB---数据模型的三要素
  8. OVER(PARTITION BY)使用方法
  9. python正则表达式实战——获取图片
  10. oracle rac定时清理归档日志,Rman 定时删除归档日志