精华内容
下载资源
问答
  • 使用Spark完成基于TF-IDF特征的新闻热点聚类

    千次阅读 热门讨论 2017-06-23 17:43:34
    写在前面互联网各个地方时时刻刻都在发生着这样或者那样事件,如果使用人工去...本文简单实现一个简单的新闻件事聚类。后期可以从各大主流媒体网站爬取数据,第隔一段时间聚类一次,如果一类报道中文章数据比较多,

    写在前面

    互联网各个地方时时刻刻都在发生着这样或者那样的事件,如果使用人工去观察根本无法及时的知晓哪地方发生了什么热点事件,做为主流媒体更希望第一时间得知热点事件的发生,好及时的紧靠热点。舆情监控的目的就是及时的得知互联网上发生的热点事件,舆情监控也是媒体大数据的一项重要工作。本文实现一个简单的新闻件事聚类。后期可以从各大主流媒体网站爬取数据,每隔一段时间聚类一次,如果一类报道中文章数据比较多,增加速度比较快,那么这个事件可能就是热点事件。

    数据准备

    原始数据如下图所示,文件格式为:

    ID====title====content

    这里写图片描述
    需要输出的结果如下:

    事件---------------------龙排龙舟迎端午 浙江山水好热闹
    21522084
    21524756 21524756 不一样的民俗!嘉兴端午踏白船荡漾浓浓水乡情
    21524710 21524710 贵州碧江:中外龙舟端午节“九九争一”赛龙舟
    21524842 21524842 碧水龙舟渡 逐浪竞风流
    21522988 21522988 端午西溪龙船鼓 百舸竞渡劈波来
    21522084 21522084 余杭:“龙腾西溪·荷韵洪园” 等你来耍
    21524016 21524016 “我们的节日——端午看云龙” 大型民俗活动举行
    21525288 21525288 [南湖] 水乡踏白船
    21524722 21524722 杭州西溪“龙舟盛会”展非遗魅力 11大名校龙舟竞渡
    21525232 21525232 香港端午节里看民俗:“放纸龙”、龙舟竞渡、游龙舟水
    21524736 21524736 2017杭州西溪龙舟文化节:龙舟竞渡传统胜会 精彩纷呈活力端午
    21524830 21524830 西溪龙舟赛添洋味 骆家庄龙船宴寄乡愁
    21524786 21524786 龙舟赛龙船宴 杭州骆家庄改造后的首个端午太壮观
    21524758 21524758 今天端午节,ta刷屏了西湖人的朋友圈!
    21524302 21524302 2017年中国·嘉兴端午民俗文化节开幕
    21524570 21524570 龙排龙舟迎端午 浙江山水好热闹
    21522736 21522736 西溪国际龙舟赛十强战队出炉 世界赛艇冠军强势加盟
    21525673 21525673 300桌!昨天骆家庄摆了一场超大规模的端午宴
    21525277 21525277 300桌!杭州骆家庄昨天摆了超大规模的端午宴
    21524557 21524557 龙排龙舟迎端午 浙江山水好热闹
    21524507 21524507 2017年中国·嘉兴端午民俗文化节开幕
    21524845 21524845 水乡踏白船 山溪放龙排
    21524995 21524995 水乡踏白船!浙江日报关注嘉兴端午踏白船表演赛
    21525467 21525467 赛龙舟、吃粽子,外国友人也爱过中国传统佳节
    21524959 21524959 浓浓文化味 处处庆端阳
    21524031 21524031 龙腾西溪·荷韵洪园:杭州西溪龙舟文化节即将开场
    21525463 21525463 赛艇世界杯冠军强势助阵 观众选手嗨翻天
    21522963 21522963 端午西溪龙船鼓百舸竞渡劈波来
    21523201 21523201 2017杭州西溪龙舟文化节于528日-30日举行
    21523461 21523461 龙舟竞渡争上游 鄞州云龙举行特色民俗活动庆端午
    21525131 21525131 中华大赛为全运预演
    21525461 21525461 遂昌千年“龙排”盛景 民俗独特
    事件---------------------温州市开展社区反邪教宣传活动
    21520351
    21526682 21526682 杭州市下城区文晖街道创建反邪教警示教育阵地群
    21526686 21526686 温州泰顺县反邪教宣传进校园
    21526198 21526198 温岭市开展反邪教宣传教育活动
    21521420 21521420 宁波市海曙区举办知识竞赛
    21520366 21520366 警惕全能神的黑色暴力(图)
    21521410 21521410 温州借文艺巡演开展反邪宣传
    21526196 21526196 湖州市吴兴区开展平安文化广场反邪宣传
    21525360 21525360 绍兴市南明街道举办反邪教现场书画比赛
    21525366 21525366 江山市举办科普反邪文艺演出
    21526166 21526166 金华市举办“崇尚科学,反对邪教”主题漫画展
    21525358 21525358 丽水市利用首个科技工作者日开展反邪宣传
    21522462 21522462 温州永嘉县召开村居反邪教工作业务培训会议
    21526192 21526192 嘉兴市召开“宗教反邪”推进会
    21521402 21521402 绍兴市城南社区安装显示屏 反邪宣传开辟新渠道
    21526172 21526172 舟山反邪宣传礼献六一
    21520352 21520352 绍兴市南明街道反邪知识墙绘扮靓社区
    21520351 21520351 丽水市缙云县借助科技活动周全面开展反邪宣传活动
    21525357 21525357 温州市反邪宣传进校园
    21521425 21521425 衢州柯城区开展反邪教党员日
    21525369 21525369 杭州滨江在端午节传递反邪知识
    21525359 21525359 嘉兴建设街道开展反邪宣传
    21525349 21525349 平湖市1个镇和3个村社区获批全国无邪教创建示范单位
    21522463 21522463 台州临海开展广场反邪宣传
    21520359 21520359 舟山群岛科技周开展反邪宣传
    21529645 21529645 黄岩:红叶不负好韶华  愿做春泥更护花
    21529511 21529511 瑞安市开展平安反邪宣传活动
    21522461 21522461 温州市开展社区反邪教宣传活动
    21521415 21521415 兰溪市反邪教漫画进车亭
    21529643 21529643 黄岩:红叶不负好韶华  愿做春泥更护花
    21520361 21520361 江山市开展反邪教进文化礼堂互学互促活动
    事件---------------------昨天杭州气温34.9℃ 创入夏以来新高
    21522078
    21524772 21524772 昨天杭州气温34.9℃ 创入夏以来新高
    21527308 21527308 双休日天气不错,高考前有雨
    21526448 21526448 感觉有点闷?距离入梅还早!双休日杭州的天会放晴
    21524970 21524970 昨天杭州气温34.9℃ 创入夏以来新高
    21528814 21528814 芒种时节雨量充沛,昨天的大雨很应景,不过——高考期间全省多云为主,比较闷热
    21524808 21524808 这个六一儿童节,要湿哒哒地度过了
    21529122 21529122 本周将迎来2017年高考 其间天气晴好午间较热 考生要注意防暑降温
    21527516 21527516 好天气明起暂别 宁波周一起将转为阵雨或雷雨的天气
    21524628 21524628 今天端午节杭州最高气温33℃ 雨就要来了!
    21524832 21524832 这个六一儿童节,要湿哒哒地度过了
    21522078 21522078 端午小长假热三天 气温30摄氏度朝上
    21527924 21527924 本周将迎来2017年高考 其间天气晴好午间较热
    21525682 21525682 六月天 孩子脸 你准备好迎接这个下雨的儿童节了吗?
    21524740 21524740 今天端午 你有没有吃“五黄六白” 家里挂菖蒲插艾叶了吗
    21523028 21523028 宁波端午节期间晴好宜出游 最高气温在30℃上下
    21528046 21528046 高考期间有点热 考生需做好防暑
    21527213 21527213 双休日天气不错,高考前有雨相伴
    21526449 21526449 感觉有点闷?距离入梅还早 好在这个双休日,天晴啦
    21523533 21523533 端午小长假 天气“心情好”
    21527803 21527803 凉爽将至 六月雨水要变多
    21524775 21524775 昨天杭州气温34.9℃ 创入夏以来新高
    21524815 21524815 六月份杭州只有5天不下雨?这是真的吗
    21522995 21522995 宁波端午晴好宜出游 最高气温在30℃上下
    21527331 21527331 双休日天气不错,高考前有雨
    21527227 21527227 双休日杭州的天气不错 高考前有雨
    21527817 21527817 凉爽将至 六月雨水要变多
    21526515 21526515 六月是杭州降水集中期 不过距离入梅还早
    21524787 21524787 朋友圈热传"6月份宁波只晴6天" 气象台回应
    21526421 21526421 感觉有点闷?距离入梅还早 好在这个双休日,天晴啦
    事件---------------------西湖区计生协举办“5.29会员活动日”
    21521130
    21525978 21525978 宁波市计生协召开六届二次理事会
    21525994 21525994 桐乡市召开计生家庭安康保险工作会议
    21525992 21525992 宁波市计生协改革理事会领导机构增设基层一线兼职副会长
    21521130 21521130 关爱新市民 真情暖万家 提升流动人口获得感和幸福感
    21523288 21523288 西湖区举办“5.29会员活动日”暨流动人口健康服务年启动仪式
    21526000 21526000 长兴县计生协开展“最美协会人”投票评选活动
    21525996 21525996 文成县计生协联合部门共同举办亲子运动会
    21525976 21525976 富阳区全面部署基层计生协换届选举工作
    21525020 21525020 南湖区举办“5.29”大型宣传服务活动
    21525018 21525018 南湖:“5.29”生育关怀温暖计生困难家庭
    21525988 21525988 嘉兴:关爱计生家庭 重视保险保障
    21522720 21522720 5.29宣传服务 西溪街道活动丰富接地气
    21523662 21523662 浙江省计生协启动“5.29会员活动日”暨流动人口健康服务年活动
    21524998 21524998 柯城区计生协举办文艺晚会纪念第19个“5.29”会员活动日
    21525008 21525008 西湖区计生协举办“5.29会员活动日”
    21525981 21525981 西湖区计生协会长卢华英走访慰问特殊家庭
    21525013 21525013 乐清市计生协创新“5.29”宣传服务月活动
    21525003 21525003 龙泉市计生协积极开展“5.29会员活动日”宣传服务活动
    21525025 21525025 桐乡市举办“5·29”计生宣传专场文艺演出
    21525009 21525009 洞头区举办“5.29”计生协会纪念日主题活动启动仪式
    21525031 21525031 镇海区举行“5.29会员活动日”主题宣传服务活动
    21525007 21525007 温州市:三级联动 共庆“5.29”会员活动日
    21523651 21523651 金禹社区开展计生宣传活动
    21524997 21524997 金华市举办“生育关怀 健康相伴”5.29大型宣传活动
    21525983 21525983 洞头区计生协开展计生协实务工作培训
    21525027 21525027 萧山区计生协举办5.29会员活动日宣传活动
    21525993 21525993 三门县计生协召开计生家庭保险工作会议
    21526001 21526001 镇海区成立计生特殊家庭健康关爱中心

    完整代码

    package com.zhaochao
    
    import org.ansj.splitWord.analysis.BaseAnalysis
    import org.apache.spark.graphx.Graph
    import org.apache.spark.mllib.feature.{HashingTF, IDF}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.mllib.linalg.{SparseVector => SV}
    
    
    object groupNews {
    
      def main(args: Array[String]): Unit = {
    
        //相似度阈值
        val sim = 0.5
        val sparkconfig = new SparkConf().setAppName("DocSim").setMaster("local[2]")
    
        val ctx = new SparkContext(sparkconfig)
        val path = "E:\\te.txt"
        //加载过滤数据(id,title,content)
        val input = ctx.textFile(path).map(x => x.split("====").toSeq).filter(x => x.length == 3 && x(1).length > 1 && x(2).length > 1)
    
    
        //分词(id,title,[words])
        val splitWord = input.map(x => (x(0), x(1), BaseAnalysis.parse(x(2)).toStringWithOutNature(" ").split(" ").toSeq))
    
    
        //聚类初始化 计算文章向量(id,(id,content,title))
        val init_rdd = input.map(a => {
          (a(0).toLong, a)
        })
        init_rdd.cache()
    
    
        //计算TF-IDF特征值
        val hashingTF = new HashingTF(Math.pow(2, 18).toInt)
        //计算TF
        val newSTF = splitWord.map(x => (x._1, hashingTF.transform(x._3))
        )
        newSTF.cache()
        //构建idf model
        val idf = new IDF().fit(newSTF.values)
        //将tf向量转换成tf-idf向量
        val newsIDF = newSTF.mapValues(v => idf.transform(v)).map(a => (a._1, a._2.toSparse))
    
    
        newsIDF.take(10).foreach(x => println(x))
    
    
        //构建hashmap索引 ,特征排序取前10个
        val indexArray_pairs = newsIDF.map(a => {
          val indices = a._2.indices
          val values = a._2.values
          val result = indices.zip(values).sortBy(-_._2).take(10).map(_._1)
          (a._1, result)
        })
        //(id,[特征ID])
        indexArray_pairs.cache()
    
    
        indexArray_pairs.take(10).foreach(x => println(x._1 + " " + x._2.toSeq))
    
    
        //倒排序索引 (词ID,[文章ID])
        val index_idf_pairs = indexArray_pairs.flatMap(a => a._2.map(x => (x, a._1))).groupByKey()
    
    
        index_idf_pairs.take(10).foreach(x => println(x._1 + " " + x._2.toSeq))
    
        //倒排序
        val b_content = index_idf_pairs.collect.toMap
        //广播全局变量
        val b_index_idf_pairs = ctx.broadcast(b_content)
        //广播TF-IDF特征
        val b_idf_parirs = ctx.broadcast(newsIDF.collect.toMap)
    
    
        //相似度计算 indexArray_pairs(id,[特征ID]) b_index_idf_pairs( 124971 CompactBuffer(21520885, 21520803, 21521903, 21521361, 21524603))
        val docSims = indexArray_pairs.flatMap(a => {
    
    
          //将包含特征的所有文章ID
          var ids: List[Long] = List()
    
          //存放文章对应的特征
          var idfs: List[(Long, SV)] = List()
    
          //遍历特征,通过倒排序索引取包含特征的所有文章,除去自身
          a._2.foreach(b => {
            ids = ids ++ b_index_idf_pairs.value.get(b).get.filter(x => (!x.equals(a._1))).map(x => x.toLong).toList
          })
    
    
          //b_idf_parirs(tf-idf特征),遍边文章,获取对应的TF-IDF特征
          ids.foreach(b => {
            idfs = idfs ++ List((b, b_idf_parirs.value.get(b.toString).get))
          })
    
          //获取当前文章TF-IDF特征
          val sv1 = b_idf_parirs.value.get(a._1).get
    
          import breeze.linalg._
          //构建当前文章TF-IDF特征向量
          val bsv1 = new SparseVector[Double](sv1.indices, sv1.values, sv1.size)
          //遍历相关文章
          val result = idfs.map {
            case (id2, idf2) =>
              val sv2 = idf2.asInstanceOf[SV]
              //对应相关文章的特征向量
              val bsv2 = new SparseVector[Double](sv2.indices, sv2.values, sv2.size)
              //计算余弦值
              val cosSim = bsv1.dot(bsv2) / (norm(bsv1) * norm(bsv2))
              (a._1, id2, cosSim)
          }
          // 文章1,文章2,相似度
          result.filter(a => a._3 >= sim)
        })
    
    
        docSims.take(10).foreach(x => println(x))
        //取出所有,有相似度的文章
        val vertexrdd = docSims.map(a => {
          (a._2.toLong, a._1.toLong)
        })
    
    
        //构建图
        val graph = Graph.fromEdgeTuples(vertexrdd, 1)
        val graphots = Graph.graphToGraphOps(graph).connectedComponents().vertices
    
        //聚类初始化 计算文章向量  init_rdd(id,(id,content,title))
        init_rdd.join(graphots).take(10).foreach(x => println(x))
    
        val simrdd = init_rdd.join(graphots).map(a => {
          (a._2._2, (a._2._1, a._1))
        })
        val simrddtop = simrdd.groupByKey().filter(a => a._2.size >= 6).sortBy(-_._2.size).take(50)
        val simrdd2 = ctx.parallelize(simrddtop, 18)
    
    
        simrdd2.take(10).foreach(x => {
          val titles = x._2.map(x => x._1(1)).toArray
          //选取事件主题名
          val title = mostSimilartyTitle(titles)
          println("事件---------------------" + title)
          println(x._1)
          x._2.foreach(x => println(x._2 + " " + x._1(0) + " " + x._1(1)))
    
    
    
        })
    
    
      }
    
    
      /**
        * 相似度比对 最短编辑距离
        * @param s
        * @param t
        * @return
        */
      def ld(s: String, t: String): Int = {
        var sLen: Int = s.length
        var tLen: Int = t.length
        var cost: Int = 0
        var d = Array.ofDim[Int](sLen + 1, tLen + 1)
        var ch1: Char = 0
        var ch2: Char = 0
        if (sLen == 0)
          tLen
        if (tLen == 0)
          sLen
        for (i <- 0 to sLen) {
          d(i)(0) = i
        }
        for (i <- 0 to tLen) {
          d(0)(i) = i
        }
        for (i <- 1 to sLen) {
          ch1 = s.charAt(i - 1)
          for (j <- 1 to tLen) {
            ch2 = t.charAt(j - 1)
            if (ch1 == ch2) {
              cost = 0
            } else {
              cost = 1
            }
            d(i)(j) = Math.min(Math.min(d(i - 1)(j) + 1, d(i)(j - 1) + 1), d(i - 1)(j - 1) + cost)
          }
        }
        return d(sLen)(tLen)
      }
    
      /**
        *
        * @param src
        * @param tar
        * @return
        */
      def similarity(src: String, tar: String): Double = {
        val a: Int = ld(src, tar)
        1 - a / (Math.max(src.length, tar.length) * 1.0)
      }
    
    
      /**
        * 选出一组字符串 中相似度最高的
        * @param strs
        * @return
        */
      def mostSimilartyTitle(strs: Array[String]): String = {
        var map: Map[String, Double] = Map()
        for (i <- 0 until strs.length) {
          for (j <- i + 1 until strs.length) {
            var similar = similarity(strs(i), strs(j))
            if (map.contains(strs(i)))
              map += (strs(i) -> (map.get(strs(i)).get + similar))
            else
              map += (strs(i) -> similar)
            if (map.contains(strs(j)))
              map += (strs(j) -> (map.get(strs(j)).get + similar))
            else
              map += (strs(j) -> similar)
          }
        } //end of for
        if (map.size > 0)
          map.toSeq.sortWith(_._2 > _._2)(0)._1
        else
          ""
      }
    
    }
    
    
    展开全文
  • 在舆情系统中,通常会有一个网络新闻爬虫子系统,准实时采集互联网上媒体新闻数据,以供上层聚类事件分析。这类新闻数据组成元素包括: 标题 发布时间 来源及其URL链接地址 正文文本内容 正文图片信息...

    一、背景

        在舆情系统中,通常会有一个网络新闻爬虫子系统,准实时的采集互联网上的媒体新闻数据,以供上层聚类事件分析。这类新闻数据的组成元素包括:

    • 标题
    • 发布时间
    • 来源及其URL链接地址
    • 正文文本内容
    • 正文图片信息(图片位置、图片的URL路径等)
    • 其他

    二、libnpce组件

        新闻文章正文抽取News Passage Content Extractor (NPCE),是为抽取HTML中的文章正文而设计的。该组件提供给予so动态链接库的调用接口和给予RESTful服务调用的接口形式。并支持python调用接口。

       详细介绍可参考:https://tangyibo.github.io/libariry/2020/01/17/a-news-passage-content-extractor-library/

     

    三、组件演示

    打开页面:

       https://gitee.com/inrgihc/libnpce/releases/v1.0

    下载httpd_npce_py-v1.0-bin.tar.gz文件,在centos环境下解压,然后执行:

    cd httpd_npce_py/
    ./startup.sh

    命令启动服务,打开浏览器访问服务器上的服务:http://XXX.XXX.XXX.XXX:7645

    在页面中的URL栏中粘贴一个新闻页面的URL地址,然后点击右侧的“抽取”按钮查看效果,我的截图如下:

    抽取的URL地址:http://news.sina.com.cn/c/2016-11-07/doc-ifxxnffr6962826.shtml

    三、性能测试

        经本人工作期间,将libnpce与计算所的constor组件(闭源)进行比较测试,性能相当,并应用在公司底层的爬虫模块中进行实时正文抽取。

     

     

    展开全文
  • 【Python】爬虫爬取各大网站新闻(一)

    万次阅读 热门讨论 2016-03-27 10:06:07
    作者博客地址:http://andyheart.mePython爬虫一步一步爬取文章背景最近在学习机器学习算法,分为回归,分类,聚类等,在学习过程中苦于没有数据做练习,就想爬取一下国内各大网站的新闻,通过训练,然后对以后的...

    作者简历地址:http://resume.hackycoder.cn

    Python爬虫一步一步爬取文章

    背景

    最近在学习机器学习算法,分为回归,分类,聚类等,在学习过程中苦于没有数据做练习,就想爬取一下国内各大网站的新闻,通过训练,然后对以后的新闻做一个分类预测。在这样的背景之下,就开始了我的爬虫之路。

    网站分析

    国内各大新闻网站汇总(未完待续):

    搜狐新闻

    时政:http://m.sohu.com/cr/32/?page=2&_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2
    社会:http://m.sohu.com/cr/53/?page=2&_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2
    天下:http://m.sohu.com/cr/57/?_smuid=1qCppj0Q1MiPQWJ4Q8qOj1&v=2
    
    总的网址:http://m.sohu.com/cr/4/?page=4     第一个4代表类别,第二个4代表页数

    网易新闻

    推荐:http://3g.163.com/touch/article/list/BA8J7DG9wangning/20-20.html      主要修改20-20
    新闻:http://3g.163.com/touch/article/list/BBM54PGAwangning/0-10.html
    娱乐:http://3g.163.com/touch/article/list/BA10TA81wangning/0-10.html
    体育:http://3g.163.com/touch/article/list/BA8E6OEOwangning/0-10.html
    财经:http://3g.163.com/touch/article/list/BA8EE5GMwangning/0-10.html
    时尚:http://3g.163.com/touch/article/list/BA8F6ICNwangning/0-10.html
    军事:http://3g.163.com/touch/article/list/BAI67OGGwangning/0-10.html
    手机:http://3g.163.com/touch/article/list/BAI6I0O5wangning/0-10.html
    科技:http://3g.163.com/touch/article/list/BA8D4A3Rwangning/0-10.html
    游戏:http://3g.163.com/touch/article/list/BAI6RHDKwangning/0-10.html
    数码:http://3g.163.com/touch/article/list/BAI6JOD9wangning/0-10.html
    教育:http://3g.163.com/touch/article/list/BA8FF5PRwangning/0-10.html
    健康:http://3g.163.com/touch/article/list/BDC4QSV3wangning/0-10.html
    汽车:http://3g.163.com/touch/article/list/BA8DOPCSwangning/0-10.html
    家居:http://3g.163.com/touch/article/list/BAI6P3NDwangning/0-10.html
    房产:http://3g.163.com/touch/article/list/BAI6MTODwangning/0-10.html
    旅游:http://3g.163.com/touch/article/list/BEO4GINLwangning/0-10.html
    亲子:http://3g.163.com/touch/article/list/BEO4PONRwangning/0-10.html
    

    未完待续。。。

    爬取过程

    第一步:简单的爬取

    在这个过程中主要用到了urllib2BeautifulSoup两个包,以搜狐新闻为例,做了一个简单的爬取内容的爬虫,没有做任何的优化等问题,因此会出现假死等情况。

    # -*- coding:utf-8 -*-
    '''
    Created on 2016-3-15
    
    @author: AndyCoder
    '''
    import urllib2
    from bs4 import BeautifulSoup
    import socket
    import httplib
    
    
    class Spider(object):
        """Spider"""
        def __init__(self, url):
            self.url = url
    
        def getNextUrls(self):
            urls = []
            request = urllib2.Request(self.url)
            request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \
                WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')
            try:
                html = urllib2.urlopen(request)
            except socket.timeout, e:
                pass
            except urllib2.URLError,ee:
                pass
            except httplib.BadStatusLine:
                pass
    
            soup = BeautifulSoup(html,'html.parser')
            for link in soup.find_all('a'):
                print("http://m.sohu.com" + link.get('href'))
                if link.get('href')[0] == '/':
                    urls.append("http://m.sohu.com" + link.get('href'))
            return urls
    
    def getNews(url):
        print url
        xinwen = ''
        request = urllib2.Request(url)
        request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \
            WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')
        try:
            html = urllib2.urlopen(request)
        except urllib2.HTTPError, e:
            print e.code
    
        soup = BeautifulSoup(html,'html.parser')
        for news in soup.select('p.para'):
            xinwen += news.get_text().decode('utf-8')
        return xinwen
    
    
    class News(object):
        """
        source:from where 从哪里爬取的网站
        title:title of news  文章的标题    
        time:published time of news 文章发布时间
        content:content of news 文章内容
        type:type of news    文章类型
        """
        def __init__(self, source, title, time, content, type):
            self.source = source              
            self.title = title                 
            self.time = time                
            self.content = content            
            self.type = type                
    
    
    file = open('C:/test.txt','a')
    for i in range(38,50):
        for j in range(1,5):
            url = "http://m.sohu.com/cr/" + str(i) + "/?page=" + str(j)
            print url
            s = Spider(url)
            for newsUrl in s.getNextUrls():
                file.write(getNews(newsUrl))
                file.write("\n")
                print "---------------------------"
    
    
    

    第二步:遇到的问题

    在上述代码运行过程中,会遇到一些问题,导致爬虫运行中断,速度慢等问题。下面列出来几种问题:

    • 关于代理服务器的问题
    • 关于404等HTTP状态码的问题
    • 关于速度慢的问题

    第三步:解决办法

    1. 代理服务器

      可以从网上寻找一些代理服务器,然后通过设置爬虫的代理从而解决IP的问题。代码如下:

      def setProxy(pro):
      
      proxy_support=urllib2.ProxyHandler({'https':pro})
      opener=urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
      urllib2.install_opener(opener)
    2. 关于状态问题,如果寻找不到网页则直接舍弃,因为丢弃少量的网页不影响以后的工作。

      def getHtml(url,pro):
      urls = []
      
      request = urllib2.Request(url)
      setProxy(pro)
      request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \
          WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')
      
      try:
          html = urllib2.urlopen(request)
          statusCod = html.getcode()
          if statusCod != 200:
              return urls
      except socket.timeout, e:
          pass
      except urllib2.URLError,ee:
          pass
      except httplib.BadStatusLine:
          pass
      
      return html
    3. 关于速度慢的问题,可以采用多进程的方式进行爬取。在分析完网址以后,可以在Redis中使用有序的集合作为一个队列,既解决了URL重复的问题,又解决了多进程的问题。(暂未实现)

    第四步:运行

    昨天晚上尝试运行了一下,爬取搜狐新闻网的部分网页,大概是50*5*15=3750多个网页,从而解析出来了2000多条新闻,在网速为将近1Mbps的情况下,花费了1101s的时间,大概是18分钟左右。

    效果图

    展开全文
  • 协同过滤推荐算法在网站中应用非常广泛,比如:电子商务网站、购物系统、个性化音乐网站、电影网站、图书网站、新闻网站等等。 二、基于用户/项目协同过滤推荐算法在推荐系统中应用 作者实现了协同过滤推荐算法...
  • 精确提取新闻内容

    千次阅读 2015-12-26 14:53:21
    以前在《数学之美》的“余弦定理和新闻的分类”一文中看到,2002年夏天,Google推出了自己的新闻服务,而这些内容来源于对其它新闻网站内容的抓取、整理和分类,而构建这个新闻网站的关键技术是新闻的自动分类。...

    以前在《数学之美》的“余弦定理和新闻的分类”一文中看到,2002年夏天,Google推出了自己的新闻服务,而这些内容来源于对其它新闻网站内容的抓取、整理和分类,而构建这个新闻网站的关键技术是新闻的自动分类。我相信了作者,认真学习了书中介绍的新闻自动分类技术:利用余弦定理计算新闻相似度的层次聚类和利用奇异值分解的聚类。之后,我就觉得自己掌握了自动构建新闻网站的绝技。然而,直到最近,我才如梦初醒,发现自动构建新闻网站并不如之前想的那么简单。而破碎我的梦的并不是新闻聚类(我都还没走到这一步),而是精确提取新闻内容。
    以前认为简单,是因为我把新闻内容整理想得太简单了——仅仅是获得网页中的纯文本。这或许对一个粗陋的新闻类垂直搜索引擎来说够了,然后,新闻读者和搜索引擎需要的输入不一样,我们并不能直接把包含新闻的网页中的纯文本直接扔给读者就了事,而是需要提供给读者内容完整、不含杂质(广告、别人网站的网页框架等)的新闻。精确提取新闻内容本是不易之事,然而还需对这个不易之事加一个前提条件:海量新闻。针对这个问题,我先介绍我所知的几个有启发意义的正文提取方法以及它们的问题,然后给出自己的解法。

    《基于行块分布函数的通用网页正文抽取》一文中提出的网页正文抽取方法可能是网络上流传最广的方法了。它的思想是,一个主题类网页(我们这里是新闻)详情页只有一个数据区域,只要提取出这个数据区域就行了;找到这个数据区域的方法是,对网页内容分块,一块是指从某一行开始至某一行结束的区域,举个例子,第n块由第n行、n+1行和n+2行组成,第n+1块由第n+1行、n+2行和n+3行组成,然后提取出每一块中的纯文本,其中纯文本最多的那一块一定包含在正文之中;找到了之中的某一块,就可以利用这部分内容来找到正文边界了,文中指出,主题类网页的正文部分纯文本很多,而其它部分则较少,可以从之前定位到那一个块的位置开始往前往后找,找到的纯文本数量骤降点,就是边界了;最终利用边界信息提取出正文。这个方法能够准确的提取出大部分新闻的正文。我们以新闻:
    http://society.people.com.cn/n1/2015/1226/c1008-27978755.html
    为例,根据文章作者提供的代码,它能够提取出新闻正文,但在正文最后包含一些杂质信息。而且,该方法也真的只能提取出正文,难以提取出与正文相关的那些非常重要的信息,也就是新闻的标题、来源、时间和标题与正文之间的图片,对于例子网页,丢失的是这部分信息:
    这里写图片描述
    多了信息不可怕,我们可以对得到的内容进一步提纯,可怕的是,它可能会丢失我们想要的信息,丢了就找不回来了。

    第二方法就是大名鼎鼎的Readability算法。这个算法是并不是专门针对主题类网页而提出的,它是一个通用的算法,能够针对输入的任何网页返回一个比较干净的网页。它的主要思想是,通过给定网页构建一棵DOM树,对其中body节点子树中的每一个后代节点打分,获得得分满足要求的节点,这些节点包含读者想读的内容,然后把这些节点整理为一个网页返回。用该算法的Java实现处理上面的示例新闻,结果跟上一种方法差不多。不过,通过DOM树,可以容易用另外的方式获得新闻的时间和来源。新闻时间可以通过在标题和正文之间的内容上通过正则表达式匹配出来;来源则可以在标题和正文之间的内容上通过“来源”关键字找出,并把找到的来源存储起来,用于在这部分内容中没有“来源”关键字的时候去匹配来源;最终解决问题。如果它对任何新闻类网页都只是不能提取新闻的来源和时间的话,那它就已经能满足精确提取新闻内容的要求了,可是,它还有其它问题,比如,大部分情况下会丢失新闻标题和正文之间的图片等信息,有时在正文之后还会存在另外一些不需要的信息(二维码图片,版权信息等)。同样,核心问题在于信息丢失。

    第三种方法是RoadRunner。这个算法试图从一组由相同模板生成的网页中发现模板,然后用这个模版去解析由这个模板生成的其它网页。这个算法的目标是让人心动的,但是我尝试这个算法的一个开源实现,却总是不能得到预期的结果。暂时还没有深入学习该算法的具体实现,对其细节了解不深,故这里就不多讲了,文章后面会给出我尝试的开源实现,大家有兴趣可以试试。

    最后,我给出我的解法。这个解法是基于《基于行块分布函数的通用网页正文抽取》和Readability算法的。该解法基于这样一些事实:
    (1)新闻详情页只有一个数据区域;
    (2)组成数据区域的节点是兄弟节点,它们有共同的父节点;
    (3)如果利用Readability算法中给节点打分的方式给文档树中的body节点的后代节点打分,那么得分最高的节点必定是组成数据区域的节点的某个祖先节点——正文节点;
    (4)这个正文节点的后代节点中可能包含标题节点,也可能不包含标题节点(有用的废话)。
    基于(1)(2)(3),我们可以很容易获得正文节点,我们可以利用新闻标题和网页标题之间的一些关系(比如新闻标题是网页标题的子串)来获得标题节点。我们可以求得新闻标题节点和正文节点最近公共父节点——新闻节点,这个节点内包含我们想要的新闻内容,并且已经去除了网页中的大部分杂质。接下来,我们要做的就是去除新闻节点中没有被剔除的杂质,比如从新闻节点到正文节点的路径右边的所有节点都该删除。基于(4),我们需要分情况处理标题节点周围的信息。剔除信息的标准是,宁可放过,也不错杀,这保证了我们需要的信息永远都在。然后,经过层层清洗,最终得到干净的新闻。我已经实现了该解法,并且经过简单测试,发现效果不错。但是没有经过专业测试,而且实现也没有做到极致,最终是否能剔干净所有杂质并没有得到验证,这里写出来有两个目的,一是记录下来,帮助理清思路,二是分享给大家,望有经验的大神给些建议。

    相关源码链接:
    Readability
    基于行块分布函数的通用网页正文抽取
    RoadRunner
    参考文献:
    基于行块分布函数的通用网页正文抽取,作者:陈鑫。
    《Web数据挖掘》第二版,作者:Bing Liu,译者:俞勇。

    展开全文
  • 新闻网页排序初步

    2007-05-28 19:49:00
    新闻网页排序与普通网页排序有几个显著区别。首先是时效性,新闻网页一般都有发布时间,这是新闻的重要特征,...该新闻的流行程度(Popularity),这主要可以通过聚类分法找到同类新闻的数量.当然肯定还有其他因素可以
  • 全栈工程师开发手册 (作者:栾鹏) ...今天我们使用python3.6来爬去百度新闻RSS中数据,有了数据集,这样可以对样本数据集进行分类、聚类、推荐算法学习 调试环境python3.6 # 获取百度新闻数据
  • scrapy+Lucene搭建小型搜索引擎(现代信息检索大作业)

    万次阅读 多人点赞 2016-05-22 22:51:12
    定向采集 3-4 个新闻网站, 实现这些网站信息抽取、索引和检索。网页数 目不少于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相似 新闻自动聚类。 要求: 有相关搜索推荐、snippet...
  • 互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪、还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。 最简单的文本相似性计算方法...
  • 推荐算法之Co-Clustering算法

    千次阅读 2019-07-30 23:50:45
    数据User-Item评分矩阵常见于各社交平台的数据之中,例如音乐网站的用户-歌曲评分矩阵,新闻网站的用户-新闻评分矩阵,电影网站的用户-电影评分矩阵等等。在聚类分析中,也常常将数据计算成User-User的相...
  • 互联网网页存在大量的内容重复的网页, 文本,无论对于搜索引擎,爬虫的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。为此必须有一套...
  • 我们根据他们提及媒体人员,他们在VK中分享受众以及他们从相关主题模型结果涵盖哪些主题来对媒体进行聚类。 我项目部分: -VK中群组/公开ID无限滚动抓取工具。 VK使用特定类型媒体以及类别过滤器提供...
  • 定向采集 3-4 个新闻网站, 实现这些网站信息抽取、索引和检索。网页数 目不少于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相似 新闻自动聚类。要求: 有相关搜索推荐、snippet 生....
  • scrapy+Lucene搭建小型搜索引擎(现代信息检索大作业)一、选题工程类搜索型:定向采集 3-4 个新闻网站, 实现这些网站信息抽取、索引和检索。网页数 目不少于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性...
  • Mahout 在极短的时间内取得了长足的发展。项目的关注点仍然可以归纳为我所说的 “3 个要点”:协同过滤(推荐机制)、聚类和...建议读者阅读 Mahout 网站的新闻”部分和各 Mahout 发布版的发布说明,以了解这方面的
  • 8. 数据挖掘应用 电信 客户群体划分客户流失性分析客户信用记分筛选因特网上的新闻 银行聚类细分交叉销售数据库营销背景分析 百货公司/超市购物篮分析 关联规则预测准客户需要 保险细分交叉销售流失原因分析欺诈...
  • 文本分类与线性代数

    2019-06-06 21:22:06
    现如今,有些新闻网站已经不做新闻“生产者”,它们只做新闻“搬运工”,也就是说这些网站本身不编辑任何新闻,它们只是对网络上已有新闻进行分类,聚合,然后推荐给用户,那么在这个“搬运”过程中就涉及...
  • 前言 (1)Mahout框架中cf.taste包实现了推荐算法引擎,它提供了...Google news使用聚类技术通过标题把新闻文章进行分组,从而按照逻辑线索来显示新闻,而并非给出所有新闻的原始列表。 分类 雅虎邮箱基于用户以前对正
  • 针对偏好的聚类 44 以二维形式展现数据 49 有关聚类的其他事宜 53 第4章 搜索与排名 54 搜索引擎的组成 54 一个简单的爬虫程序 56 建立索引 58 查询 63 基于内容的排名 64 利用外部回指链接 69 从点击行为...
  • 文本指纹介绍互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本...
  • 文本指纹算法和内容指纹系统介绍

    万次阅读 2016-08-10 23:22:10
    Web大量上的网页集合里存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪、还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。 最简单的文本相似...
  • [039]文本去重、过滤——文本指纹

    千次阅读 2016-08-19 10:51:27
    互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪、还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。 最简单的文本相似性计算方法...
  • 互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。 最简单的文本相似性计算方法...
  • 文本指纹算法和系统简述

    千次阅读 2017-03-06 15:16:06
    【导读】 互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪、还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤,因此需要一个好的...
  • 机器学习第一篇:线性回归算法 1、机器学习主要应用场景 2、机器学习基本概念 ...文本分析场景:新闻的标签提取,文本自动分类和文本关键信息抽取 关系图像法:社交网络关系(SNS)网络关系挖掘和...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

新闻网站的聚类