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 enumerate遍历数组示例应用
Sep 06 Python
Python装饰器基础详解
Mar 09 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
python os.listdir()乱码解决方案
Jan 31 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
python Tkinter模块使用方法详解
Apr 07 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 SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
微信小程序tabBar用法实例详解
2017/12/04 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
django之自定义软删除Model的方法
2019/08/14 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
养成教育经验材料
2014/05/26 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
五好关工委申报材料
2014/05/31 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
学历证明范文
2015/06/16 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android