Python爬取十篇新闻统计TF-IDF


Posted in Python onJanuary 03, 2018

统计十篇新闻TF-IDF

统计TF-IDF词频,每篇文章的 top10 的高频词存储为 json 文件

TF-IDF

TF-IDF(term frequency?inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,互联网上的搜索引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率(DF)的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。 —— [ 维基百科 ]

博主选择的是chinadaily的十篇新闻.

1.使用http request请求
2.使用Beautiful Soup来抓取文章标题和内容
3.统计TF-IDF
4.保存到json文件中

代码块

@requires_authorization
#coding=utf-8

import requests
import bs4
import sys
import math
import json
reload(sys)
sys.setdefaultencoding('utf-8')

url_list = ['http://www.chinadaily.com.cn/china/2016-04/20/content_24701635.htm',
      'http://www.chinadaily.com.cn/china/2016-04/20/content_24700746.htm',
      'http://www.chinadaily.com.cn/china/2016-04/20/content_24681482.htm',
      'http://www.chinadaily.com.cn/china/2016-04/19/content_24675530.htm',
      'http://www.chinadaily.com.cn/china/2016-04/19/content_24675455.htm',
      'http://www.chinadaily.com.cn/china/2016-04/19/content_24674074.htm',
      'http://www.chinadaily.com.cn/china/2016-04/19/content_24655536.htm',
      'http://www.chinadaily.com.cn/china/2016-04/18/content_24643685.htm',
      'http://www.chinadaily.com.cn/china/2016-04/18/content_24636917.htm',
      'http://www.chinadaily.com.cn/china/2016-04/15/content_24562198.htm'
      ]

articles_title = []
articles_content = []

for pos,url in enumerate(url_list):
  r = requests.get(url)
  soup1 = bs4.BeautifulSoup(r.text)
  soup2 = bs4.BeautifulSoup(str(soup1.find_all(id="Title_e")))
  articles_title.append(soup2.h1.string)
  mystr = ""
  soup3 = bs4.BeautifulSoup(str(soup1.find_all(id="Content")))
  for x in soup3.find_all("p"):
    mystr = mystr + x.string

  str_p = ""
  contents = []
  for pos,x in enumerate(mystr):
    if x == '.' or x == ',':
      if pos < (len(mystr) - 1) and mystr[pos+1] >= '0' and mystr[pos+1] <= '9':
        str_p = str_p + x
      elif str_p == "":
        continue
      else:
        contents.append(str_p)
        str_p = ""
    elif x == '(' or x == ')' or x == ' ' or x == '"' or x == '[' or x == ']' or x == '-':
      if str_p == "":
        continue
      else:
        contents.append(str_p)
        str_p = ""
    else:
      str_p = str_p + x

  articles_content.append(contents)

Dict_idf = {}
DictList = []

for content in articles_content:
  Dict_tf = {}
  for x in content:
    if not Dict_tf.has_key(x):
      Dict_tf[x] = 1.0
      if not Dict_idf.has_key(x):
        Dict_idf[x] = 1.0
      else:
        Dict_idf[x] += 1.0
    else:
      Dict_tf[x] += 1.0

  for k, v in Dict_tf.items():
    Dict_tf[k] = v / len(content)

  DictList.append(Dict_tf)

for k, v in Dict_idf.items():
  Dict_idf[k] = math.log(float(len(url_list)) / v)

for pos,x in enumerate(DictList):
  for k,v in x.items():
    DictList[pos][k] = v*Dict_idf[k]
  DictList[pos] = sorted(x.iteritems(), key=lambda d: d[1], reverse=True)

"""
[
  [
    article_titile:"XXXX"
    [
      {
        word:"hello"
        value:3.5
      }
      {
        word:"hello"
        value:3.5
      }
      {
        word:"hello"
        value:3.5
      }
      ...
    ]
  ]
]
"""

data = []
for pos in range(10):
  data2=[]
  data2.append("article_titile:")
  data2.append(articles_title[pos])
  data2.append([{"word": k,"value":round(v,4)} for k,v in DictList[pos][:10]])
  data.append(data2)

# Writing JSON data
with open('data.json', 'w') as f:
  json.dump(data, f)

Python爬取十篇新闻统计TF-IDF

使用json.cn查看数据:

Python爬取十篇新闻统计TF-IDF

github地址:https://github.com/mqsee/learngit

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
Python实现批量下载图片的方法
Jul 08 Python
python 写的一个爬虫程序源码
Feb 28 Python
Python中的time模块与datetime模块用法总结
Jun 30 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
Python实现微信机器人的方法
Sep 06 Python
python tkinter基本属性详解
Sep 16 Python
解决pycharm安装第三方库失败的问题
May 09 Python
Python制作词云的方法
Jan 03 #Python
Python读取Json字典写入Excel表格的方法
Jan 03 #Python
python基于ID3思想的决策树
Jan 03 #Python
python遍历文件夹下所有excel文件
Jan 03 #Python
Python将多份excel表格整理成一份表格
Jan 03 #Python
Python将多个excel文件合并为一个文件
Jan 03 #Python
python中的字典操作及字典函数
Jan 03 #Python
You might like
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
详解如何更好的使用module vuex
2019/03/27 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
CSS3 边框效果
2019/11/04 HTML / CSS
酒店人事专员岗位职责
2013/12/19 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
社会实践活动报告
2015/02/05 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
golang连接MySQl使用sqlx库
2022/04/14 Golang
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
openstack云计算keystone组件工作介绍
2022/04/20 Servers