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对象体系深入分析
Oct 28 Python
Python实现子类调用父类的方法
Nov 10 Python
用Python制作简单的钢琴程序的教程
Apr 01 Python
python使用socket进行简单网络连接的方法
Apr 29 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
Python定义一个函数的方法
Jun 15 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
python 如何引入协程和原理分析
Nov 30 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 curl 获取https请求的2种方法
2015/04/27 PHP
php header函数的常用http头设置
2015/06/25 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
JsRender for object语法简介
2014/10/31 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
Python中按值来获取指定的键
2019/03/04 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
财务经理岗位职责
2013/11/09 职场文书
对标管理实施方案
2014/03/12 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
班子四风对照检查材料
2014/08/21 职场文书
导游词之天津古文化街
2019/11/09 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
SpringBoot 集成Redis 过程
2021/06/02 Redis
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技