python利用结巴分词做新闻地图
应用语言学的期末Pre花了差不多一个月零零碎碎的时间完成了。最初的打算爬取网易、新浪、腾讯的国内新闻,再通过提取关键词,比较这三个网站社会新闻报道的内容的倾向性。使用结巴分词进行切分,再统计地名词频,进而数据可视化得出到底哪些地方大新闻比较多。
本来作为一个语言学学生,非常希望从专业的角度分析一下结巴分词的错误案例,于是我爬取了300个新闻标题,并且进行了分类,但是发现……看不懂源码的话,最多说这个是什么成分什么成分的错,但是显然有语感的人都看得出这些分词是错的(摊手)。
但是不管怎么说,也算是一次较为完整的代码实践,打算依次记录下来。
爬虫爬取新浪新闻
#encoding = utf-8
import requests
import json
def getnews(pages):
global newsbag
newsbag = []
for page in range(1, pages + 1):
raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_'
'2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=10&show_num=100'
'&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231'
url = raw_url.format(page)
res = requests.get(url)
jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');'))
diclist = jd['result']['data']
for ent in diclist:
newsbag.append(ent['title'])
continue
return newsbag
pages = int(input("你想查询(返回输入值的100倍):"))
#因为使用的是控制下拉页加载的链接,所以每次都是抓取固定值,我设置的是100,可以通过调节 show_num 自己调整。使用一个数值较大的效率会高点。
getnews(pages)
后来想能够查指定日期的新闻标题,于是把时间戳也爬取了下来,并且做成了时间-标题的元组放到了列表里方便以后使用。修改的逻辑是首先抓取一定量的标题,然后再在这个标题里抓指定日期的新闻。这样就会有两个不便:
- 抓的数量要尽可能大才能满足调用需求
- 每次抓取都是定量的,可能最后抓的一部分并没有把最后一天的新闻抓全
我当时是先去查询爬取到的最后一条新闻的时间,然后再扩大爬取的总量,确保能把我要的日期的新闻都框在里面。
改进后的可以按日期查询新闻的代码如下
#encoding = utf-8 import requests import json def getnews(pages): global newsbag newsbag = [] titlelist = [] timelist=[] for page in range(1,pages+1): raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=100&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231' url=raw_url.format(page) res = requests.get(url) jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');')) diclist = jd['result']['data'] for ent in diclist: timestamp =float(ent['createtime']) newstime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d') timelist.append(newstime) titlelist.append(ent['title']) newsbag = zip(timelist,titlelist) return newsbag print('新浪国内新闻查询器v2.0,在定量数据范围内查询特定日期的新闻。') pages=int(input('请输入一共想要查询的页数,仅支持输入正整数,1页显示100条:')) date = str(input('请输入想查询的日期,格式以2017-04-25为例:')) getnews(pages) for i in newsbag: if i[0] == date: print(i)
使用结巴分词进行标题的切分
在结巴分词的安装上遇到了一些坑,一开始解压安装包,使用cmd
安装一直安装失败,显示的信息是什么也忘记了。后来使用最简单的pip
的方法安装好了。
结巴分词是一个优秀的开源项目,虽然后来我得知玻森分词也提供给开发者少量(但处理我的作业绰绰有余)的调用次数时已经完成了数据采集部分的工作了,不然我一定会使用玻森分词的。所以如果调用数量不大,从准确度的角度考虑,还是选用玻森分词比较好。
结巴分词的使用文档写的也很简单,但是简单的另一面是对Python新手不大友好,一开始以为结巴只能输出迭代对象,后来才发现原来也可以输出列表。
使用结巴分词切分新闻标题
# encoding = utf-8 import jieba def cutseg(): seg_list = [] for i in newsbag: seg_list = jieba.lcut(i,cut_all=True)+seg_list return "/".join(seg_list) print(cutseg())
使用结巴分词后对指定日期的新闻进行切分
结合一下改进过的查询代码后,我们直接使用结巴分词切分日期的标题,这样提高了切分的效率。这样,我们就能得到我们所需要的原始语料了。
#encoding = utf-8 import requests import json import jieba from datetime import datetime print ('haha') def getnews(pages): global newsbag newsbag = [] titlelist = [] timelist=[] for page in range(1,pages+1): raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=100&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231' url=raw_url.format(page) res = requests.get(url) jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');')) diclist = jd['result']['data'] for ent in diclist: timestamp =float(ent['createtime']) newstime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d') timelist.append(newstime) titlelist.append(ent['title']) newsbag = zip(timelist,titlelist) return newsbag def cutseg(): title_list = [] for i in timetitle: title_list = title_list+jieba.lcut(i) return title_list print('新浪国内新闻查询器v2.0,在定量数据范围内查询特定日期的新闻。') pages=int(input('请输入一共想要查询的页数,仅支持输入正整数,1页显示100条:')) date = str(input('请输入想查询的日期,格式以2017-04-25为例:')) getnews(pages) global timetitle timetitle = [] for i in newsbag: if i[0] == date: timetitle.append(i[1]) print(cutseg())
下一篇,我们将使用搜狗细胞词库将新闻标题中的地名挑选出来并且使用pandas进行数据整理!
- 【持续集成】使用 Jenkinsfile 设计直观的 Pipeline
- 将OpenOffice.org变成一个文档格式转换工具
- 客户端的web技术
- unwx:一个解压微信小程序的命令 、微信小程序是如何压缩的
- 我的第四款编辑器:微信公众号上使用 Markdown 来显示代码
- 将Quartz.NET集成到 Castle中
- listview滑动删除
- android电话拦截
- 多层分布式设计模式
- 我的职业是前端工程师【三】:学习前端只需要三个月【语言篇】
- 模式应用:自定义匹配
- 我的职业是前端工程师【五】: 前端工程师必会的六个调试技能
- WPF中ICommand接口 的一个设计问题
- 我的职业是前端工程师【四】:如何选择合适的前端框架,告别选择恐惧症
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go语言 | 并发设计中的同步锁与waitgroup用法
- LeetCode 99 | 如何不用递归遍历二叉搜索树?MT方法给你答案
- 以攻击者角度学习某风控设备指纹产品
- 高并发系统三大利器之缓存
- 前端测试题:(解析)js中关于类(class)的继承的说法,下面错误的是?
- 程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美
- MySQL数据延迟跳动的问题分析
- Python GUI项目实战(八)修改密码功能的实现
- Prometheus监控神器-Alertmanager篇(3)
- Prometheus监控神器-Alertmanager篇(4)
- 71-STM32+ESP8266+AIR202基本控制篇-移植使用-移植微信小程序MQTT底层包到自己的工程项目
- 目标检测 | Anchor free之CornerNet网络深度解析
- 手把手教你 3 分钟搞定个人网站 http 免费升级到 https
- 设计模式(四):通过做蛋糕理解构建模式及Android中的变种
- 如何入门使用腾讯云物联网开发平台 IoT Explorer,开发一盏智慧城市的智能灯?