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类型强制转换long to int的代码
Feb 10 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
Python常见的pandas用法demo示例
Mar 16 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
Python hashlib模块加密过程解析
Nov 05 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
是否有自动比较结构的方法
2015/06/03 面试题
中专自我鉴定
2014/02/05 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android